whoop-tracker-mcp-server
Click on "Deploy 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-tracker-mcp-serverwhat was my recovery score this morning?"
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
A lightweight MCP (Model Context Protocol) server for integrating with the Whoop API v2. Built for use with Claude Desktop and other MCP clients.
Features
๐ OAuth 2.0 authentication with Whoop
๐ Automatic token refresh
๐ Access to all major Whoop data endpoints:
User profile and body measurements
Sleep, recovery, and cycle data
Workout information
๐ณ Docker support for easy deployment
๐พ Persistent token storage
Related MCP server: WHOOP MCP Server
Quick Start
Prerequisites
Node.js >= 22.0.0 (for Method 1) OR Docker (for Method 2)
pnpm >= 10.0.0 (for Method 1 only)
Setup for Claude Desktop
Choose one of the two methods below to integrate with Claude Desktop. The MCP server runs as part of Claude Desktop - you don't need to start it separately.
Method 1: Using Node.js
Clone and install:
git clone https://github.com/alacore/whoop-tracker-mcp-server.git cd whoop-tracker-mcp-server pnpm installBuild the server:
pnpm run buildConfigure Claude Desktop - see Claude Desktop Configuration section below
Method 2: Using Docker
Clone the repository:
git clone https://github.com/alacore/whoop-tracker-mcp-server.git cd whoop-tracker-mcp-serverBuild Docker image:
docker build -t whoop-mcp .Configure Claude Desktop - see Claude Desktop Configuration section below
Development Mode (Optional)
For testing the MCP server independently or during development:
Configure environment:
cp .env.example .envEdit
.envwith your Whoop OAuth credentials:WHOOP_CLIENT_ID=your_whoop_client_id WHOOP_CLIENT_SECRET=your_whoop_client_secret WHOOP_REDIRECT_URI=http://localhost:3000/callback WHOOP_SCOPES=offline read:profile read:body_measurement read:cycles read:recovery read:sleep read:workoutRun in development mode:
pnpm run devNote: This runs the server standalone for testing. For actual use with Claude Desktop, follow the configuration instructions below.
Usage
Claude Desktop Configuration
Method 1: Direct Node.js Execution
Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"whoop": {
"command": "node",
"args": ["/path/to/whoop-tracker-mcp-server/dist/mcp-standalone.js"],
"env": {
"WHOOP_CLIENT_ID": "your_client_id",
"WHOOP_CLIENT_SECRET": "your_client_secret",
"WHOOP_REDIRECT_URI": "http://localhost:3000/callback",
"WHOOP_SCOPES": "offline read:profile read:body_measurement read:cycles read:recovery read:sleep read:workout"
}
}
}
}Prerequisites:
Node.js >= 22.0.0 installed
Built server (
pnpm run build)Replace
/path/to/whoop-tracker-mcp-serverwith your actual project path
Note: The offline scope in WHOOP_SCOPES is required to receive a refresh token during the OAuth2 flow, enabling automatic token renewal without re-authentication.
Method 2: Docker Container
First, build the Docker image:
# Build the Docker image
docker build -t whoop-mcp .Then add to your Claude Desktop configuration:
{
"mcpServers": {
"whoop": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"WHOOP_CLIENT_ID=your_client_id",
"-e",
"WHOOP_CLIENT_SECRET=your_client_secret",
"-e",
"WHOOP_REDIRECT_URI=http://localhost:3000/callback",
"-e",
"WHOOP_SCOPES=offline read:profile read:body_measurement read:cycles read:recovery read:sleep read:workout",
"-v",
"${HOME}/.whoop-mcp:/home/node/.whoop-mcp",
"whoop-mcp"
]
}
}
}Prerequisites:
Docker installed and running
Built Docker image (
docker build -t whoop-mcp .)
Notes:
The
-vflag mounts a local directory for persistent token storage across container restarts. First create the directory on your host machine (e.g.,mkdir -p ~/.whoop-mcp), then mount it using the-vflag - this is where auth tokens will be storedThe
offlinescope inWHOOP_SCOPESis required to receive a refresh token during the OAuth2 flow, enabling automatic token renewal without re-authentication
Testing Your Setup
To test either configuration:
Restart Claude Desktop after updating the configuration
In Claude, use the Whoop tools:
Start with
whoop_auth_urlto begin authenticationFollow the OAuth flow to authorize
Use other tools like
whoop_get_profileto verify access
Available MCP Tools
Authentication
whoop_auth_url - Generate OAuth authorization URL
whoop_exchange_token - Exchange auth code for access token
whoop_refresh_token - Refresh expired access token
Data Access
whoop_get_profile - Get user profile
whoop_get_body_measurement - Get body measurements
whoop_get_cycles - Get physiological cycles
whoop_get_recovery - Get recovery data
whoop_get_sleep - Get sleep data
whoop_get_workouts - Get workout data
Authentication Flow
Use
whoop_auth_urlto get authorization URLOpen URL in browser and authorize
Copy the
codeparameter from callback URLUse
whoop_exchange_tokenwith the codeTokens are automatically saved and refreshed
Development
# Development with hot reload
pnpm run dev
# Build for production
pnpm run build
# Run built version
pnpm startLicense
MIT
Available Tools
5 toolswhoop_get_cycle_by_idB
Get a specific cycle by ID
| Name | Required | Description | Default |
|---|---|---|---|
| cycleId | Yes | Cycle ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must convey behavior. It only states a simple read operation without mentioning error handling, authentication, or rate limits. Minimal disclosure.
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?
Extremely concise with one sentence. Front-loads the verb. However, could be slightly more descriptive about the return 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?
For a simple tool, it is adequate but fails to describe the return value or any constraints. With no output schema, more context about what the cycle contains would be helpful.
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 100% as the single parameter 'cycleId' is described. The description adds no additional meaning beyond what the schema already provides.
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 a specific cycle by ID' with a specific verb and resource. It distinguishes from sibling tools that focus on recovery, sleep, and workouts.
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 guidance on when to use this tool versus alternatives, such as searching for cycles or using related recovery/sleep tools. Lacks context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_get_recoveryC
Get recovery data for a date range
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End datetime (ISO 8601) | |
| limit | No | Limit on number of recoveries (max 25) | |
| start | No | Start datetime (ISO 8601) | |
| nextToken | No | Token for pagination |
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 omits details about pagination (nextToken), the maximum limit of 25, or that multiple recoveries may be returned. The agent gains little insight into side effects or constraints.
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 a single sentence, concise and front-loaded. While it could include more context without becoming verbose, it wastes no words.
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 four parameters, no output schema, and no annotations, the description is insufficient. It does not explain pagination, limit defaults, or the output format, leaving significant gaps for an agent.
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 100%, with all four parameters described in the schema. The description adds no additional meaning beyond what the schema already includes, so it meets the baseline expectation.
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 the verb 'get' and resource 'recovery data', specifying filtering by date range. However, it does not distinguish this tool from siblings like whoop_get_recovery_for_cycle, which also recovers data but for a specific cycle.
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 guidance on when to use this tool versus alternatives. It does not mention that this is for date-range queries while cycle-specific tools exist, nor any prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_get_recovery_for_cycleA
Get recovery for a specific cycle
| Name | Required | Description | Default |
|---|---|---|---|
| cycleId | Yes | Cycle ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It correctly implies a read-only operation but does not disclose behaviors like error handling, return format, or rate limits. The description is minimal but not misleading.
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 a single, front-loaded sentence that efficiently conveys the tool's purpose. There is no extraneous text, and every word contributes to understanding.
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 required parameter, no output schema), the description is adequate but leaves room for improvement. It would benefit from mentioning the return value or typical usage context, as there is no output schema to supplement.
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 description coverage is 100% for the single parameter 'cycleId', which is adequately described in the schema. The tool description adds no additional meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
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 the action ('Get') and the resource ('recovery for a specific cycle'). It is specific and distinct from sibling tools like 'whoop_get_recovery' (which may not be cycle-specific) and 'whoop_get_cycle_by_id' (which gets cycle info, not recovery).
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 provides no guidance on when to use this tool versus alternatives such as 'whoop_get_recovery' or other siblings. No context about prerequisites or preferred scenarios is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_get_sleep_for_cycleC
Get sleep for a specific cycle
| Name | Required | Description | Default |
|---|---|---|---|
| cycleId | Yes | Cycle ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and the description does not disclose any behavioral traits such as side effects, permissions, or rate limits. It only restates the tool's purpose.
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 very short (4 words) and to the point, but it sacrifices useful details. It is acceptable for a simple tool but could be more informative.
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?
With no output schema and minimal description, the tool lacks context about return values, required permissions, or typical use cases. Incomplete for a data retrieval 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 coverage is 100% with a basic description of 'Cycle ID'. The tool description adds no additional meaning beyond the schema, so baseline score of 3 applies.
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 the verb 'get' and resource 'sleep for a specific cycle', distinguishing it from siblings like whoop_get_cycle_by_id and whoop_get_recovery_for_cycle. However, it could elaborate on what sleep data is returned.
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 guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. It lacks any usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_get_workoutsC
Get workout data for a date range
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | End datetime (ISO 8601) | |
| limit | No | Limit on number of workouts (max 25) | |
| start | No | Start datetime (ISO 8601) | |
| nextToken | No | Token for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as pagination (nextToken), rate limits, or whether it is read-only. Minimal transparency beyond the implied read operation.
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 a single sentence, concise and to the point. However, it is somewhat terse given the tool has 4 parameters and pagination, so a slightly more structured description would improve clarity.
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?
No output schema is provided, and the description does not indicate what data fields are returned or how pagination works. For a tool with multiple parameters and pagination, this is insufficient context for an agent to use effectively.
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 100% with descriptions for all 4 parameters. The tool description adds no additional meaning beyond what the schema provides, so baseline score of 3 is appropriate.
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 the tool retrieves workout data for a date range, with a specific verb and resource. While it doesn't explicitly distinguish from siblings, siblings are for different entities (cycles, recovery, sleep), so purpose is clear.
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 guidance on when to use this tool versus alternatives. Sibling tools have different purposes, but no explicit when-to-use or when-not-to-use instructions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v1.0.1- First observed
whoop_get_cycle_by_id - First observed
whoop_get_recovery - First observed
whoop_get_recovery_for_cycle - First observed
whoop_get_sleep_for_cycle - First observed
whoop_get_workouts
TDQS
Scored across 5 tools
Tools are mostly distinct: cycles, recovery (two variants but scoped differently), sleep, and workouts. The two recovery tools could cause minor confusion, but descriptions clarify date range vs. cycle-specific.
All tools follow a consistent 'whoop_get_<resource>' pattern with qualifiers like 'by_id' or 'for_cycle'. No mixed conventions or irregular verbs.
With 5 tools covering core fitness metrics (cycles, recovery, sleep, workouts), the count is well-scoped and not excessive or sparse for the server's apparent purpose.
The set covers key read operations, but notably lacks a tool to list cycles (e.g., 'get_cycles'), which agents would need to obtain cycle IDs for other tools. This gap could hinder some workflows.
Maintenance
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
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Connect your Oura Ring account securely in minutes. Enable authorized access to your sleep, activiโฆ
Related MCP Servers
- AlicenseBqualityFmaintenanceEnables access to WHOOP fitness and health data through all WHOOP v2 API endpoints. Supports OAuth 2.0 authentication and provides comprehensive access to user profiles, physiological cycles, recovery metrics, sleep analysis, and workout data.16289 npm16MIT
- AlicenseNot gradedqualityFmaintenanceConnects WHOOP fitness data to Claude Desktop, enabling natural language queries about workouts, recovery, sleep patterns, and physiological cycles with secure OAuth authentication and local data storage.289 npm27MIT
- AlicenseAqualityDmaintenanceEnables LLMs to retrieve and analyze sleep, recovery, and physiological cycle data from the WHOOP API. It provides tools for accessing detailed metrics such as strain, HRV, and readiness scores through secure OAuth 2.0 authentication.48 npm1MIT
- FlicenseNot gradedqualityDmaintenanceEnables language models to query cycles, recovery, strain, and workout data from the Whoop API.-