whoop_cycles
Whole-day physiological cycles — wake to wake. This is the right number for weekly training load, because it counts everything, not just what you logged as a workout.
What it returns
| Field | Meaning |
|---|---|
| Day strain | 0–21 total exertion for the cycle. |
| Avg / max heart rate | Across the whole cycle. |
| Calories | Converted from kilojoules. |
| State | Closed, or still in progress if you haven't slept yet. |
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
Average Day Strain over 28 days is 12.8, up from 11.2 the four weeks before — about a 14% increase. The build is uneven though: week 3 jumped to 15.1 and your recovery in week 4 averaged 54%, its lowest of the block. That's the pattern that usually precedes a bad week.
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 daily cycles — 2026-08-07 to 2026-08-14 (7 cycles)
| Day | Day Strain | Avg HR | Max HR | kcal | State |
|---|---|---|---|---|---|
| 2026-08-12 | 13.4 | 78 | 164 | 2810 | closed |
| 2026-08-13 | 9.1 | 66 | 121 | 2140 | closed |
| 2026-08-14 | 11.8 | 71 | 158 | 2530 | in progress |
**Period average:** Day Strain 12.8
_Data by WHOOP._
Questions this answers
- “What's my weekly training load been?”
- “Which days had high strain but no logged workout?”
- “Is my average Day Strain higher this month than last?”
- “Show me every day above strain 18 this year.”
Notes and gotchas
- A cycle runs wake-to-wake, so its start is rarely midnight and one calendar day can hold zero or two cycles. When it holds two, the wake time tells them apart; when it holds none, the tool names the date and says a neighbouring cycle covers it.
- Aggregate by cycle, not by date — that's the whole reason this tool exists separately from whoop_workouts.
- Today's cycle shows as in progress until you next sleep.
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_cycles",
"arguments": {
"days": 7
}
}
}'
Tool description the model sees
WHOOP physiological cycles — one per wake-to-wake day — with total day strain, average and max heart rate, and calories. Call this when the user asks about overall daily strain, weekly training load, or how much total exertion a day held, as opposed to a single workout.
Descriptions say when to call a tool, not just what it does — that trigger wording is what models actually route on.
Use whoop_cycles 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.