The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Whoop MCP Server listing page.
MCP server for the official Whoop API v2, written in Go. Exposes cycles, recovery, sleep, workouts, and profile data as MCP tools.
All tools return JSON. Record shapes are the unmodified Whoop API v2 objects, so every field the API exposes is available to the model.
| Tool | Inputs | Returns |
|---|---|---|
get_profile | — | Single object: user_id, email, first_name, last_name |
get_body_measurement | — | Single object: height_meter, weight_kilogram, max_heart_rate |
get_cycles | start_date, end_date, limit (all optional) | Array of cycle records — one per physiological day: start/end, score_state, and score with day strain, kilojoule, average_heart_rate, max_heart_rate |
get_latest_cycle | — | Single cycle record (the current/most recent day) |
get_recoveries | start_date, end_date, limit (all optional) | Array of recovery records — one per sleep: cycle_id, sleep_id, and score with recovery_score (0–100), resting_heart_rate, hrv_rmssd_milli, spo2_percentage, skin_temp_celsius |
get_recovery_for_cycle | cycle_id (required) | Single recovery record for that cycle |
get_sleep | start_date, end_date, limit (all optional) | Array of sleep records: start/end, nap flag, and score with per-stage durations (light/SWS/REM/awake, in ms), respiratory_rate, sleep_performance_percentage, sleep_efficiency_percentage, sleep-need breakdown |
get_workouts | start_date, end_date, limit (all optional) | Array of workout records: sport_name, start/end, and score with workout strain, heart rates, kilojoule, distance_meter, altitude_gain_meter, time-in-zone durations (zone_durations, ms per HR zone) |
get_average_strain | days (optional, default 7) | Computed aggregate: {days, cycles_counted, average_strain} |
check_auth_status | — | {authenticated: bool} plus the profile on success or an error string on failure |
Notes:
YYYY-MM-DD; end_date is inclusive (internally mapped to the start of the next day, per the API's exclusive end semantics).next_token until limit records (default 25, max 100) are collected.get_average_strain for the built-in strain average).score_state can be SCORED, PENDING_SCORE, or UNSCORABLE — score is only present when SCORED.At developer.whoop.com, create an app with:
http://localhost:8719/callbackread:cycles, read:recovery, read:sleep, read:workout, read:profile, read:body_measurement, offlineNote the client ID and client secret.
Homebrew:
Or download a prebuilt binary from Releases, or:
Or build from source:
Opens a browser for the OAuth flow; the token is saved to
~/Library/Application Support/whoop-mcp/token.json (macOS) and refreshed
automatically thereafter (rotating refresh tokens).
Or for Claude Desktop, in claude_desktop_config.json: