MCP server for accessing Oura Ring data via OAuth2
Oura MCP server has 9 well-defined read-only tools with mostly complete JSON Schema inputs and reasonable descriptions. All tools have proper naming (verb_noun format: get_*), clear descriptions (150-250 chars typical), and typed parameters with descriptions. However, there are several gaps preventing a higher score: (1) Output schemas are NOT documented, tools return JSON stringified results but the structure is not declared in the tool definition, preventing agents from planning downstream use. (2) No tool uses type enum constraints despite having valid value sets (e.g., days param in get_health_insights could have a range, biological_sex could be an enum). (3) Parameter descriptions lack specificity on valid ranges/formats, 'Start date in YYYY-MM-DD format' is present, but no mention of valid ranges (e.g., 'last 90 days only'). (4) No error handling guidance visible, tools don't document recovery hints (e.g., 'If date range is invalid, try narrower range'). (5) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all being READ_ONLY. (6) Descriptions are functional but generic, they lack the specificity needed to disambiguate similar tools (e.g., get_sleep_summary vs get_sleep_detailed are both 'Get sleep...', requiring LLM to read parameter details to distinguish). Tool get_personal_info and get_health_insights have minimal schemas (get_personal_info returns empty object properties, get_health_insights has only one optional number param), which is correct but minimal.
Get activity data for a date range
Get AI-powered insights based on recent data
Get heart rate data (5-minute intervals)
Get user's personal information and ring details
Get daily readiness scores
Get detailed sleep period data (multiple sleep sessions per day)
Output schemas not documented. No tool declares what fields its JSON response contains. Agents cannot plan downstream tool calls or extract required data (e.g., if get_workouts returns 'workout_id', agents need to know this to pass it to other tools). This forces agents to guess or waste context on exploratory calls.
No tool annotations despite all tools being read-only. Tools should declare readOnlyHint=true so agents and interfaces can mark them as safe for exploration without requesting confirmation.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | <=2025-11-25 | v2 |
Get sleep data for a date range
Get user-created tags (notes/comments on specific days)
Get workout sessions
Generic descriptions for similar tools. 'get_sleep_summary' and 'get_sleep_detailed' both say 'Get sleep data' / 'Get detailed sleep period data', the distinction ('multiple sleep sessions per day') is subtle and requires schema inspection. Descriptions should clarify: 'Returns daily aggregate sleep metrics' vs 'Returns individual sleep session details, useful for detecting multiple naps.'
No range/constraint hints in parameter descriptions. E.g., 'days' param in get_health_insights has no mention of valid range (1 - 365?). 'start_date' params have no mention of lookback limits (API likely has a ~90-day window for heart_rate). This forces agents to guess or discover constraints via failed calls.
No enum constraints despite having fixed value sets. 'biological_sex' in get_personal_info response likely returns 'male'|'female'|'other', but schema uses string without enum. 'include_hrv' is boolean but no description hints at what HRV means or when to request it. Makes schemas less self-documenting.
No error handling guidance. Code has try/catch and logger.error but tools do not document recovery steps. E.g., what if start_date is invalid? What if API rate limit is hit? Agents cannot self-correct without explicit error messages.