whoop_recovery
WHOOP's daily Recovery score and the physiological signals behind it. This is the tool an assistant reaches for when you ask whether to train hard today.
What it returns
| Field | Meaning |
|---|---|
| Recovery | 0–100%. WHOOP's headline score for the day. |
| Resting heart rate | Beats per minute, measured during sleep. |
| HRV (RMSSD) | Heart-rate variability in milliseconds — the main driver of the recovery score. |
| SpO₂ | Blood oxygen saturation, percent. |
| Skin temperature | Degrees Celsius. Deviation often precedes illness. |
| Calibration flag | WHOOP marks early days while it learns your baseline. |
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
Recovery averaged 62% but the middle of the week was rough — 43% Monday and 38% Tuesday. HRV fell from 94 ms to 51 ms across those two days while resting heart rate rose 9 bpm and skin temperature was up 0.8°C. That combination usually means accumulated load or an infection rather than one poor night. It recovered to 82% by Thursday, so it looks transient.
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 Recovery — 2026-08-07 to 2026-08-14 (7 records)
| Date | Recovery | RHR | HRV | SpO2 | Skin temp | Notes |
|---|---|---|---|---|---|---|
| 2026-08-10 | 43% | 55 bpm | 58 ms | 95% | 34.1°C | |
| 2026-08-11 | 38% | 57 bpm | 51 ms | 95% | 34.2°C | |
| 2026-08-12 | 59% | 51 bpm | 74 ms | 96% | 33.7°C | |
**Period average:** avg Recovery 62% · avg HRV 82 ms · avg RHR 50 bpm
_Data by WHOOP._
Questions this answers
- “Am I recovered enough for intervals today?”
- “Is my HRV trending up over the last month?”
- “Which days this year had recovery under 35%?”
- “Did my resting heart rate change after I stopped drinking?”
Notes and gotchas
- One record per physiological day. A day the strap wasn't worn is absent, not zero.
- Recovery attaches to a cycle, not a calendar date — see whoop_cycles.
- During your first days on WHOOP, records are marked
calibratingand the score is not yet meaningful.
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_recovery",
"arguments": {
"days": 7
}
}
}'
Tool description the model sees
Daily WHOOP recovery scores: recovery percentage, resting heart rate, HRV (RMSSD), blood oxygen, and skin temperature. Call this when the user asks how recovered, rested, or ready to train they are, asks about HRV or resting heart rate, or asks whether they should train hard today. One record per physiological day; a day is missing if the strap was not worn.
Descriptions say when to call a tool, not just what it does — that trigger wording is what models actually route on.
Use whoop_recovery 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.