whoopmcp
whoopmcp is a read-only MCP server for WHOOP data, providing authentication, profile/body measurements, record retrieval, and statistical analysis.
Authentication:
whoop_auth_status,whoop_login,whoop_complete_login,whoop_logoutProfile & Body:
get_profile(user ID, email, name),get_body_measurement(height, weight, max HR)Records:
list_recoveries(recovery score, HRV, RHR),list_sleeps(performance, stages),list_cycles(strain, HR, kJ),list_workouts(sport, strain, zones); get by ID:get_sleep,get_workoutAnalysis:
summarize_period(statistics over a range),metric_trend(trend/slope),correlate_metrics(Pearson/Spearman with lags),compare_periods(compare two periods)
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., "@whoopmcpHow did my recovery trend over the last month?"
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.
whoopmcp
A read-only MCP server for the WHOOP API v2. It lets an MCP client — Claude Desktop, Claude Code, Cursor, or anything else that speaks the protocol — read and analyse your own WHOOP data: recovery, sleep, strain, cycles and workouts.
Runs locally by default, and your WHOOP credentials never leave your machine
in that mode. Run with WHOOPMCP_TRANSPORT=streamable-http (#27) instead and
that stops being true: the operator of that server now holds other members'
tokens and health data server-side, which makes them a data controller, not
a bystander. See PRIVACY.md's local-mode/hosted-mode split
before hosting this for anyone but yourself.

Install and usage patterns live in the wiki; docs/SETUP.md is the from-scratch walkthrough.
Status. Local mode works today against the real WHOOP v2 API, read-only. The hosted surface (streamable HTTP, OAuth resource server, per-tenant isolation, encrypted token storage, webhooks, metrics) is implemented and has been through the roadmap's security audits (#69, #37); the findings they raised are fixed and closed. Running it hosted for others still needs WHOOP's app approval, not yet granted, which caps a shared deployment at 10 members in the meantime (#33). See Roadmap.
Not affiliated with WHOOP, Inc. "WHOOP" is their trademark. This is an independent client of their public developer API.
What it does
Area | Tools |
Auth |
|
Profile |
|
Records |
|
Local store |
|
Analysis |
|
Alongside the 21 tools it registers 3 prompts (morning_readiness_briefing,
weekly_training_review, sleep_debt_investigation) and one resource
template, whoop://user/{item}, serving profile, latest-recovery,
latest-sleep and latest-cycle.
Every tool that only reads is annotated readOnlyHint; the one exception is
whoop_sync, annotated as a non-destructive, idempotent write because it
upserts fetched records into the local store — it never writes to your
WHOOP account. No MCP tool can mutate your
WHOOP account — the one mutating endpoint WHOOP exposes
(DELETE /v2/user/access) is never registered as an MCP tool, so no model
can revoke your grant. It is reachable only from a terminal on the machine
running the server, as the operator-run whoopmcp delete-member --whoop-user-id N (see Privacy); whoop_logout itself only
deletes the token stored on your own disk.
Questions it is meant to answer:
"How did my recovery trend over the last month?"
"Is my HRV correlated with how long I sleep?"
"Compare my strain in July against June."
What it is not
It reports numbers and the sample size behind them. It is not a medical device, it does not diagnose, and a correlation across a few weeks of your own data is not a causal finding. Talk to a clinician about health decisions.
Related MCP server: whoop-mcp
Install
Requires Python 3.13 or 3.14 — the two newest stable releases, which are the two CI tests.
git clone https://github.com/kurok/whoopmcp
cd whoopmcp
uv venv --python 3.14
source .venv/bin/activate
uv pip install -e .Setup
You need your own WHOOP developer app — this server ships no shared credentials, by design. Full walkthrough in docs/SETUP.md. The short version:
Create an app at developer.whoop.com and note the client ID and secret.
Register a redirect URL. WHOOP does not accept
http://, includinghttp://localhost— usehttps://or a custom scheme such aswhoopmcp://callback.Point the server at them via environment variables.
Claude Desktop / Claude Code
{
"mcpServers": {
"whoop": {
"command": "uvx",
"args": ["whoopmcp"],
"env": {
"WHOOP_CLIENT_ID": "your-client-id",
"WHOOP_CLIENT_SECRET": "your-client-secret",
"WHOOP_REDIRECT_URI": "whoopmcp://callback"
}
}
}
}Then ask your client to run whoop_login, open the URL it returns, approve
the consent screen, and pass the code and state from the redirect back
via whoop_complete_login.
Configuration
Variable | Required | Default | Meaning |
| yes | — | OAuth client ID from the WHOOP dashboard |
| yes | — | OAuth client secret |
| yes | — | Must match a registered redirect URL exactly |
| no | all read scopes + | Space-separated scope list |
| no |
|
|
| no |
| Token and cache location |
| no |
|
|
| no |
| Cache responses on disk |
| no | — | ISO 8601 lower bound for |
| no |
| Per-request timeout, seconds |
| no | — | Bearer token required on |
| no | — | HMAC key for |
The offline scope is requested by default. Without it WHOOP issues no
refresh token and you would re-authorise through a browser every hour.
For a token in your OS keychain rather than a file on disk:
pip install 'whoopmcp[keyring]'
export WHOOPMCP_TOKEN_BACKEND=keyringRecommended on Windows, where the default file backend cannot protect the
token: Windows uses ACLs rather than POSIX modes, so the 0600 the file
backend requests is ignored and the token lands world-readable. The server
warns when it first writes one.
Privacy
Read PRIVACY.md before connecting real data — it is split into local-mode and hosted-mode sections, since they are not the same document. The essential points:
This server sends nothing to its maintainers. No telemetry, no analytics, no phone-home. Traffic goes to
api.prod.whoop.comand nowhere else.Your MCP client does send your data onward. Anything a tool returns is passed to whatever model your client is configured to use — Anthropic, OpenAI, a local model — under that provider's terms, not this project's. This is inherent to how MCP works, and it is health data. Know where it is going.
Tokens are stored locally at mode
0600, or in your OS keychain. On Windows file modes are not enforced — use the keychain backend there.Local mode: delete everything with
whoop_logout, then removeWHOOPMCP_STATE_DIR, then revoke the app in the WHOOP app under Settings.Hosted mode: an operator holds other members' health data server-side (#13) and is a data controller for it (GDPR Article 9). Per-member export and erasure are operator-run CLI commands, deliberately not MCP tools —
whoopmcp export-member --whoop-user-id N,whoopmcp delete-member --whoop-user-id N(revokes the member's WHOOP grant upstream and forgets their local token and principal link — nothing more), andwhoopmcp erase-member --whoop-user-id N(also revokes the grant, then additionally erases the member's stored health data, webhook events, and audit rows) — andwhoopmcp enforce-retention --max-age-days Ndeletes data past a configured age when an operator schedules it. This project takes no backups of its own in either mode.
Rate limits
WHOOP's documented defaults are 100 requests/minute and 10,000/day,
with X-RateLimit-* headers and a 429 on breach. Collections page at 25
records maximum. Ask for explicit date ranges; an unbounded walk over years
of history will exhaust the quota and the model's context window alike.
Confirmed with WHOOP: the limit is per application (your client_id),
shared across every member who has authorised it — not a separate budget
per member. Running this locally for one person, that distinction is
invisible. Hosting it for several, it is the whole budget: one member's
two-year backfill is roughly 110 requests, about a minute of the entire
app's per-minute quota (#9).
Development
git clone https://github.com/kurok/whoopmcp
cd whoopmcp
uv venv && uv pip install -e '.[dev,lint]'
pytest # tests
ruff check . && ruff format --check .
mypy # strict on src/Built on the official Python SDK's MCPServer — the class FastMCP became
when the SDK went to 2.0. The layering is deliberate:
config.py environment -> Config, validated once at startup
auth.py OAuth 2.0 flow + token storage (file, encrypted file, keychain)
client.py one method per documented WHOOP endpoint, nothing more
store.py persistent store: schema, tenancy enforcement, erasure
analysis.py pure functions over already-fetched records
server.py MCP tool definitionsOnly server.py, webhooks.py and mcpauth.py import mcp — enforced by
tests/test_module_map.py; CONTRIBUTING.md carries the full 18-module map.
analysis.py holds no network code and client.py holds no statistics, so
each can be tested without the other.
Roadmap
Issue | Work |
#33 | [human] Submit the WHOOP app for approval; lifts the 10-member cap on hosted deployments |
Everything else the roadmap tracked — including both security audits (#69,
#37), the whoopmcp login terminal flow (#76) and the PyPI/MCP-registry
release plumbing (#34) — is implemented and closed. The package is not yet
on PyPI: publication waits on the name-clash resolution recorded in #34, so
install from a clone (see Install above) until then.
Contributing
See CONTRIBUTING.md. Bug reports and PRs welcome; by participating you agree to the Code of Conduct. To report a security issue, follow SECURITY.md rather than opening a public issue.
Prior art
Several other WHOOP MCP servers exist — among them AshwanthramKL/whoop-mcp, shashankswe2020-ux/whoop-mcp and JedPattersonn/whoop-mcp. If one of them already does what you need, use it.
License
MIT.
Available Tools
16 toolscompare_periodsCompare two periodsARead-only
Compare every summary metric between a baseline period and a later one.
Useful for "did the training block change anything" questions. Returns both periods' summaries and the delta, with sample sizes.
Args: baseline_start: ISO 8601 start of the baseline period. baseline_end: ISO 8601 end of the baseline period. comparison_start: ISO 8601 start of the comparison period. comparison_end: ISO 8601 end of the comparison period.
| Name | Required | Description | Default |
|---|---|---|---|
| baseline_end | Yes | ||
| baseline_start | Yes | ||
| comparison_end | Yes | ||
| comparison_start | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, non-destructive operation. The description adds useful behavioral context by revealing the output shape: 'both periods' summaries and the delta, with sample sizes.' This goes beyond annotations without contradicting them.
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 compact and front-loaded: a clear action statement, a usage hint, a return-value summary, and then parameter definitions. Every sentence earns its place and the Args section is cleanly formatted.
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, the presence of an output schema, and strong annotations, the description covers what the tool does, when to use it, what it returns, and all parameters. No critical information is missing.
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 descriptions are absent (0% coverage), so the description's Args list is essential. It explains each parameter's role (start/end of baseline/comparison) and requires ISO 8601 format, providing meaningful guidance beyond property titles alone.
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 purpose: comparing every summary metric between a baseline and a later period. This specific verb+resource combination distinguishes it from siblings like summarize_period (single period) and metric_trend (trend analysis).
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 clear usage context with the example 'did the training block change anything' questions. However, it does not explicitly mention when not to use it or name alternative tools, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
correlate_metricsCorrelate two metricsARead-only
Correlate two metrics over a range, sweeping a range of day-offsets.
Joins the two metrics by UTC calendar date rather than by cycle, and reports Pearson's r and Spearman's rho at every lag from -lag_days to +lag_days (inclusive), each with its own sample size. A positive lag means metric_a's date precedes metric_b's by that many days -- metric_a "leads". A lag whose surviving pairs fall below 8 is reported as refused rather than omitted.
Correlation here is descriptive, not causal: WHOOP daily samples are autocorrelated (today's recovery is not independent of yesterday's), so do not read a strong r at some lag as proof that one metric drives the other, and do not treat a handful of weeks as a stable finding.
Args: metric_a: First metric name, as in metric_trend. metric_b: Second metric name. start: ISO 8601 start of the range. end: ISO 8601 end of the range. lag_days: Sweep radius in days (default 3, capped at 14); the sweep covers every integer lag from -lag_days to +lag_days.
Raises: ValueError: if lag_days is negative.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| start | Yes | ||
| lag_days | No | ||
| metric_a | Yes | ||
| metric_b | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds substantial behavioral context: joining by UTC calendar date rather than by cycle, the meaning of positive lag (metric_a leads), the refusal threshold of 8 pairs, and autocorrelation warning. This goes well beyond annotations and provides essential statistical caveats.
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 longer than average, but every sentence adds value—statistical caveats, lag semantics, and edge cases are all substantive. It is well-structured with a summary paragraph followed by an Args section. While slightly verbose, the length is justified by the tool's complexity.
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 statistical complexity and 0% schema coverage, the description covers all essential aspects: lag range, join method, correlation coefficients, sample size threshold, error condition (ValueError for negative lag_days), and causal limitations. An output schema exists, so return values don't need explanation, but the description is complete for 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 description coverage is 0%, so the description must carry the full burden, and it does. It explains metric_a as 'as in metric_trend', clarifies start/end as ISO 8601, and adds critical details for lag_days: default 3, capped at 14, and the inclusive sweep from -lag_days to +lag_days. All 5 parameters are meaningfully described, far exceeding the bare 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 states a specific action: 'Correlate two metrics over a range, sweeping a range of day-offsets.' It clearly distinguishes from siblings like metric_trend (single metric trend) and compare_periods (period comparison) by focusing on lagged correlation between two metrics. The inclusion of Pearson's r and Spearman's rho at every lag further specifies the scope.
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 strong contextual guidance, explaining when results are meaningful and cautioning against causal interpretation: 'Correlation here is descriptive, not causal' and 'do not read a strong r at some lag as proof that one metric drives the other.' While it does not explicitly name alternative tools for different use cases, it gives clear context on the appropriate interpretation and limitations, which is nearly as useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_body_measurementGet body measurementsARead-only
Return height in metres, weight in kilograms and max heart rate in bpm.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds meaning by specifying measurement units (metres, kilograms, bpm), which is useful but does not disclose additional behavioral traits like whether it returns current or latest values. No contradiction with annotations.
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, efficient sentence that conveys exactly what is returned with no wasted words. It is appropriately front-loaded and concise.
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 zero-parameter read-only tool with an output schema and safety annotations, the description is complete. It clearly defines the three returned values and their units, leaving no ambiguity for invocation.
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 zero parameters, so the description cannot add parameter meaning. Baseline for zero-parameter tools is 4, and no further explanation 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 clearly states the tool returns height in metres, weight in kilograms, and max heart rate in bpm, using a specific verb and resource. It does not explicitly differentiate from get_profile, which may also provide body-related metrics, so it lacks sibling distinction.
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 such as get_profile or summarize_period. The description only states what it returns, with no context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileGet WHOOP profileARead-only
Return the user's WHOOP profile: user id, email, first and last name.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read. The description adds the specific fields returned, which is useful context, but it does not disclose other behavioral traits like auth requirements or data freshness beyond the annotations.
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 action and resource, and lists specific fields. Every word earns its place, and 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's simplicity (zero params), strong annotations (readOnly, openWorld, non-destructive), and the presence of an output schema, the description fully conveys what the tool does and what it returns. No additional context is needed for an agent to select and invoke it 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?
The tool has zero parameters, and the schema is empty with 100% coverage (vacuously). The description adds no parameter-related information, but none is needed. Baseline for 0 params is 4, and the description does not detract from 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 verb 'Return' and the resource 'WHOOP profile', listing specific fields (user id, email, first and last name). This distinguishes it from sibling tools like get_sleep or get_workout, which target 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 is provided about when to use this tool versus alternatives, such as whoop_auth_status or other data retrieval tools. The usage context is implied by the name but not explicitly stated, and there are no exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleepGet one sleepARead-only
Return a single sleep by its v2 UUID.
| Name | Required | Description | Default |
|---|---|---|---|
| sleep_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds value by specifying the v2 UUID format and that it returns a single record, but doesn't discuss not-found behavior.
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 one-sentence description that is front-loaded with the action and resource, with no redundant 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?
For a simple single-get tool with an output schema, the description covers the resource, identifier format, and scope. It doesn't mention error cases but those are typically understood; given the simplicity, it's adequately complete.
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 0%, so the description compensates by clarifying that the sleep_id parameter must be a v2 UUID, which adds meaning beyond the schema's generic string 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 uses the specific verb 'Return' and identifies the resource as 'a single sleep' by its 'v2 UUID', clearly distinguishing it from list_sleeps and other sibling 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?
The description implies usage when you have a specific v2 UUID for a sleep, providing clear context. However, it does not explicitly mention alternatives like list_sleeps for retrieving multiple sleeps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workoutGet one workoutARead-only
Return a single workout by its v2 UUID.
| Name | Required | Description | Default |
|---|---|---|---|
| workout_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds the detail that the identifier is a v2 UUID, which is a useful format constraint, but provides no additional behavioral context such as auth requirements or response behavior.
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, succinct sentence that directly states the tool's purpose. Every word earns its place, with no repetition of schema or annotation 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?
The tool is simple with one parameter, and the output schema exists, so return values need no explanation. The description covers the core functionality and identifier format, though it lacks explicit usage guidance regarding when to use this tool versus listing workouts.
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 schema has a single workout_id parameter with 0% description coverage. The description compensates by specifying that the ID must be a v2 UUID, providing meaningful format guidance beyond the schema's plain string 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 tool returns a single workout by its v2 UUID, using a specific verb and resource. It distinguishes itself from sibling tools like list_workouts by emphasizing the singular nature and identifier-based lookup.
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 gives no guidance on when to use this tool versus alternatives. It does not mention that list_workouts should be used to find UUIDs or that this is for retrieving a specific item, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cyclesList cyclesARead-only
List physiological cycles: day strain (0-21), average and max heart rate, kilojoules.
A cycle is WHOOP's notion of a day, bounded by sleep rather than by midnight, and is the key other records join on.
Args: start: ISO 8601 start of the range. Defaults, with end, to the last 7 days when both are omitted. end: ISO 8601 end of the range. limit: Records to return, capped at 25 per page by WHOOP. next_token: Cursor from a previous truncated response, to continue that page.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| limit | No | ||
| start | No | ||
| next_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses default date range (last 7 days) and pagination behavior (limit capped at 25, next_token cursor), which go beyond the readOnlyHint annotation. It also clarifies the semantics of a cycle, adding useful context about the data model.
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?
Starts with a clear one-line summary, then a brief context sentence defining cycles, followed by a succinct Args list. No wasted words; each 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?
The description covers the essential operational aspects: default behavior, pagination, and the central concept of cycles. With an output schema present, return values are already specified, so the description need not enumerate them.
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 descriptions are absent (0% coverage), but the Args section explains each parameter's meaning, format (ISO 8601), default behavior, and pagination use. This fully compensates for the schema gap.
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 lists physiological cycles with specific metrics (strain, heart rate, kilojoules) and defines cycles as WHOOP's day bounded by sleep. This distinguishes it from sibling list tools for sleeps, workouts, and recoveries.
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?
Explains what a cycle is and its role as the key join key, implying when cycle-level data is needed. It does not explicitly name alternative tools or contrast with them, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recoveriesList recoveriesARead-only
List recovery records: recovery score (%), HRV (ms) and resting heart rate (bpm).
Args: start: ISO 8601 start of the range, e.g. "2026-07-01T00:00:00Z". Defaults, with end, to the last 7 days when both are omitted. end: ISO 8601 end of the range. limit: Records to return, capped at 25 per page by WHOOP. next_token: Cursor from a previous truncated response, to continue that page.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| limit | No | ||
| start | No | ||
| next_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, and non-destructive behavior. The description adds valuable behavioral details: pagination via next_token, limit capped at 25 by WHOOP, and default date range behavior. This goes beyond the annotations and helps the agent understand paging and defaults.
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 and well-structured: a one-sentence summary followed by a clearly formatted argument list. Every line adds value, with no filler or 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?
The description covers purpose, fields, parameters, defaults, and pagination. An output schema exists, so return value details are not needed. It is complete for a list tool with optional parameters.
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 0%, so the description must compensate. It fully explains all four parameters: start/end as ISO 8601 with an example, limit capped at 25, and next_token as a cursor for continued pagination. This exceeds what the schema 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 'List recovery records' and specifies the exact fields returned (recovery score %, HRV ms, resting heart rate bpm). This distinguishes it from sibling tools like list_sleeps or list_workouts, which focus on different data types.
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 gives useful usage context: start and end default to the last 7 days when both omitted, and next_token enables pagination. However, it doesn't explicitly state when to use this tool instead of alternatives, though the resource is unique among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sleepsList sleepsARead-only
List sleep records: performance (%), efficiency, and stage durations in milliseconds.
Args: start: ISO 8601 start of the range. Defaults, with end, to the last 7 days when both are omitted. end: ISO 8601 end of the range. limit: Records to return, capped at 25 per page by WHOOP. next_token: Cursor from a previous truncated response, to continue that page. detail: "summary" (default) omits the per-stage sleep-duration breakdown to keep the response small; "full" includes it under "stage_durations", with the units declared once in a top-level "units" key.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| limit | No | ||
| start | No | ||
| detail | No | summary | |
| next_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits beyond annotations: default date range behavior, WHOOP's 25-per-page cap, cursor-based pagination via next_token, and the summary vs. full detail distinction including units placement. This goes well beyond the provided annotations.
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 well-structured and front-loaded with the core purpose, followed by a concise parameter list. Every line provides useful information without fluff or 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?
The description covers all essential aspects for a complex listing tool: pagination, defaults, response shaping, and unit handling. Given the output schema exists, the description is fully complete for an agent to select and invoke 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?
Despite 0% schema description coverage, the description thoroughly documents all five parameters: start/end ISO 8601 defaults, limit cap, next_token pagination cursor, and detail enum semantics. It adds significant meaning beyond the bare 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 tool lists sleep records and specifies key data included (performance, efficiency, stage durations). It is specific and distinguishes from singular get_sleep and other resource-specific list 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?
The description provides clear context for when to use the tool, including the default date range and detail options. However, it does not explicitly name alternatives or exclusion criteria, such as when to use get_sleep instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workoutsList workoutsARead-only
List workouts: sport, strain, average and max heart rate, and heart-rate zone durations.
Args: start: ISO 8601 start of the range. Defaults, with end, to the last 7 days when both are omitted. end: ISO 8601 end of the range. limit: Records to return, capped at 25 per page by WHOOP. next_token: Cursor from a previous truncated response, to continue that page. detail: "summary" (default) omits the per-zone heart-rate duration breakdown to keep the response small; "full" includes it under "zone_durations", with the units declared once in a top-level "units" key.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| limit | No | ||
| start | No | ||
| detail | No | summary | |
| next_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive, so the description adds valuable behavioral context: it discloses that limit is capped at 25 by WHOOP, that next_token continues a previous truncated response, that start/end default to last 7 days, and that 'detail' controls whether zone_durations are included, with units in a top-level 'units' key. This goes well beyond the annotations and explains pagination and response shaping.
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 well-structured with a clear one-line purpose followed by an Args section. Each parameter has a concise explanation without redundant filler. Despite the length, every sentence adds necessary information, especially given the 0% schema coverage. It is efficiently packaged and easy to scan.
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 5 optional parameters, pagination, and an enum, the description covers all necessary details: default date range, server-side cap, cursor semantics, and the difference between summary and full detail, including the top-level units key. With an output schema present, the description does not need to repeat return values, so this is complete.
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 0%, but the description fully compensates by explaining every parameter: ISO 8601 formats for start/end, default ranges, limit cap and page size, next_token as a cursor, and the summary/full distinction for detail. This is exemplary parameter documentation that adds meaning the schema alone cannot convey.
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 'List' with the resource 'workouts' and enumerates the key fields returned (sport, strain, heart rate, zone durations). It is clear and specific, but it does not explicitly distinguish from sibling tools like get_workout or list_sleeps, relying on the plural 'list' vs. singular 'get' naming convention.
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 implied usage context, such as the default 7-day range when start/end are omitted, and explains pagination use via next_token. However, it does not explicitly state when to prefer this tool over alternatives like get_workout for a single workout, or compare against list_sleeps/list_recoveries. This leaves usage boundaries to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metric_trendTrend of one metricARead-only
Compute the direction and rate of change of one metric over a range.
Args: metric: One of "recovery_score", "hrv", "resting_heart_rate", "sleep_performance", "sleep_efficiency", "strain". start: ISO 8601 start of the range. end: ISO 8601 end of the range.
Returns the least-squares slope in metric units per day. A slope is a description of the window requested, not a forecast. Also returns an r² fit-quality figure for that slope -- both as the number and as a word ("strong"/"moderate"/"weak"/"negligible") -- and 7/30/90-day rolling means of the metric over calendar days.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| start | Yes | ||
| metric | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=true, the safety profile is already known. The description adds valuable context that the slope is 'a description of the window requested, not a forecast' and discloses the return of r² and rolling means, which helps set expectations beyond the schema.
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 well-structured with clear sections (Args, Returns) and the purpose is front-loaded. It is slightly longer than minimal but every sentence carries substantive information—no 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 presence of an output schema, the description need not detail every return field, but it does describe the key outputs (slope, r², rolling means) and provides an important interpretation caveat. All parameters are fully explained, and the tool's purpose is unambiguous, making it complete 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?
The Args section in the description fully documents all three parameters—metric (with explicit enum-like options), start, and end (with ISO 8601 format). This completely compensates for the schema's generic string types, providing rich meaning beyond the input 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 'Compute the direction and rate of change of one metric over a range,' using a specific verb and resource. It distinguishes itself from siblings by focusing on single-metric trend analysis rather than correlation or period comparison.
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 gives clear context for when to use this tool—when you need a trend (slope) of one metric over a time range. It does not explicitly mention alternatives or exclusion criteria, but the 'not a forecast' caveat adds a boundary for interpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
summarize_periodSummarise a periodARead-only
Summarise recovery, sleep and strain over a date range.
Returns mean, standard deviation, median, min and max for each
metric, along with the number of scored records behind each figure
and days_missing -- how many calendar days in the range have no
scored record for that metric, a coverage gap rather than a record
count.
Args: start: ISO 8601 start of the range. end: ISO 8601 end of the range.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| start | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds valuable behavioral context by detailing the return values (mean, std, median, min, max) and explaining days_missing as a coverage gap, not a record count. This goes beyond the annotations without contradicting them.
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, front-loaded with the main purpose, and structured clearly. The Args section is formatted neatly, and every sentence adds value—no fluff or repetition.
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 tool is simple (2 params), and the description explains the return values and the meaning of days_missing. Given the annotations indicate a read-only, open-world operation and an output schema exists, the description is sufficiently complete for an agent to use the tool 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?
The input schema only provides parameter names and types (string). The description adds essential meaning: both are ISO 8601 dates and define the start/end of the range. With schema description coverage at 0%, this compensation is crucial for correct invocation and is done clearly.
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 opens with 'Summarise recovery, sleep and strain over a date range,' clearly stating a specific verb, resource, and scope. It distinguishes from sibling tools like list_recoveries and compare_periods by focusing on aggregation over a range rather than individual records or comparisons.
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 clearly implies its use case: when you need summary statistics over a date range. It doesn't explicitly state when not to use it or name alternatives, but the context is clear enough that an agent can infer it's for aggregation rather than raw data retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_auth_statusCheck WHOOP authenticationARead-only
Report whether a valid WHOOP token is held, its scopes and its expiry.
Call this first when a data tool fails; it distinguishes "never logged in" from "token expired" from "scope not granted".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a safe, read-only, non-destructive operation. The description adds useful behavioral context by specifying what the report contains (scopes, expiry) and how to interpret failure states, which goes beyond the annotation hints. It doesn't contradict annotations.
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 terse sentences deliver the purpose, the key output details, and the primary use case. Information is front-loaded and every clause adds value, with 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?
For a zero-parameter status tool, the description fully conveys its role and diagnostic value. An output schema exists to document return shape, so the description doesn't need to list fields. The failure-mode guidance completes the picture within the broader tool landscape.
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 tool has zero parameters, so the baseline of 4 is appropriate. The description correctly focuses on behavior rather than parameter details, and the empty schema leaves nothing unexplained.
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 the specific verb 'Report' and clearly states the resource: WHOOP authentication status including token validity, scopes, and expiry. This distinguishes it from siblings like whoop_login, whoop_logout, and data-fetching 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?
It explicitly advises to call this tool first when a data tool fails, and explains that it distinguishes between three failure modes (never logged in, token expired, scope not granted). This is direct, actionable guidance with clear context and no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_complete_loginComplete WHOOP loginA
Finish a login using the code and state from the redirect URL.
Args:
code: The code query parameter from the redirect.
state: The state query parameter from the redirect. It is
verified against the pending login before the code is used.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| state | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds a valuable behavioral detail beyond the annotations: the state parameter is 'verified against the pending login before the code is used.' This discloses a safety check and order of operations. The annotations already indicate readOnlyHint=false and openWorldHint=true, so the description does not need to repeat the mutation/network effects, but it enriches the behavioral understanding.
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 succinct and front-loaded. The core purpose is stated in a single sentence, followed by a brief Args list. Every sentence adds value: the first defines the tool's function, the Args detail the parameter sources and verification. No fluff or 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?
For a two-parameter login completion tool, the description covers the essential context: both parameters are explained, the verification behavior is disclosed, and an output schema is present (so return values are already defined). The only minor gap is that it does not describe what happens on invalid state, but this is not necessary for successful invocation.
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 descriptions (0% coverage), so the description must compensate. It explains both parameters: code is 'the code query parameter from the redirect' and state is 'the state query parameter from the redirect,' with an additional note that state is verified. This provides meaningful semantics that are absent from 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 tool's function: 'Finish a login using the code and state from the redirect URL.' This is a specific verb ('Finish') and resource ('login'), and it distinguishes the tool from siblings like whoop_login (which initiates login) and whoop_logout (which ends a session). The context of the redirect URL makes the purpose 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 gives clear context on when to use the tool: after obtaining a code and state from a redirect URL. It implies the preceding step of starting a login (via whoop_login) and the pending login state, but it does not explicitly mention alternatives or exclusions. This meets the 'clear context, no exclusions' threshold.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_loginStart WHOOP loginARead-only
Return a URL the user must open in a browser to authorise this server.
The user completes the WHOOP consent screen, is redirected to the
configured redirect URI, and then passes the code and state
query parameters back via whoop_complete_login.
| 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?
Annotations mark the tool as readOnlyHint=true and destructiveHint=false, and the description adds behavioral context: it doesn't complete login itself, requires external user browser action, and relies on a redirect URI with code/state parameters. This exceeds the annotation-only information.
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 short paragraphs – the first states the primary output, the second explains the process. No redundant words, all sentences contribute.
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 zero-parameter tool with an output schema and clear annotations, the description covers the entire flow: what the user receives, what they must do, and how the flow continues into whoop_complete_login. No major 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?
There are no parameters (schema properties empty), so the baseline is 4. The description adds no parameter details, as none exist; nothing more 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 explicitly states 'Return a URL the user must open in a browser to authorise this server' – a specific verb, resource, and outcome. It references the subsequent whoop_complete_login step, distinguishing it from sibling 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?
The description clearly implies the flow: open returned URL, complete consent, then pass code/state to whoop_complete_login. It doesn't explicitly state when not to use it (e.g., when already authenticated), but the sequential context makes usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoop_logoutForget WHOOP credentialsADestructive
Delete the locally stored WHOOP token.
This does not revoke the grant at WHOOP; do that from the WHOOP app under Settings if you want the authorisation itself withdrawn.
| 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?
Despite destructiveHint=true already signaling destruction, the description adds critical behavioral context: the operation is local-only and does not affect WHOOP-side authorization. It also informs the user that revocation must be done externally, preventing misinterpretation.
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 succinct at two sentences, with the primary action in the first sentence and a clarifying caveat in the second. No unnecessary words or repetition.
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 zero-parameter logout tool, the description covers the action, its scope, and the distinction from full authorization revocation. The presence of an output schema further reduces the need for return-value explanation, making it complete.
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 tool has zero parameters, so the empty schema provides complete coverage. Per the baseline for 0 params, no additional description is needed to explain parameters. Score 4 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 'Delete the locally stored WHOOP token' uses a specific verb+resource, clearly stating the action. It distinguishes from sibling auth tools (whoop_auth_status, whoop_login) by focusing on local token deletion, not authentication or revocation.
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 explicitly states what the tool does NOT do: 'This does not revoke the grant at WHOOP' and directs the user to the WHOOP app for revocation. This provides clear context for when to use the tool (local logout) and an alternative for full authorization withdrawal, though it doesn't explicitly reference sibling tool names.
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
v0.1.0- First observed
compare_periods - First observed
correlate_metrics - First observed
get_body_measurement - First observed
get_profile - First observed
get_sleep - First observed
get_workout - First observed
list_cycles - First observed
list_recoveries - First observed
list_sleeps - First observed
list_workouts - First observed
metric_trend - First observed
summarize_period - First observed
whoop_auth_status - First observed
whoop_complete_login - First observed
whoop_login - First observed
whoop_logout
TDQS
Scored across 16 tools
Each tool targets a distinct resource or analytical operation: auth lifecycle (status, login, complete_login, logout), raw data (profile, body measurement, recoveries, sleeps, cycles, workouts, single gets), and analysis (summarize, trend, correlate, compare). Even similar-sounding tools like list_sleeps vs get_sleep are clearly differentiated by singular vs plural and description.
The naming is mostly verb_noun (get_profile, list_sleeps, summarize_period) but inconsistent: auth tools carry a whoop_ prefix (whoop_login, whoop_complete_login) while data tools do not, and metric_trend breaks the verb_noun pattern by being noun_noun. The style is readable but not uniform.
16 tools is slightly above the typical 3-15 range, but each tool earns its place by addressing a distinct need (auth, each data type, individual records, and analysis). The count is a bit heavy but not bloated, and the domain of WHOOP data access justifies the breadth.
The surface covers the core WHOOP data types (profile, body measurement, recoveries, sleeps, cycles, workouts) plus individual getters for sleep and workout, and adds useful analytical tools. Minor gaps persist: there is no get_recovery or get_cycle by ID, and no way to retrieve a single cycle or recovery directly, but these can be worked around via the list functions.
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
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
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.MIT
- AlicenseAqualityDmaintenanceMCP server providing read access to WHOOP biometric data including recovery, sleep, strain, and workouts.161MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that wraps the Whoop API v2 to let Claude Code pull workouts, sleep, and recovery data.-
- FlicenseBqualityCmaintenanceLocal MCP server for the WHOOP API v2 that provides tools to access recovery, sleep, strain, and workout data, with local history and JSON export.9-