MCP server for accessing Oura Ring health data (sleep, activity, readiness, stress, heart rate, workouts, vitals, profile)
Strong tool naming and descriptions. All 10 tools follow verb_noun convention (oura_get_*). Descriptions are detailed (150-250 chars), contextual use-case guidance is excellent ('Use for' clauses guide LLM selection). Input schemas are complete with types and descriptions. However, output schemas are not explicitly documented in the source, the tool descriptions hint at return fields but do not formally specify them. Error handling is basic (no recovery guidance visible). Parameter relationships (e.g., response_format enum values) are well-described. Overall, definitions are production-ready but lack formal output schema declarations.
Daily activity: score (0-100), steps, active and total calories. response_format 'detailed' adds minutes by intensity (high/medium/low), sedentary and resting minutes, walking distance. Use for 'how many steps', 'how active was I', 'did I move enough'. Defaults to the last 7 days.
Heart rate aggregated per hour (avg/min/max bpm and sample count) across day and night. Use for 'what was my pulse today/this afternoon'. For sleep-time heart rate prefer oura_get_sleep_detail. Range is capped at 3 days; defaults to the last 24 hours.
User profile: age, biological sex, email, weight (kg), height (cm), and ring info (serial, model, color, battery, fit, last synced). Use for 'ring battery', 'my profile', 'ring status'. Composite tool: fetches from two endpoints; missing ones are omitted gracefully.
Daily readiness scores (0-100) showing how recovered the body is, with contributors (HRV balance, resting heart rate, sleep balance, body temperature) and temperature deviation in °C. Use for 'how recovered am I', 'should I train today', 'is my temperature elevated'. Defaults to the last 7 days.
Output schemas not formally documented in tool definitions. Descriptions imply return fields (e.g., 'returns HR/REM latency, restless periods') but no explicit JSON Schema output type is visible in source.
No error recovery guidance in tool descriptions. If a date range is invalid or an API call fails, LLM has no directive on what to do next (retry, adjust range, check network).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | 2026-07-28+ | v2 |
Sleep data: duration, sleep phases (light/deep/REM), heart rate and temperature during sleep, sleep score (0-100). response_format 'detailed' adds HR/REM latency, restless periods, timing details. Use for 'how well did I sleep', 'how long did I sleep', 'what time did I fall asleep'. Defaults to the last 7 days.
Sleep-time heart rate and REM detection per 5-min interval across all sleep. Use for 'detail on my sleep quality', 'heart rate patterns overnight', 'REM timing'. Always aggregates to 5-min windows to control token use. Defaults to the last 7 days.
Daily stress summary: minutes of high stress, minutes of high recovery, and a day verdict (e.g. 'restored', 'normal', 'stressful'). Use for 'how stressed was I', 'did I recover today'. Defaults to the last 7 days.
User-tagged events (e.g. 'gym session', 'bad sleep', 'drank alcohol', 'traveled') logged via the app, timestamped with optional notes. Use for 'what did I tag', 'custom events I logged'. Defaults to the last 7 days.
Daily vital signs: resting heart rate (bpm), heart rate variability (HRV, ms), body temperature (°C, deviation from baseline), and blood oxygen (SpO2, %). Use for 'resting heart rate', 'HRV trends', 'body temp', 'blood oxygen'. Defaults to the last 7 days.
List of workouts logged via the ring, with type, duration, calories, heart rate zones, and activity classification. Use for 'what workouts have I logged', 'workout history', 'did I work out'. Defaults to the last 7 days.
oura_get_profile is a composite tool (fetches from two endpoints, omits missing ones) but the composition logic and fallback behavior is not formally documented in the parameter or return description. LLM cannot predict partial failures.
Date parameters use different formats: daily tools use YYYY-MM-DD (string), oura_get_heartrate uses ISO 8601 datetime. Inconsistency may confuse LLM when switching between tools in a multi-step workflow.