MCP tool

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

FieldMeaning
Recovery0–100%. WHOOP's headline score for the day.
Resting heart rateBeats 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 temperatureDegrees Celsius. Deviation often precedes illness.
Calibration flagWHOOP marks early days while it learns your baseline.

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

YouMy recovery has been bad all week. What's going on?
Assistant → whoop_recovery({ days: 7 })
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.

markdown returned to the model
## 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._
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 calibrating and the score is not yet meaningful.

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_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.