MCP tool

whoop_workouts

Individual logged activities. Use this for per-session questions; for total daily exertion use whoop_cycles instead.

What it returns

FieldMeaning
SportWHOOP's sport name for the activity.
Strain0–21 logarithmic strain score for the session.
DurationDerived from start and end timestamps.
Avg / max heart rateBeats per minute.
CaloriesConverted from WHOOP's kilojoules (÷ 4.184).
DistanceKilometres, where the activity recorded it.

Parameters

NameTypeDescription
daysintegerLookback window in days, counted back from now. Ignored when `start` is given.
startstringStart of the range, ISO-8601 (e.g. '2026-08-01' or '2026-08-01T00:00:00Z'). Overrides `days`.
endstringEnd of the range, ISO-8601. Defaults to now.

Pass either days or an explicit start/end pair. start wins if both are given.

Example

YouWhat was my hardest session in the last month?
Assistant → whoop_workouts({ days: 30 })
Your hardest was the 2026-07-28 running session: strain 17.4 over 1h 38m, average heart rate 162 and max 184, roughly 1,240 kcal across 21.4 km. Second hardest was a cycling session at strain 15.1. Across the month you logged 19 sessions totalling 21h 14m.

Sample output

Tools return markdown, not JSON — it costs roughly a third of the tokens and models reason over tables more reliably than nested objects.

markdown returned to the model
## WHOOP Workouts — 2026-07-31 to 2026-08-14 (4 workouts)

| Date | Sport | Strain | Duration | Avg HR | Max HR | kcal | Distance |
|---|---|---|---|---|---|---|---|
| 2026-08-03 | Running | 14.2 | 1h 05m | 154 | 176 | 812 | 13.10 km |
| 2026-08-06 | Weightlifting | 9.7 | 0h 52m | 121 | 158 | 396 | — |
| 2026-08-09 | Cycling | 15.1 | 2h 11m | 141 | 172 | 1420 | 62.40 km |

**3 sessions**, total Strain 39.0

_Data by WHOOP._
Data by WHOOP

Questions this answers

  • “What was my hardest session this month?”
  • “Compare my average heart rate on easy runs versus tempo runs.”
  • “How many hours did I train in the last four weeks?”
  • “Did my max heart rate on the bike change over the season?”

Notes and gotchas

  • Default window is 14 days — longer than the other tools because training questions usually span more than a week.
  • WHOOP reports energy in kilojoules; we convert to kcal so the numbers match the app.
  • sport_name is the v2 field. The old numeric sport_id is deprecated.

Call it directly

The endpoint is plain JSON-RPC, so you can test without any client:

curl
curl -s https://fitnesspeak.app/mcp \
  -H "Authorization: Bearer fp_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "whoop_workouts",
         "arguments": {
           "days": 7
         }
       }
     }'

Tool description the model sees

Individual WHOOP workout activities: sport, strain, duration, average and max heart rate, calories, and distance. Call this when the user asks what training they did, how hard a session was, or wants to compare workouts over time. For whole-day strain rather than per-session strain, use whoop_cycles instead.

Descriptions say when to call a tool, not just what it does — that trigger wording is what models actually route on.

Use whoop_workouts in your assistant

14-day free trial. Card required so there's no second signup at the end; cancel before day 14 and you're charged nothing.