whoop-mcp
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-mcpWhat 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 Model Context Protocol (MCP) server for the WHOOP API. Gives any MCP-compatible client (Claude Code, Claude Desktop, etc.) read access to your WHOOP biometric data -- recovery, sleep, strain, workouts, and more.
Features
Full coverage of the WHOOP Developer API v2
OAuth 2.0 authentication with token refresh
Sleep analysis (stages, efficiency, respiratory rate)
Recovery scores (HRV, resting heart rate, SpO2, skin temp)
Strain and cycle data
Workout tracking with heart rate zones
Pagination support for all collection endpoints
TypeScript with full type definitions
Related MCP server: whoop-mcp-server
Prerequisites
Node.js 18+
WHOOP account with an active membership
WHOOP Developer App -- register at developer.whoop.com
Quick Start
1. Clone and install
git clone https://github.com/AaronRoeF/whoop-mcp-server.git
cd whoop-mcp-server
npm install2. Register a WHOOP Developer App
Go to developer.whoop.com
Create a new application
Set the redirect URI to
http://localhost:3000/callbackNote your Client ID and Client Secret
3. Configure environment
cp env.example .envEdit .env with your credentials:
WHOOP_CLIENT_ID=your_client_id
WHOOP_CLIENT_SECRET=your_client_secret
WHOOP_REDIRECT_URI=http://localhost:3000/callback4. Build
npm run build5. Authenticate with WHOOP
npm run authThis starts a local web server, opens your browser, and walks you through the WHOOP OAuth flow. On success, tokens are saved to whoop-tokens.json (gitignored).
6. Add to Claude Code
Add to your ~/.claude.json:
{
"mcpServers": {
"whoop": {
"command": "node",
"args": ["/absolute/path/to/whoop-mcp-server/start-mcp-server.js"],
"cwd": "/absolute/path/to/whoop-mcp-server"
}
}
}Or for Claude Desktop, add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"whoop": {
"command": "node",
"args": ["/absolute/path/to/whoop-mcp-server/start-mcp-server.js"],
"cwd": "/absolute/path/to/whoop-mcp-server"
}
}
}The start-mcp-server.js script automatically loads saved tokens, refreshes them if expired, and starts the MCP server.
Available Tools
User
Tool | Description |
| Get profile info (name, email) for the authenticated user |
| Get height, weight, and max heart rate |
| Revoke the current access token |
Cycles
Tool | Description |
| Get a specific physiological cycle by ID |
| Get all cycles (paginated, with date filters) |
| Get sleep data associated with a specific cycle |
Recovery
Tool | Description |
| Get recovery records (paginated, with date filters) |
| Get recovery data for a specific cycle |
Sleep
Tool | Description |
| Get a specific sleep record by ID |
| Get sleep records (paginated, with date filters) |
Workouts
Tool | Description |
| Get a specific workout record by ID |
| Get workout records (paginated, with date filters) |
OAuth
Tool | Description |
| Get the OAuth authorization URL |
| Exchange an authorization code for an access token |
| Refresh the access token using a refresh token |
| Manually set the access token for API calls |
OAuth Setup Details
WHOOP uses OAuth 2.0. The flow works like this:
Register your app at developer.whoop.com and set the redirect URI to
http://localhost:3000/callbackRun
npm run auth-- this starts a local server and opens the WHOOP authorization pageAuthorize the app -- log in to your WHOOP account and grant access
Tokens are saved automatically to
whoop-tokens.json
Access tokens expire after ~1 hour. The start-mcp-server.js script handles automatic refresh on startup. If refresh fails, re-run npm run auth.
Required OAuth Scopes
The server requests these scopes:
read:recoveryread:cyclesread:workoutread:sleepread:profileread:body_measurement
Pagination
Collection endpoints accept these optional parameters:
Parameter | Type | Description |
| number | Max records to return (up to 25) |
| string | Return records after this time (ISO 8601) |
| string | Return records before this time (ISO 8601) |
| string | Pagination token from previous response |
Project Structure
src/
index.ts Entry point
mcp-server.ts MCP server with tool definitions and handlers
whoop-api.ts WHOOP API client (OAuth + all endpoints)
types.ts TypeScript type definitions
auth-app.js Local OAuth web server for initial authentication
start-mcp-server.js MCP server launcher with auto token refresh
env.example Environment variable templateDevelopment
npm run build # Compile TypeScript
npm start # Run the compiled server
npm run dev # Run with tsx (hot reload)
npm run auth # Run the OAuth authentication flow
npm run start-mcp # Start MCP server with saved tokensLicense
MIT -- see LICENSE for details.
Acknowledgments
WHOOP Developer Platform for the API
Model Context Protocol for the MCP specification
Available Tools
16 toolswhoop-exchange-code-for-tokenB
Exchange authorization code for access token
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Authorization code from OAuth callback |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description only says 'exchange' with no details on side effects, error conditions, token storage, or idempotency. This insufficiently informs the agent.
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 extremely short and front-loaded, but it is underspecified. While it is concise, it lacks necessary details to be fully effective.
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 lack of an output schema, the description should clarify the return value (e.g., access token details). It does not mention error handling, token lifetime, or what the agent should do with the result. The tool is simple but the description is incomplete.
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 single parameter. The description adds no extra meaning beyond what the schema already provides for the parameter. Baseline 3 is appropriate as the schema does most of the work.
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 'exchange' and the resource 'authorization code for access token', which precisely defines the tool's function and distinguishes it from sibling tools like 'whoop-get-authorization-url' and 'whoop-refresh-token'.
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 the tool is used after obtaining an authorization code, but it does not explicitly state when to use it versus alternatives or provide any exclusion criteria. The usage context is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-authorization-urlB
Get the authorization URL for OAuth flow
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must provide behavioral context. It only states it gets the URL, but omits important details such as whether user interaction is required, the need for a redirect URI, or any side effects like token caching.
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 extremely concise, a single sentence with no superfluous information. It is front-loaded and 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?
For a tool with no parameters and no output schema, the description is adequate but could be improved by specifying that the tool returns a URL and that the user must navigate to it to proceed with OAuth. Without this, the tool's role in the flow is partially ambiguous.
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 no parameters, so there is no need for additional parameter descriptions. Schema coverage is 100% by default. The description adds no extra parameter info, but none is required.
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's action ('Get') and resource ('authorization URL for OAuth flow'), making the purpose obvious. However, it does not explicitly differentiate from sibling OAuth tools like exchange-code-for-token, which slightly reduces clarity.
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 is provided on when to use this tool vs. alternatives. For example, it is the first step in the OAuth flow but no mention of when to subsequently call exchange-code-for-token or other related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-cycle-by-idC
Get the cycle for the specified ID
| Name | Required | Description | Default |
|---|---|---|---|
| cycleId | Yes | ID of the cycle to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations and description does not disclose behavioral traits like authentication requirements, error handling, or potential side-effects. The 'Get' verb implies read-only, but this is not explicit.
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 concise sentence, but lacks structure (e.g., no title, no front-loading of key info). It is adequate but minimal.
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 GET-by-ID tool with no output schema and no annotations, the description omits necessary context such as return format, error behavior, and prerequisites (e.g., authentication). Incomplete for safe agent usage.
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%, and the description adds no new meaning beyond the schema's 'ID of the cycle to retrieve'. Baseline 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 a cycle by ID, distinguishing it from collection tools like whoop-get-cycle-collection.
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 vs alternatives (e.g., get-cycle-collection). The agent must infer from the parameter and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-cycle-collectionA
Get all physiological cycles for a user, paginated
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Limit on the number of cycles returned (max 25) | |
| start | No | Return cycles that occurred after or during this time (ISO 8601) | |
| end | No | Return cycles that intersect this time or ended before this time (ISO 8601) | |
| nextToken | No | Next token from the previous response to get the next page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description correctly implies a read-only operation ('Get') and discloses pagination behavior. It could be more explicit about being non-destructive, but the verb suffices.
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, concise sentence with no wasted words. It is front-loaded and efficiently conveys the tool's 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?
For a simple paginated list tool with well-documented parameters, the description is adequate. It lacks mention of authentication or prerequisites, but the sibling auth tools provide context.
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% (all parameters described in schema). The description adds no additional meaning beyond what the schema already provides, meeting the baseline for high coverage.
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', the resource 'all physiological cycles', and adds qualifiers 'for a user, paginated'. This distinguishes it from sibling tools like 'whoop-get-cycle-by-id' (single cycle) and other collection tools.
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 alternatives. The pagination hint implies usage for listing, but no conditions, prerequisites, or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-recovery-collectionB
Get all recovery data for a user, paginated
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Limit on the number of recovery records returned (max 25) | |
| start | No | Return recovery records that occurred after or during this time (ISO 8601) | |
| end | No | Return recovery records that intersect this time or ended before this time (ISO 8601) | |
| nextToken | No | Next token from the previous response to get the next page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It only mentions pagination but omits authorization requirements, rate limits, data availability conditions, or whether the tool returns errors for empty results. The description is too sparse for a data retrieval tool.
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 with no unnecessary words. It conveys the essential purpose and pagination feature without fluff.
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 complexity of four parameters, no output schema, and no annotations, the description is insufficient. It does not explain the return format, pagination behavior (e.g., how to use nextToken), or handle edge cases. The agent lacks information to fully understand the tool's behavior.
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?
All four parameters have descriptions in the schema (100% coverage), so the baseline is 3. The description adds only the word 'paginated', which hints at nextToken usage but does not enrich parameter meaning beyond the schema. No new semantics are provided.
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), resource (recovery data), scope (for a user), and feature (paginated). It distinguishes from sibling tools like 'whoop-get-recovery-for-cycle' which targets a specific cycle, and 'whoop-get-cycle-collection' which retrieves cycles, not recovery data.
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 is provided on when to use this tool versus alternatives (e.g., 'whoop-get-recovery-for-cycle' for a specific cycle). There are no instructions on prerequisites, sequence, or exclusion criteria.
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-cycleB
Get recovery data for a specific cycle
| Name | Required | Description | Default |
|---|---|---|---|
| cycleId | Yes | ID of the cycle to get recovery data for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must fully disclose behavior. It does not state that this is a read-only operation, whether authentication is required, or any side effects. The description is minimal and fails to add behavioral context.
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 extremely concise at one sentence with no fluff. However, it could be slightly improved by adding a brief note about prerequisites or output without sacrificing brevity.
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 retrieval tool with one parameter, the description is minimally adequate. It could mention that the cycleId must be obtained from 'whoop-get-cycle-collection' or 'whoop-get-cycle-by-id', and that the recovery data typically includes metrics like score, heart rate variability, etc., especially since there is no output schema.
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 'cycleId' described in the schema. The description adds no additional meaning beyond the schema, such as explaining how to obtain a valid cycleId or the expected format. Baseline 3 is appropriate when schema is complete.
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', the resource 'recovery data', and the scope 'for a specific cycle'. It distinguishes this tool from siblings like 'whoop-get-recovery-collection' (returns all recovery) and 'whoop-get-cycle-by-id' (returns cycle metadata).
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 is provided on when to use this tool versus alternatives. For example, it does not mention that to retrieve recovery for multiple cycles, one should use 'whoop-get-recovery-collection' with cycle filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-sleep-by-idC
Get the sleep record for the specified ID
| Name | Required | Description | Default |
|---|---|---|---|
| sleepId | Yes | ID of the sleep record to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It only states the basic action, omitting any behavioral traits such as error handling, permission requirements, or performance characteristics. The agent gains no insight into side effects or limitations.
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 concise sentence with no wasted words. However, it is very brief and could benefit from additional context like output structure. The front-loading of the core action is good.
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 (1 parameter, no output schema, no nested objects), the description is minimally adequate. It lacks explanation of the return value or any prerequisites. With no output schema, the agent cannot anticipate the response structure.
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% (sleepId described in schema). The description adds no extra meaning beyond the schema. Baseline is 3; no additional value beyond the parameter name and type.
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 the resource 'sleep record', with the scope 'for the specified ID'. This differentiates it from sibling tools like get-sleep-collection (list) and get-sleep-for-cycle (by cycle), though it could explicitly mention 'single' record for full clarity.
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 usage guidelines are provided. The description does not specify when to use this tool versus alternatives like get-sleep-collection or get-sleep-for-cycle. An agent must infer from the name and parameter, with no explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-sleep-collectionB
Get all sleep records for a user, paginated
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Limit on the number of sleep records returned (max 25) | |
| start | No | Return sleep records that occurred after or during this time (ISO 8601) | |
| end | No | Return sleep records that intersect this time or ended before this time (ISO 8601) | |
| nextToken | No | Next token from the previous response to get the next page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only mentions pagination but lacks details on token usage, ordering, authentication, or side effects. It does not fully disclose behavioral traits.
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 concise sentence that gets to the point, but it sacrifices valuable usage and behavioral details.
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 tool with 4 parameters, no output schema, and no annotations, the description is too brief. It does not explain return format, pagination mechanics, or error behavior, leaving gaps for the 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?
The input schema has 100% description coverage, so baseline is 3. The tool description adds no additional meaning beyond the schema's parameter descriptions.
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), the resource (all sleep records), and the paginated nature, distinguishing it from sibling tools like whoop-get-sleep-by-id (single record) and whoop-get-sleep-for-cycle (sleep 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?
The description implies usage for retrieving the full collection but does not explicitly state when to use this tool versus alternatives like getting a single sleep record or sleep for a cycle.
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-cycleB
Get sleep data for a specific cycle
| Name | Required | Description | Default |
|---|---|---|---|
| cycleId | Yes | ID of the cycle to get sleep data for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only states 'Get sleep data' without explaining return format, data scope, authentication needs, or any side effects. For a read operation, basic transparency about what 'sleep data' includes is missing.
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 at 9 words, front-loading the action and resource. It is efficient but somewhat terse; a minor addition about what 'sleep data' entails would improve utility without sacrificing conciseness.
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 no output schema, the description should hint at the return value (e.g., fields, structure). It only says 'sleep data', which is vague. For a tool with a single parameter and no complex output, this lack of detail makes it incomplete for an agent to fully understand the response.
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 already describes the only parameter ('cycleId') with a clear description ('ID of the cycle to get sleep data for'). Since schema coverage is 100%, the baseline is 3. The top-level description adds no new meaning beyond the schema, so no adjustment is warranted.
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 sleep data') and the resource ('for a specific cycle'). It effectively distinguishes from sibling tools like 'whoop-get-sleep-by-id' (sleep by sleep ID) and 'whoop-get-recovery-for-cycle' (recovery for cycle). The verb+resource combination is specific and unambiguous.
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-sleep-collection' or 'whoop-get-sleep-by-id'. It does not mention prerequisites, limitations, or scenarios where this tool is preferred, leaving the agent to infer from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-user-body-measurementsA
Get body measurements (height, weight, max heart rate) for the authenticated user
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It indicates a read operation but does not disclose any behavioral traits such as rate limits, pagination, or error conditions. The description is truthful but minimal.
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 that conveys the essential information with no wasted words. It is appropriately sized and front-loaded.
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 no parameters and no output schema, the description provides sufficient context for a simple data retrieval tool. It specifies the data returned but could optionally mention authentication requirements or data format, though these are implied.
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?
There are no parameters, so the schema coverage is 100% by default. The description does not need to add param semantics, and the baseline for 0 parameters is 4.
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 the resource 'body measurements', listing specific measurements (height, weight, max heart rate). It distinguishes this tool from siblings like get-cycle, get-sleep, etc., which have different resources.
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. The description simply states what it does without any context on prerequisites or comparisons to other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-user-profileA
Get basic user profile information (name, email) for the authenticated user
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It implies a read-only operation ('Get') and mentions it is for the authenticated user, but does not explicitly state behavioral traits such as non-destructiveness, authentication requirements, or any side effects. The description is adequate for a simple retrieval but could be more explicit.
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 that is front-loaded with the main action ('Get basic user profile information') and includes key details. Every word is meaningful; there is no redundancy or filler.
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 has no parameters, no output schema, and is a simple data retrieval operation, the description is fully complete. It tells the user exactly what the tool does and what data it returns. No additional details are necessary.
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 zero parameters, and the description covers the schema completely. The description adds value by specifying the returned fields (name, email), which is beyond what the empty schema provides. According to guidelines, a baseline of 4 is appropriate for zero parameters when description adds context.
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 identifies the resource as 'basic user profile information' with explicit fields (name, email). It clearly differentiates from siblings like whoop-get-user-body-measurements by indicating this is for basic profile data.
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 does not provide explicit guidance on when to use this tool versus alternatives. While the lack of parameters makes usage straightforward, there is no mention of exclusions or context for when one would choose this over other tools like whoop-get-user-body-measurements. It meets the minimum viable standard but lacks proactive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-workout-by-idB
Get the workout record for the specified ID
| Name | Required | Description | Default |
|---|---|---|---|
| workoutId | Yes | ID of the workout record to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description should provide more behavioral context (e.g., requires authentication, returns 404 if not found). It only states the basic read action. Acceptable for a simple get, but lacks depth.
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 a single sentence stating the purpose. No redundant information.
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 get-by-ID tool with one parameter, the description is minimally complete. However, adding context about when to prefer this over get-workout-collection and error handling would enhance completeness.
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 provides a clear description for the only parameter. The tool description does not add extra semantics beyond what the schema already covers. 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 uses a specific verb ('Get') and resource ('workout record for the specified ID'), clearly distinguishing it from sibling tools that retrieve other resource types like cycles, sleep, or 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?
No usage guidelines provided. The description does not indicate when to use this single-record retrieval versus batch retrieval via get-workout-collection, nor any prerequisites or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-get-workout-collectionA
Get all workout records for a user, paginated
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Limit on the number of workout records returned (max 25) | |
| start | No | Return workout records that occurred after or during this time (ISO 8601) | |
| end | No | Return workout records that intersect this time or ended before this time (ISO 8601) | |
| nextToken | No | Next token from the previous response to get the next page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions pagination, which hints at behavior, but lacks details on rate limits, authentication, or what happens if no records exist. Some transparency exists, but significant gaps remain.
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?
A single sentence that is clear and front-loaded. No wasted words, every part earns its place.
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 has 4 optional parameters, no output schema, and no annotations, the description is somewhat complete but lacks details on return format or user context. It covers the core purpose but leaves some behavioral gaps.
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% (all four parameters have descriptions). The description does not add additional meaning to parameters beyond what is in the schema, so baseline 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 verb 'Get', the resource 'workout records', and the constraint 'paginated'. It differentiates from sibling tools like whoop-get-workout-by-id and other collection tools by specifying the action and resource.
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 when-to-use or alternatives are provided. The usage is implied by the tool name and input schema (paginated list), but no guidance on when to choose this over other workout-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-refresh-tokenB
Refresh access token using refresh token
| Name | Required | Description | Default |
|---|---|---|---|
| refreshToken | Yes | Refresh token to use for getting new access token |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description lacks disclosure of behavioral traits beyond the obvious. No annotations are provided, and the description does not mention side effects, token lifecycle, or whether the refresh token is consumed or rotated. For an OAuth token refresh, this is a notable omission.
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 extremely concise, using only five words to convey the essential purpose. Every word is meaningful, and there is no redundancy.
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 parameter, no output schema), the minimal description is borderline adequate. However, it could be improved by hinting at the return value (e.g., a new access token) or the typical flow (e.g., 'Call this when the access token expires'). It does not fully set expectations for the 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?
The input schema has 100% description coverage for the single parameter, so the description adds little value beyond what the schema already states. The tool description essentially repeats the schema's description, meeting the baseline but not exceeding it.
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's function: refreshing an access token using a refresh token. It uses a specific verb and resource, and distinguishes itself from sibling tools like whoop-exchange-code-for-token and whoop-set-access-token.
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 offers no guidance on when to use this tool versus alternatives. It does not specify prerequisites, such as having a valid refresh token, nor does it mention when to use exchange-code-for-token or set-access-token instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-revoke-user-accessB
Revoke the access token granted by the user
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of transparency. It only says 'revoke' which implies a destructive action, but lacks details on irreversibility, side effects, or required permissions.
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 that efficiently conveys the core purpose. However, it could be slightly expanded to include context without being verbose.
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?
The description lacks information about the outcome, such as whether the revoke is synchronous, what the response contains, or if any state changes occur. Without an output schema, this gap is significant.
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 0 parameters and 100% coverage, so the description doesn't need to add param details. However, it could clarify how the token is identified (e.g., from stored state), which it does not.
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 it revokes an access token, distinguishing it from sibling tools like whoop-exchange-code-for-token and whoop-refresh-token which handle token creation or refresh.
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 consequences. It simply states the action without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop-set-access-tokenC
Set the access token for API calls
| Name | Required | Description | Default |
|---|---|---|---|
| accessToken | Yes | Access token to use for API calls |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It fails to disclose behavioral traits such as whether the token is stored persistently, overrides previous tokens, or is scoped to the session. This is critical for a state-changing 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 that is concise and front-loaded. However, the brevity comes at the cost of missing important details.
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 setter tool with no output schema, the description is incomplete. It does not explain side effects, persistence, or error conditions, leaving the agent with insufficient context to use the tool correctly.
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 one parameter 'accessToken' described identically in both schema and description. No additional meaning or context is added beyond the schema.
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 'set' and the resource 'access token', with a specific purpose distinct from sibling tools like exchange, refresh, or revoke.
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 whoop-exchange-code-for-token or whoop-refresh-token. The description does not explain the context for setting an access token.
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.
16 tool updates
v1.0.0- First observed
whoop-exchange-code-for-token - First observed
whoop-get-authorization-url - First observed
whoop-get-cycle-by-id - First observed
whoop-get-cycle-collection - First observed
whoop-get-recovery-collection - First observed
whoop-get-recovery-for-cycle - First observed
whoop-get-sleep-by-id - First observed
whoop-get-sleep-collection - First observed
whoop-get-sleep-for-cycle - First observed
whoop-get-user-body-measurements - First observed
whoop-get-user-profile - First observed
whoop-get-workout-by-id - First observed
whoop-get-workout-collection - First observed
whoop-refresh-token - First observed
whoop-revoke-user-access - First observed
whoop-set-access-token
TDQS
Scored across 16 tools
Each tool targets a distinct resource or action: OAuth tokens, user profile, and various physiological data (cycles, recovery, sleep, workouts). There is no ambiguity between tools like get-cycle-collection and get-cycle-by-id, as they serve different purposes (list vs. single item).
All tools follow a consistent verb_noun pattern starting with 'whoop-', e.g., whoop-get-cycle-by-id, whoop-get-cycle-collection, whoop-refresh-token. Verbs are clear (get, exchange, refresh, revoke, set) and nouns are specific, making the naming predictable and easy to navigate.
With 16 tools, the set covers the core WHOOP API surface: OAuth authentication, user information, and paginated retrieval of physiological data. The number is appropriate for the domain, providing comprehensive access without being excessive.
The tool set covers all essential operations for the WHOOP API: OAuth flow, user profile, body measurements, and retrieval of cycles, recovery, sleep, and workouts (both collections and by-id or by-cycle). No obvious gaps are present for a read-focused API with token management.
Maintenance
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Private health and fitness analytics through a secure remote MCP connection.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA local MCP server providing read-only access to WHOOP fitness data via direct OAuth, with a local SQLite cache for offline queries.51 PyPIMIT
- AlicenseAqualityDmaintenanceMCP server that enables AI assistants to access Whoop health data including recovery, sleep, workouts, and daily strain for personalized health recommendations.7289 npmMIT
- AlicenseAqualityAmaintenanceA local-first, read-only MCP server that provides compact recovery, sleep, strain, HRV, heart-rate, workout, and body-measurement data from WHOOP without sending credentials to a third party.534 npm1MIT
- AlicenseNot gradedqualityCmaintenanceMCP server providing full read/write access to Whoop wearable data, including recovery, sleep, workouts, journal, and more, via Whoop's private iOS API.20 npmMIT