MCP tool

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

FieldMeaning
Day strain0–21 total exertion for the cycle.
Avg / max heart rateAcross the whole cycle.
CaloriesConverted from kilojoules.
StateClosed, or still in progress if you haven't slept yet.

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

YouHow's my training load trending?
Assistant → whoop_cycles({ days: 28 })
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.

markdown returned to the model
## 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._
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
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.