WHOOP MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| WHOOP_CLIENT_ID | No | Override the saved credentials. Default: from `auth`. | |
| WHOOP_CONFIG_DIR | No | Where credentials and tokens are stored. | ~/.config/whoop-mcp |
| WHOOP_TOKEN_FILE | No | Token file path (use an absolute path). | <config dir>/tokens.json |
| WHOOP_REDIRECT_URI | No | Must match the app's registered URI. | http://localhost:3000/callback |
| WHOOP_CLIENT_SECRET | No | Override the saved credentials. Default: from `auth`. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_recoveryA | Recovery records, newest first. Each has recovery_score (0-100), hrv_rmssd_milli (HRV in ms), resting_heart_rate (bpm), spo2_percentage and skin_temp_celsius. A recovery is scored after the sleep referenced by sleep_id; created_at is when it was scored. Note: the date range is matched against the underlying sleep window, so a range ending on day N also returns the recovery scored on the morning of N+1. Use start/end to select a date range and next_token to page. WHOOP matches the range against the activity's own start/end window. |
| get_sleepA | Sleep records (including naps, flagged by |
| get_sleep_by_idB | A single sleep record by its UUID, e.g. the sleep_id from a recovery record. |
| get_cyclesA | Physiological cycles (one per WHOOP 'day', running from wake-up to the next wake-up), newest first. score.strain is the day strain (0-21); kilojoule is energy burned. The current cycle has no |
| get_cycle_by_idC | A single physiological cycle by its numeric id. |
| get_sleep_for_cycleB | The sleep that closed the given cycle, i.e. the night at the end of that WHOOP day. |
| get_recovery_for_cycleC | The recovery score computed for the given cycle, based on the sleep that preceded it. |
| get_workoutsA | Workout records, newest first. sport_name identifies the activity; score.strain is workout strain (0-21); zone_durations is time in each heart-rate zone in milliseconds; distance and altitude are present only when GPS data was recorded. Use start/end to select a date range and next_token to page. WHOOP matches the range against the activity's own start/end window. |
| get_workout_by_idC | A single workout record by its UUID. |
| get_profileB | The authenticated user's name and email. |
| get_body_measurementsB | The user's height (meters), weight (kilograms) and max heart rate as configured in WHOOP. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 11 tools
The main list tools (get_recovery, get_sleep, get_cycles, get_workouts) are distinct, but the four by_id/relationship tools (get_sleep_by_id, get_cycle_by_id, get_sleep_for_cycle, get_recovery_for_cycle) have subtle boundaries, particularly the cycle-relationship pair versus the ID lookups, risking misselection.
Most tools follow a consistent get_noun pattern, with get_sleep_by_id and get_workout_by_id deviating only by adding an _by_id suffix. This is a minor, readable deviation rather than a true inconsistency.
Eleven tools are well-scoped for WHOOP's core domains (profile, recovery, sleep, cycles, workouts, body), with relationship helpers earning their place. Nothing feels excessive or thin.
Read/list coverage is strong across all main resources, including relationship helpers, but the surface is read-only, with no create/update/delete and no explicit pagination or error tools. Minor gaps agents can work around.