MCP server for integrating WHOOP wearable fitness data with Claude and other AI assistants
The server defines 2 tools with visible schemas and reasonable descriptions. Both tools follow a clear naming pattern (verb_noun: whoop_sleep_recent, whoop_cycle_strain) and have documented input parameters with types and constraints. However, there are significant gaps: (1) parameter descriptions are minimal or absent in the actual schema definitions visible in src/app.ts, the Zod schemas define types and constraints but lack the descriptive text an LLM needs to understand when and how to use each parameter; (2) output schemas are not formally documented, responses include raw API payloads with a 'structuredContent' field, but the schema of that content is not defined in the tool registration; (3) no error handling guidance is present to tell the LLM how to recover from failures; (4) security considerations around token storage and multi-user key support are not explained in tool descriptions. The tools are read-only and relatively safe, but the lack of parameter descriptions and output schema documentation represents a material gap.
Fetch recent WHOOP cycles including strain (stress) metrics.
Fetch recent sleep sessions with WHOOP metrics.
Parameter descriptions missing from schema registration. While Zod schemas enforce types and constraints (min/max for limit, string types for dates), the LLM-facing schema in server.registerTool() uses raw Zod objects without descriptive text. Parameters like 'start', 'end', 'nextToken', and 'key' lack any explanation of their format, semantics, or when to use them.
Output schema not documented. Tools return objects with 'content' (array of text items) and 'structuredContent' (raw API response), but the structure and field names of structuredContent are not defined. LLMs cannot plan downstream operations or extract required fields without knowing the output shape.
No error recovery guidance. Error handling throws generic errors ('Failed to fetch sleep data: <message>') without telling the LLM what to do next. Is it retryable? Should the user authenticate? Should they try different parameters?
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 71 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
Multi-user 'key' parameter semantics unclear. The 'key' parameter defaults to 'default' and supports multi-user token storage, but the tool descriptions do not explain what this parameter does, when to use it, or how token switching works. An LLM has no way to know it should pass different keys for different users.
Date/time parameter format not specified. Parameters 'start' and 'end' accept ISO 8601 strings, but this is not documented. LLMs may pass timestamps, epoch values, or natural language that the server will reject.
Pagination token semantics undocumented. The 'nextToken' parameter is present but its format and usage are not explained. LLMs won't know it should be passed verbatim or how to detect when pagination is complete.