Skip to main content
Glama
cbellbell-spin

Whoop MCP Server

README.md
# Whoop MCP Server

MCP server that exposes your Whoop fitness data (recovery, sleep, strain, workouts) to Claude for use as a daily training coach.

## Prerequisites

- Python 3.10+
- A [Whoop Developer](https://developer.whoop.com) account with a registered application
- Your Whoop app's Client ID and Client Secret

## Whoop Developer Dashboard Setup

1. Go to [developer.whoop.com](https://developer.whoop.com) and sign in
2. Create a new application
3. Set the **Redirect URI** to: `http://localhost:8080/callback`
4. Enable these scopes: `read:recovery`, `read:cycles`, `read:sleep`, `read:profile`, `read:body_measurement`
   - Note: `read:workout` and `offline` may not be available on all developer apps. The server handles missing scopes gracefully.
5. Note your **Client ID** and **Client Secret**

## Installation

```bash
cd whoop-mcp
pip install -r requirements.txt
```

## Authorization (One-Time Setup)

Export your app credentials and run the setup script:

```bash
export WHOOP_CLIENT_ID="your-client-id"
export WHOOP_CLIENT_SECRET="your-client-secret"
python scripts/setup_auth.py
```

This opens a browser to Whoop's authorization page. After you approve, tokens are encrypted and stored at `~/.whoop_mcp/`. If the `offline` scope was granted, tokens refresh automatically. Otherwise, re-run this script when the token expires.

## Claude Desktop / Cowork MCP Config

Add this to your Claude MCP configuration:

```json
{
  "mcpServers": {
    "whoop": {
      "command": "python",
      "args": ["/absolute/path/to/whoop-mcp/src/whoop_server.py"],
      "env": {
        "WHOOP_CLIENT_ID": "your-client-id",
        "WHOOP_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}
```

Replace `/absolute/path/to/whoop-mcp` with the actual path on your machine.

## Available Tools

| Tool | Description |
|------|-------------|
| `whoop_check_auth` | Verify tokens are valid and not expired |
| `whoop_get_latest_recovery` | Most recent recovery score, HRV, resting HR, SpO2 |
| `whoop_get_recovery_range` | Recovery data for a date range |
| `whoop_get_latest_sleep` | Last sleep session with stage breakdown |
| `whoop_get_sleep_range` | Sleep data for a date range |
| `whoop_get_latest_strain` | Current cycle strain, avg/max HR, kilojoules |
| `whoop_get_strain_range` | Strain over past N days with average |
| `whoop_get_workouts` | Workouts with sport ID, strain, HR zones |
| `whoop_get_profile` | User profile and body measurements |
| `whoop_get_training_summary` | Aggregated coaching snapshot (start here) |

## Example Prompts

Once connected, you can ask Claude things like:

- "What was my recovery yesterday?"
- "How much strain did I accumulate last week?"
- "Am I trending toward overtraining?"
- "How has my HRV changed over the past two weeks?"
- "What were my sleep stages last night?"
- "Compare my strain to my recovery over the past 7 days."
- "Should I do a hard workout today?"

## Training Coach Workflow

Start each session by calling `whoop_get_training_summary` for an overview of recovery status, recent strain load, sleep quality, and a training readiness assessment.

## Token Storage

Tokens are stored encrypted at `~/.whoop_mcp/`:
- `.encryption_key` — Fernet encryption key (chmod 600)
- `tokens.enc` — Encrypted OAuth tokens (chmod 600)
- Directory permissions: chmod 700

If token refresh fails, re-run `python scripts/setup_auth.py`.

Maintenance

ActivityInactive
ResponsivenessNo issues