whoop-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@whoop-mcphow was my sleep last night?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
WHOOP MCP Server
An MCP (Model Context Protocol) server that provides Claude Desktop with access to your WHOOP fitness tracker data, including recovery scores, sleep metrics, and strain data.
Features
Recovery Data: Get your daily recovery score, HRV, resting heart rate, and SpO2
Sleep Analysis: View sleep duration, stages (light/deep/REM), efficiency, and performance
Recovery Trends: Track your recovery over the past 7-14 days
Strain Metrics: Monitor daily strain, calories, and heart rate data
Workout History: View recent workouts with sport type, strain, calories, and HR zones
Related MCP server: WHOOP MCP Server
Prerequisites
Python 3.11+
uv package manager
A WHOOP membership and device
WHOOP Developer account (free)
Setup
1. Clone and Install
git clone https://github.com/JasonBates/whoop-mcp-server.git
cd whoop-mcp-server
uv sync2. Create WHOOP Developer App
Go to developer.whoop.com
Sign in with your WHOOP account
Create a new application:
App Name: "WHOOP MCP" (or your preference)
Redirect URI:
http://localhost:8080/callback
Note your Client ID and Client Secret
3. Configure Credentials
Create a .env file from the example:
cp .env.example .envEdit .env and add your credentials:
WHOOP_CLIENT_ID=your_client_id_here
WHOOP_CLIENT_SECRET=your_client_secret_here4. Authorize with WHOOP
Run the token acquisition script:
uv run python scripts/get_tokens.pyThis will:
Open your browser to log in to WHOOP
Request authorization for the app
Save your access and refresh tokens to
.envTest the API connection
5. Configure Claude Desktop
Add the server to your Claude Desktop config at:
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"whoop": {
"command": "uv",
"args": [
"--directory",
"/path/to/whoop-mcp-server",
"run",
"python",
"-m",
"whoop_mcp"
]
}
}
}Replace /path/to/whoop-mcp-server with the full path where you cloned the repository.
6. Restart Claude Desktop
Quit and reopen Claude Desktop. You should see "whoop" in the MCP servers list.
Usage
Once configured, you can ask Claude things like:
"What's my WHOOP status today?" (uses the combined summary)
"How did I sleep last night?"
"Show me my recovery trend for the past week"
"What's my current strain?"
"Show me my recent workouts"
Available Tools
Tool | Description |
| Today's recovery, sleep, and strain in one call |
| Sleep history (default 7 days, unlimited) |
| Recovery history (default 7 days, unlimited) |
| Workout history (default 5, unlimited) |
Troubleshooting
"Authentication error: No access token found"
Run the token script: uv run python scripts/get_tokens.py
Tokens expired
The server automatically refreshes tokens, but if you encounter persistent auth errors, re-run the token script.
Multiple machines
Each machine must authorize separately with WHOOP. You cannot copy .env tokens between machines because the first API call on each session refreshes the token, which invalidates it on other machines. Run uv run python scripts/get_tokens.py on each machine you want to use.
Rate limiting
WHOOP API allows 100 requests/minute and 10,000/day. Normal usage is unlikely to hit these limits.
Development
# Test with MCP Inspector
npx @modelcontextprotocol/inspector uv run python -m whoop_mcpLicense
MIT
Available Tools
4 toolsget_recovery_trendA
Get recovery scores for the last N days.
Args: days: Number of days to look back (default: 7, no limit)
Shows the trend of your recovery to help identify patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It states 'Get recovery scores', indicating a read-only operation. However, it does not explicitly confirm no side effects or mention permissions, though the nature is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff. The first sentence states the purpose, the second explains the parameter, and the third provides outcome context. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one optional parameter, no annotations, output schema present), the description covers purpose, parameter, and outcome. No gaps are apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description compensates fully. It explains the 'days' parameter as 'Number of days to look back (default: 7, no limit)', adding meaning beyond the schema's type and default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get recovery scores' and 'Shows the trend of your recovery', specifying the verb (get) and resource (recovery scores). It distinguishes from siblings like get_sleep_trend and get_workouts, which target different health metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for trend analysis with 'to help identify patterns', but it does not explicitly state when to use this tool versus alternatives (e.g., get_today_summary might offer a snapshot). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleep_trendA
Get sleep data for the last N days.
Args: days: Number of days to look back (default: 7, no limit)
Shows sleep duration, efficiency, and performance trends.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses it shows sleep duration, efficiency, and performance trends. Adequate for a simple read operation, though could mention data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences plus parameter doc. No fluff, front-loaded with purpose, efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values are covered. Description mentions key output fields (duration, efficiency, trends). Complete for a one-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% coverage, but description adds 'no limit' to the days parameter, clarifying scope beyond the default value. Essential behavioral detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it gets sleep data for last N days, specifying the resource (sleep data) and action (get). Distinguishes from siblings like get_recovery_trend by focusing on sleep trends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides parameter details but no explicit when-to-use or when-not-to-use compared to siblings. Implied usage is for sleep trends over days, but no guidance on alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_today_summaryA
Get today's complete WHOOP status: recovery, sleep, and strain in one call.
This is the recommended daily check-in tool. Returns:
Recovery score with HRV and resting heart rate
Last night's sleep duration and quality
Current strain level and calories burned
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the returned data categories (recovery score, sleep duration, strain, etc.) without needing further detail, since no annotations are present. Could mention that it is a read-only operation, but the description adequately implies safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: first defines purpose, second recommends usage, third lists outputs. No wasted words; every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema, the description provides sufficient context about what the tool returns. It covers the main use case completely for a daily check-in.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has zero parameters and schema coverage is 100%. Baseline 4 for no parameters; description adds no parameter info but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' and resource 'today's complete WHOOP status: recovery, sleep, and strain in one call.' It clearly distinguishes from sibling tools like 'get_recovery_trend' and 'get_sleep_trend' which focus on individual metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'This is the recommended daily check-in tool,' providing clear context for when to use it. Does not explicitly list when not to use or name alternatives, but the parenthetical mention of siblings implies those for detailed trends.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workoutsA
Get recent workouts with strain and heart rate data.
Args: limit: Number of workouts to return (default: 5, no limit)
Shows your recent activities including sport type, strain, duration, calories, and heart rate zones.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It does not explicitly state that this is a read-only operation, nor does it disclose any side effects, authorization requirements, or rate limits. While the nature of retrieving recent workouts suggests no side effects, the lack of explicit confirmation reduces transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences plus an args section, all front-loaded with the core action. Every sentence adds value without redundancy. The structure is clear and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, known return fields), the description covers the essential aspects. However, it does not specify ordering (e.g., most recent first) or any pagination details. An output schema exists, so return type details are not required, but missing ordering constraints could cause ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has only the 'limit' parameter with a default value of 5. The description adds meaning by explaining it as 'Number of workouts to return (default: 5, no limit)' and clarifies that omitting the parameter returns 5 workouts. Since schema description coverage is 0%, this additional context is valuable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get recent workouts with strain and heart rate data.' and lists the specific data fields returned (sport type, strain, duration, calories, heart rate zones). This distinguishes it from sibling tools like get_recovery_trend, get_sleep_trend, and get_today_summary, which focus on different health metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus siblings. The description implies it is for retrieving workout data, but does not state when not to use it or mention alternatives. For example, it could specify that for daily summaries or recovery data, one should use the respective sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct aspect of WHOOP data: recovery trend, sleep trend, today's summary, and workouts. There is no overlap between the tools.
All tools follow a consistent verb_noun pattern (get_recovery_trend, get_sleep_trend, get_today_summary, get_workouts), making it easy to predict tool names.
With 4 tools covering recovery, sleep, daily summary, and workouts, the set is well-scoped for a health data summary server. The number is appropriate for the domain.
Core daily metrics are covered, but missing historical strain trend, detailed HRV or heart rate data retrieval, and other WHOOP features like cycle tracking. Some gaps exist.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Your WHOOP data in the assistant, read-only: recovery, sleep, strain, workouts, cycles and body meas
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceConnects WHOOP fitness data to Claude Desktop, enabling natural language queries about workouts, recovery, sleep patterns, and health metrics while keeping data secure and private.
- AlicenseAqualityCmaintenanceGives Claude access to your WHOOP health data including recovery, sleep, workouts, cycles, body measurements, and profile via the WHOOP Developer API.714MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude to read your Whoop recovery, sleep, cycle, and workout data through natural language queries.163MIT
- AlicenseNot gradedqualityDmaintenanceConnects WHOOP fitness and recovery data to Claude Desktop, enabling users to query workouts, sleep, recovery, and trends through natural language.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/JasonBates/whoop-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server