Local-first, read-only WHOOP MCP server with secure OAuth and AI-ready health signals
Five tools with complete input schemas and detailed descriptions. All tools follow verb_noun naming (whoop_*_*). Descriptions are substantive (100-200 chars), explaining WHAT the tool does and WHEN to use it. Input parameters have type definitions and descriptions with min/max constraints. Output schemas are documented with structured fields. Tool annotations (readOnlyHint, idempotentHint, destructiveHint, openWorldHint) are present on all tools. Key strength: descriptions explicitly address WHOOP's processing states (SCORED, PENDING_SCORE, UNSCORABLE) and local-time handling, guiding LLM behavior. Weakness: output schemas use generic recordSchema (z.record(z.string(), z.unknown())) rather than typed objects, reducing clarity on what fields agents should expect. Error handling is minimal, no recovery guidance if API calls fail.
Recent local physiological-cycle processing state and finalized metrics for SCORED records; a PENDING_SCORE current cycle may expose only provisional_strain.
Compact local-time coaching overview with newest sleep status, matching current recovery only when ready, finalized strain or explicitly provisional live current-cycle strain, latest workout, recent activity types, and body measurement.
Recent recovery processing state and, only when WHOOP marks a record SCORED, recovery score, HRV, resting heart rate, SpO2, and skin temperature.
Recent local bedtime/wake time, sleep or nap type, processing state, and finalized sleep metrics only when WHOOP marks a record SCORED.
Recent workout sport, local time, duration, and processing state, with score-derived metrics only when WHOOP marks a record SCORED.
Output schemas use generic z.record(z.string(), z.unknown()) instead of typed objects. LLMs cannot infer what fields to expect (e.g., does recovery include HRV, SpO2, skin_temperature?). Agents must guess or hallucinate field names.
No error handling or recovery guidance. If API calls fail (network error, auth expired, rate limit), tools return raw errors with no actionable next steps for the LLM. Missing pattern: recovery-guide.
No pagination or result limits documented. whoop_recovery_history, whoop_sleep_history, whoop_cycle_strain_history, whoop_workout_history accept 'days' up to 180 but do not specify max records returned. Large result sets could exhaust context window.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2025-06-18+ | v2 |
Tool descriptions reference WHOOP-specific concepts (SCORED, PENDING_SCORE, UNSCORABLE, provisional_strain) without explaining what they mean to an LLM unfamiliar with WHOOP's API. Add brief definitions or link to docs.
No batch variants. If an agent needs to fetch recovery for 10 different days, it must call whoop_recovery_history 10 times sequentially. A batch_fetch_recovery(day_ranges: []) would reduce latency and token waste.