whoop_workouts
Individual logged activities. Use this for per-session questions; for total daily exertion use whoop_cycles instead.
What it returns
| Field | Meaning |
|---|---|
| Sport | WHOOP's sport name for the activity. |
| Strain | 0–21 logarithmic strain score for the session. |
| Duration | Derived from start and end timestamps. |
| Avg / max heart rate | Beats per minute. |
| Calories | Converted from WHOOP's kilojoules (÷ 4.184). |
| Distance | Kilometres, where the activity recorded it. |
Parameters
| Name | Type | Description |
|---|---|---|
days | integer | Lookback window in days, counted back from now. Ignored when `start` is given. |
start | string | Start of the range, ISO-8601 (e.g. '2026-08-01' or '2026-08-01T00:00:00Z'). Overrides `days`. |
end | string | End of the range, ISO-8601. Defaults to now. |
Pass either days or an explicit start/end pair. start wins if both are given.
Example
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.
## 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._
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_nameis the v2 field. The old numericsport_idis deprecated.
Call it directly
The endpoint is plain JSON-RPC, so you can test without any client:
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.