Whoop biometric data: recovery, sleep, workouts, strain, HRV. All times are returned in UTC. Date params accept ISO 8601 or 'YYYY-MM-DD'.
Whoop MCP has 11 well-named, read-only tools with consistent verb_noun naming (get_*). All tools have descriptions (avg ~120 chars, within baseline 34-392 range). Input schemas are present with type definitions and parameter descriptions. However, output schemas are NOT documented, LLMs cannot predict response structure for downstream chaining. Parameter descriptions are adequate but lack explicit constraints (e.g., 'limit: max 25' is stated in description but not as a JSON Schema maxItems). Error handling is minimal, no recovery guidance or categorization. No tool annotations (readOnlyHint present in metadata but not declared per-tool). Composition is sound: tools are single-purpose and chainable (e.g., get_recent_cycles → get_recovery_for_cycle). Security is strong: credentials injected server-side, no secrets in params.
Get the user's body measurements: height (m), weight (kg), max heart rate.
Get full detail for a single cycle by id.
Get the authenticated user's basic Whoop profile (name, email, user id).
Get physiological cycles (Whoop's ~24h day construct) from the last N days. Each cycle has strain (0-21), kilojoule, average_heart_rate, max_heart_rate. Use the cycle id to fetch the matching recovery via get_recovery_for_cycle.
Get recovery scores from the last N days. Each record includes recovery_score (0-100), resting_heart_rate, hrv_rmssd_milli, spo2_percentage, skin_temp_celsius, and the cycle it belongs to.
Get sleep activities from the last N days. Includes sleep stages (light, deep/SWS, REM, awake), sleep_performance_percentage, sleep_efficiency, respiratory_rate, sleep_consistency_percentage.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields are in recovery_score object, pagination format, or error responses). This breaks downstream tool chaining and forces agents to guess field names.
Parameter constraints not formalized in JSON Schema. 'limit' is capped at 25 (Whoop API max) but only documented in description text, not as maxItems. LLMs may pass invalid values; validation happens server-side with generic error.
Error handling lacks recovery guidance. WhoopAuthError in get_today() returns a string error but does not tell the LLM what to do next (retry, re-authenticate, or escalate). No error categorization (retryable vs fatal).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Get workouts from the last N days. Includes sport_name, strain (0-21), average_heart_rate, max_heart_rate, distance_meter, kilojoule, percent_recorded, zone_durations (HR zones).
Get the recovery record tied to a specific cycle id.
Get full detail for a single sleep activity by id (UUID).
Aggregate snapshot of today: current cycle (strain so far), latest recovery, last night's sleep. Useful as a single 'how am I doing today' lookup.
Get full detail for a single workout by id (UUID).
Tool annotations missing. All tools are read-only (no side effects), but readOnlyHint is not declared in tool metadata. This forces LLMs to infer safety from names alone, risking misuse if similar-named write tools are added later.
Pagination not fully specified. Tools accept 'limit' but do not document whether responses include total_count, next_cursor, or offset for continuation. LLMs cannot reliably paginate through large result sets.