Skip to main content
Glama

whoopmcp

CI License: MIT Python 3.13+

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.

Terminal demo: whoopmcp --help, doctor, and the privacy-default backfill refusal

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

whoop_auth_status, whoop_login, whoop_complete_login, whoop_logout

Profile

get_profile, get_body_measurement

Records

list_recoveries, list_sleeps, list_cycles, list_workouts, get_sleep, get_workout

Local store

whoop_sync, whoop_data_coverage

Analysis

summarize_period, metric_trend, correlate_metrics, compare_periods, whoop_timeseries, whoop_outliers, whoop_streaks

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:

  1. Create an app at developer.whoop.com and note the client ID and secret.

  2. Register a redirect URL. WHOOP does not accept http://, including http://localhost — use https:// or a custom scheme such as whoopmcp://callback.

  3. 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

WHOOP_CLIENT_ID

yes

OAuth client ID from the WHOOP dashboard

WHOOP_CLIENT_SECRET

yes

OAuth client secret

WHOOP_REDIRECT_URI

yes

Must match a registered redirect URL exactly

WHOOPMCP_SCOPES

no

all read scopes + offline

Space-separated scope list

WHOOPMCP_TOKEN_BACKEND

no

file

file, keyring, or encrypted-file

WHOOPMCP_STATE_DIR

no

~/.local/state/whoopmcp

Token and cache location

WHOOPMCP_TRANSPORT

no

stdio

stdio or streamable-http — local vs. hosted mode (#27)

WHOOPMCP_CACHE

no

false

Cache responses on disk

WHOOPMCP_BACKFILL_FLOOR_DATE

no

ISO 8601 lower bound for whoopmcp backfill; unset walks until history is exhausted

WHOOPMCP_TIMEOUT

no

30

Per-request timeout, seconds

WHOOPMCP_METRICS_TOKEN

no

Bearer token required on /metrics (#31); unset means the route 404s and exports nothing

WHOOPMCP_METRICS_SALT

no

HMAC key for /metrics' opaque per-member label; unset means every per-member series is withheld

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=keyring

Recommended 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.com and 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 remove WHOOPMCP_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), and whoopmcp erase-member --whoop-user-id N (also revokes the grant, then additionally erases the member's stored health data, webhook events, and audit rows) — and whoopmcp enforce-retention --max-age-days N deletes 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 definitions

Only 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 tools
compare_periodsCompare two periodsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseline_endYes
baseline_startYes
comparison_endYes
comparison_startYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 metricsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYes
startYes
lag_daysNo
metric_aYes
metric_bYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 measurementsA
Read-only

Return height in metres, weight in kilograms and max heart rate in bpm.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 profileA
Read-only

Return the user's WHOOP profile: user id, email, first and last name.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 sleepA
Read-only

Return a single sleep by its v2 UUID.

ParametersJSON Schema
NameRequiredDescriptionDefault
sleep_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 workoutA
Read-only

Return a single workout by its v2 UUID.

ParametersJSON Schema
NameRequiredDescriptionDefault
workout_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 cyclesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
limitNo
startNo
next_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 recoveriesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
limitNo
startNo
next_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 sleepsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
limitNo
startNo
detailNosummary
next_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 workoutsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
limitNo
startNo
detailNosummary
next_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 metricA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYes
startYes
metricYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 periodA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYes
startYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 authenticationA
Read-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".

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
stateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 loginA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 credentialsA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 16 tool updatesv0.1.0
    • First observedcompare_periods
    • First observedcorrelate_metrics
    • First observedget_body_measurement
    • First observedget_profile
    • First observedget_sleep
    • First observedget_workout
    • First observedlist_cycles
    • First observedlist_recoveries
    • First observedlist_sleeps
    • First observedlist_workouts
    • First observedmetric_trend
    • First observedsummarize_period
    • First observedwhoop_auth_status
    • First observedwhoop_complete_login
    • First observedwhoop_login
    • First observedwhoop_logout

TDQS

A4.1/5.0

Scored across 16 tools

Disambiguation5/5

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.

Naming Consistency3/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessResponsive

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

Related MCP Servers