Oura MCP
The Oura MCP server connects AI agents to your Oura Ring health data (readiness, sleep, activity, heart rate, HRV, SpO2, workouts, sessions, tags, and personal info) via a local-first interface that keeps OAuth tokens on your machine.
Core data: Retrieve daily summaries and detailed historical records for readiness, sleep, activity, heart rate, SpO2, workouts, sessions, and user tags; access personal profile info.
Summaries & insights: Get a daily practical brief (
oura_daily_summary), a weekly scorecard with bottlenecks and action plan (oura_weekly_summary), and a normalized wellness context for recommendation engines.OAuth & connection: Generate authorization URLs, exchange codes for locally stored tokens (0600 permissions), check connection/cache status, revoke access, and run diagnostics (
oura_connection_status,oura_cache_status,oura_privacy_audit).Privacy: Three modes – summary, structured (default), and raw (opt-in with explicit user intent); sensitive fields redacted; tokens never exposed to the client.
Demo & onboarding: Explore synthetic data without an Oura account (
oura_demo); quickstart walkthrough; shared wellness profile onboarding (oura_onboarding).Agent support: Machine-readable manifests, capabilities inventory, data domain inventory, and prompts for daily check-ins, weekly reviews, and heart rate investigation.
Wellness profile: Read and update a cross-connector shared Delx wellness profile (
oura_profile_get,oura_profile_update).
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Oura MCPshow my readiness score for today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
⚡ One-command install with Delx Wellness for Hermes:
npx -y delx-wellness-hermes setup— preconfigures this connector and the other 8 in a dedicated Hermes profile.Or wire it standalone into Claude Desktop / Cursor / ChatGPT Desktop — see the install section below.
HTTP (v2 stateless)
Default is stdio. Optional Streamable HTTP — no session id, JSON responses, loopback only:
npx -y oura-mcp-unofficial --http
# GET http://127.0.0.1:3000/health
# POST http://127.0.0.1:3000/mcp (sessionless)Env: OURA_MCP_HOST, OURA_MCP_PORT, OURA_MCP_TRANSPORT=http.
Local-first MCP server that connects AI agents to your Oura Ring readiness, sleep, activity and HRV data.
Unofficial project. Not affiliated with, endorsed by or supported by Ōura Health Oy. Oura is a trademark of its respective owner. Use this only with your own Oura account and in line with the Oura Cloud API terms.
Built by David Mosiah for people who use Claude, Cursor, Hermes, OpenClaw or other MCP-compatible agents to think about readiness, sleep and recovery — without copy-pasting numbers from the Oura app.
Part of Delx Wellness, a registry of local-first wellness MCP connectors.
If this connector helps your agent workflow, please star the repo. Stars make the project easier for other AI builders to discover and help Delx keep shipping local-first wellness infrastructure.
Related MCP server: Withings MCP
Why this exists
Oura Ring produces some of the most refined personal health signals — readiness scores, sleep stages, HRV, daily activity, SpO2, body temperature trends. But it lives behind an OAuth API with per-scope authorization, and the data is split across multiple endpoints (daily readiness vs. detailed sleep periods vs. heart-rate streams).
This package handles the OAuth dance locally, normalizes responses across endpoints, and exposes Oura through the Model Context Protocol. Tokens never leave your machine. Privacy-mode defaults keep raw payloads opt-in.
Setup in 60 seconds
You'll need an Oura app (create one here) with redirect URI http://127.0.0.1:3000/callback.
npx -y oura-mcp-unofficial setup # interactive: paste client id + secret
npx -y oura-mcp-unofficial auth # opens browser, captures the OAuth code
npx -y oura-mcp-unofficial doctor # verifies you're readyRecommended scopes:
daily heartrate personal workout spo2Then add this to your MCP client config:
{
"mcpServers": {
"oura": {
"command": "npx",
"args": ["-y", "oura-mcp-unofficial"]
}
}
}For Claude Desktop, run setup --client claude and the snippet is written for you.
Quickstart: see the data before you connect
No Oura account yet? Call oura_demo to get realistic example payloads for the
readiness, sleep and daily-summary tools, so your agent learns the data contract
before any OAuth setup. All values are synthetic and tagged is_demo: true.
Call oura_demo and show me what the readiness and sleep data looks like.Real output from oura_demo (response_format=json, dates are relative to today):
{
"ok": true,
"is_demo": true,
"sample": {
"oura_daily_summary": {
"date": "2026-05-29",
"readiness": { "score": 78, "temperature_deviation": -0.1, "hrv_balance": 84 },
"sleep": { "score": 82, "efficiency": 89, "duration_min": 451, "deep_min": 92, "rem_min": 108 },
"activity": { "score": 86, "steps": 9420, "active_calories": 412, "target_calories": 500 },
"spo2": { "average": 96.8 }
},
"oura_wellness_context": {
"window": "last_24h",
"readiness_score": 78,
"readiness_band": "good",
"sleep_score": 82,
"sleep_efficiency": 89,
"hrv_balance": 84,
"recommendation": "Solid readiness and efficient sleep — green light for moderate-to-high intensity. A protein-forward breakfast keeps HRV trending up."
},
"oura_list_daily_readiness": {
"count": 3,
"records": [
{ "day": "2026-05-29", "score": 78, "contributors": { "hrv_balance": 84, "resting_heart_rate": 71, "sleep_balance": 76 } },
{ "day": "2026-05-28", "score": 74, "contributors": { "hrv_balance": 79, "resting_heart_rate": 73, "sleep_balance": 72 } },
{ "day": "2026-05-27", "score": 69, "contributors": { "hrv_balance": 68, "resting_heart_rate": 80, "sleep_balance": 65 } }
]
}
},
"notes": [
"All sample data is synthetic; tagged with is_demo=true.",
"Real calls return live data from the Oura Cloud v2 API after OAuth setup."
]
}When you're ready to connect your own ring, call oura_quickstart for a
personalized 3-step setup walkthrough, then follow Setup in 60 seconds.
Try it with your agent
Three things to ask first:
Use oura_connection_status to check setup, then run oura_daily_summary.
Give me a 5-line operating brief for today.Call oura_weekly_summary with response_format=json. Identify my biggest
readiness/sleep bottleneck and give me a next-week plan.Use the oura_daily_checkin prompt, focus=sleep.
Don't claim Oura can prove anything it can't.Data availability
This package uses the official Oura Cloud API v2. When this README says raw, it means the upstream Oura JSON for a supported endpoint — not raw device sensor streams.
Data | Available | Notes |
Daily readiness score + contributors | ✓ | Requires |
Daily sleep score + sleep periods | ✓ | Requires |
Sleep stages + timing | ✓ | When Oura returns scored sleep |
Daily activity (steps, calories, MET) | ✓ | Requires |
Heart-rate time series | ✓ | When ring/membership/scope expose it |
HRV (overnight, via daily summaries) | ✓ | Surfaced through readiness contributors |
SpO2 (daily averages during sleep) | ✓ | Requires |
Workouts + sessions + tags | ✓ | Requires |
Personal info (DOB, sex, height, weight) | ✓ | Requires |
Continuous sensor telemetry | — | Not exposed by Oura Cloud API |
Tools
Start with these:
oura_demo— realistic synthetic readiness/sleep/activity payloads (no account needed; see Quickstart)oura_quickstart— personalized 3-step setup walkthrough that adapts to your current stateoura_connection_status— verify local setup before calling Ouraoura_data_inventory— inventory supported data domains, scopes, privacy modes and recommended first calls without calling Oura APIs.oura_daily_summary— readiness, sleep, activity and SpO2 brief for todayoura_weekly_summary— scorecard, comparison vs prior week, next-week plan
Auth & diagnostics
oura_capabilities,oura_agent_manifest,oura_privacy_audit,oura_cache_statusoura_get_auth_url,oura_exchange_code,oura_revoke_access
Profile
oura_get_personal_info
Daily collections (cursor-paginated with next_token, after/before filters and privacy-mode override)
oura_list_daily_readiness,oura_list_daily_sleep,oura_list_daily_activity,oura_list_daily_spo2Offset ISO inputs keep their written calendar date when mapped to Oura's date-only
start_dateandend_dateparameters; invalid dates fail before a network request.Oura v2 has no integer page index. Resume with
next_tokenfrom the previous response; iftruncatedis true, raiselimitor setall_pages. See docs/pagination.md.
Detailed collections
oura_list_sleep,oura_list_workouts,oura_list_heartrate,oura_list_sessions,oura_list_tags
Prompts
oura_daily_checkin— practical daily health and readiness check-inoura_weekly_review— review trends across activity, sleep and heart contextoura_heart_context_investigation— investigate heart-rate records (privacy-aware)
Resources
oura://capabilities,oura://agent-manifestoura://personal-infooura://latest/readiness— the single newest readiness record. Use this for "my latest readiness": Oura serves collections oldest-first with no sort parameter, sooura_list_daily_readinesswithlimit: 1returns the oldest record in the window, not the newest.oura://summary/daily,oura://summary/weekly
Privacy & security
OAuth tokens are stored in
~/.oura-mcp/tokens.jsonwith0600permissions and are never returned by tools.The server never prints access or refresh tokens.
OURA_PRIVACY_MODEdefaults tostructured. Raw Oura JSON is opt-in viarawmode or per-call override.Structured mode preserves upstream physiological fields, including fields added by Oura later, while removing GPS and secret-bearing values.
Personal info (DOB, sex, height, weight) is only accessible when the user grants the
personalscope.The MCP client never sees access or refresh tokens.
This is not medical advice. The server exposes user-authorized data for personal AI workflows, not diagnosis or treatment.
Configuration
setup writes most of these into ~/.oura-mcp/config.json (0600). Manual env override is supported:
OURA_CLIENT_ID=…
OURA_CLIENT_SECRET=…
OURA_REDIRECT_URI=http://127.0.0.1:3000/callback
# Optional
OURA_SCOPES="daily heartrate personal workout spo2"
OURA_PRIVACY_MODE=structured # summary | structured | raw
OURA_CACHE=sqlite # optional read-through cache
OURA_TOKEN_PATH=~/.oura-mcp/tokens.json
OURA_CACHE_PATH=~/.oura-mcp/cache.sqliteHermes / remote setup
npx -y oura-mcp-unofficial setup --client hermes --no-auth
npx -y oura-mcp-unofficial auth # run locally if browser auth is needed
npx -y oura-mcp-unofficial doctor --client hermes
hermes mcp test ouraAfter Hermes config changes, use /reload-mcp or hermes mcp test oura. Don't restart the gateway for normal data access.
If browser OAuth has to happen on a different machine than Hermes, run auth locally and copy ~/.oura-mcp/tokens.json to the server with chmod 600.
Requirements
Node.js 20+
An Oura app at https://cloud.ouraring.com/oauth/applications with redirect URI
http://127.0.0.1:3000/callback
Development
git clone https://github.com/davidmosiah/oura-mcp.git
cd oura-mcp
npm install
npm test
npm run buildTest with MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.jsLinks
Docs site: https://wellness.delx.ai/connectors/oura
Legacy docs: https://ouramcp.vercel.app/
Delx Wellness registry: https://github.com/davidmosiah/delx-wellness
Connector quality standard: https://github.com/davidmosiah/delx-wellness/blob/main/docs/connector-quality-standard.md
Oura Cloud API docs: https://cloud.ouraring.com/docs/authentication
See also
The full Delx Wellness connector library:
Provider | Package | Repo |
WHOOP | ||
Oura | ||
Garmin | ||
Strava | ||
Fitbit | ||
Withings | ||
Apple Health | ||
Polar | ||
Nourish (nutrition) |
One-command setup for Hermes — preconfigures every connector above plus wellness skills + onboarding: delx-wellness-hermes.
📧 Contact & Support
📨 support@delx.ai — general questions, integration help, partnerships
🐛 Bug reports / feature requests — GitHub Issues
🐦 Updates — @delx369 on X
🌐 Site — wellness.delx.ai
License
MIT — see LICENSE.
Disclaimer
This software is provided as-is. It is not a medical device, does not provide medical advice, and should not be used for diagnosis or treatment. Always consult qualified professionals for medical concerns.
Skill or MCP
Same package, two doors. MCP registers tools on stdio/HTTP. The skill can drive the same tools through the CLI when the client has no MCP:
npx -y oura-mcp-unofficial call oura_connection_status --json '{}'Copy skill/SKILL.md into your agent skills dir.
Available Tools
27 toolsoura_agent_manifestOura Agent ManifestARead-onlyIdempotent
Machine-readable install, runtime and client guidance for AI agents. Does not call Oura or expose secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | generic | |
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | Yes | |
| oauth | Yes | |
| client | Yes | |
| hermes | Yes | |
| package | Yes | |
| project | Yes | |
| mcp_name | Yes | |
| resources | Yes | |
| unofficial | Yes | |
| agent_rules | Yes | |
| standard_tools | Yes | |
| troubleshooting | Yes | |
| recommended_first_calls | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnly, idempotent, non-destructive. Description adds the critical fact that it does not call Oura or expose secrets, which is valuable beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence packs purpose and a key behavioral constraint with zero wasted words. Front-loads essential info.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional enum params, output schema exists), the description provides enough for basic use. Could mention that output is a manifest with install/runtime guidance, but annotations and context signals fill gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Two parameters with enums but 0% schema coverage. Description says nothing about 'client' or 'response_format' — their meanings, defaults, or how they affect the output. Agents must guess their purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool provides machine-readable guidance for AI agents, not actual Oura data. This distinguishes it from siblings like oura_get_personal_info which make API calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Does not call Oura or expose secrets,' guiding agents to use this when they need manifest info rather than data. Could be improved by noting when to use alternatives, but context signals with many data-retrieval siblings make it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_cache_statusOura Cache StatusBRead-onlyIdempotent
Show optional local SQLite cache status. Enable with OURA_CACHE=sqlite or OURA_CACHE=true.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| enabled | Yes | |
| entries | Yes | |
| http_cache | No | |
| newest_cached_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds context about the local SQLite cache and its enabling conditions, but does not detail what the output contains or error scenarios, which is acceptable given the low complexity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and every sentence adds value. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the basic purpose and enabling conditions, and an output schema exists to define return values. However, it does not explain the parameter or what 'status' means (e.g., enabled/disabled, cache size), leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has one parameter (response_format) with an enum but no schema description. The tool description does not explain this parameter or its effect, leaving the agent to infer its meaning from the enum values alone. With 0% schema coverage, the description should compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Show optional local SQLite cache status,' which clearly identifies the action (show) and resource (cache status). It distinguishes from sibling tools that mostly retrieve data or manage connections, but could be more specific about what aspects of status are reported.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to check cache status, and mentions enabling conditions, but does not explicitly specify when to use this tool versus alternatives or mention any prerequisites or caveats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_capabilitiesOura MCP CapabilitiesARead-onlyIdempotent
Explain supported Oura data, privacy boundaries, recommended agent workflow and project links.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| links | Yes | |
| creator | Yes | |
| project | Yes | |
| mcp_name | Yes | |
| auth_model | Yes | |
| unofficial | Yes | |
| api_boundary | Yes | |
| privacy_modes | Yes | |
| client_aliases | Yes | |
| supported_data | Yes | |
| contribution_paths | Yes | |
| recommended_agent_flow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is clear. The description adds useful context about the content it explains (data, privacy, workflow, links), which goes beyond the annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the key purpose. Every word is meaningful and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a meta-capabilities tool, the description covers the main areas (data, privacy, workflow, links). Although it omits the optional parameter, the overall context is adequate given the presence of an output schema (which explains return values). The description could mention usage timing (e.g., start here) but is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one optional parameter (response_format) with enum values, but schema description coverage is 0%. The description does not mention this parameter or clarify its purpose (e.g., controlling output format). Since the description fails to compensate for the lack of schema descriptions, the score is low.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Explain') and clearly identifies the resource ('supported Oura data, privacy boundaries, recommended agent workflow and project links'). This distinguishes it from sibling tools that focus on specific data endpoints or auth flows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for understanding capabilities, but it does not explicitly state when to use this tool versus alternatives (e.g., before calling other tools). No guidance on prerequisites or context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_connection_statusOura Connection StatusARead-onlyIdempotent
Check local Oura config, token file, Node version, privacy mode, cache readiness and optional MCP client readiness without calling Oura or exposing secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | generic | |
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| node | Yes | |
| cache | Yes | |
| oauth | Yes | |
| token | Yes | |
| client | No | |
| config | Yes | |
| next_steps | Yes | |
| missing_env | Yes | |
| privacy_mode | Yes | |
| redirect_uri | No | |
| required_env | Yes | |
| client_checks | No | |
| ready_for_oura_api | Yes | |
| automatic_auth_supported | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds valuable behavioral context: it performs local checks without calling Oura and without exposing secrets, which goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the key information. Every word serves a purpose, and there is no fluff. It efficiently conveys the scope and constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (diagnostic check), with annotations covering safety, parameters optional with defaults, and an output schema present, the description covers what the tool checks and its constraints. It is complete for the tool's function.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description does not explain the two optional parameters (client and response_format). However, both parameters have enums and defaults, making them somewhat self-documenting. The tool is simple, so a score of 3 is acceptable as the minimum viable, but the description could add meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it checks multiple specific local resources (config, token, Node version, privacy mode, cache, MCP client) and distinguishes itself from siblings by explicitly saying it does not call Oura or expose secrets. The verb 'check' and list of resources make the purpose very specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a diagnostic/readiness check for local setup, and mentions it doesn't call Oura or expose secrets, which helps the agent know when to use it. However, it does not explicitly compare to sibling tools like oura_cache_status or oura_privacy_audit, so there is some room for improvement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_daily_summaryOura Daily Recovery SummaryARead-onlyIdempotent
Build a practical daily summary from Oura readiness, sleep, activity, heart-rate and SpO2 data when available. Read-only and non-medical.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window for recent training context. | |
| timezone | No | IANA timezone used only for display, e.g. America/New_York. | UTC |
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| generated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value by stating 'non-medical' (important disclaimer) and 'when available' (indicates data availability may vary). This context beyond annotations justifies a score above 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the purpose and key constraints ('read-only, non-medical'). No redundant phrases; every word contributes to understanding. Ideal conciseness for a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers data sources and safety, it misses explaining the time range (days parameter defaults to 7, but tool is called 'daily summary') and does not mention output format options (schema covers that). With an output schema present, return values are documented elsewhere, but the time range ambiguity reduces completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (2 of 3 parameters have descriptions in the schema itself), so the baseline is 3. The tool description does not add any parameter-specific meaning beyond the schema's built-in descriptions, so it neither improves nor harms parameter clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool builds a 'practical daily summary' and lists the specific data sources (readiness, sleep, activity, heart-rate, SpO2) when available. This is a specific verb+resource that distinguishes it from sibling tools like individual listing tools or the weekly summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for a consolidated daily overview but does not explicitly state when to use this tool versus alternatives like oura_weekly_summary or individual data listers. No when-not-to or prerequisite guidance is given, though the context of 'daily summary' provides some direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_data_inventoryOura Data InventoryARead-onlyIdempotent
Inventory supported Oura data domains, auth scope requirements, privacy boundary and recommended first calls. Does not call Oura APIs or expose user data.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| auth | No | |
| kind | Yes | |
| links | Yes | |
| notes | Yes | |
| scopes | Yes | |
| source | Yes | |
| totals | Yes | |
| mcp_name | Yes | |
| categories | Yes | |
| unofficial | Yes | |
| first_tools | Yes | |
| api_boundary | No | |
| generated_at | Yes | |
| privacy_modes | Yes | |
| data_access_model | Yes | |
| recommended_agent_flow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent; description adds valuable context: 'does not call Oura APIs or expose user data', clarifying privacy and safety boundaries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with core purpose, additional boundary information in second sentence. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main purpose, safety, and output type (via output schema). Could mention parameter effect, but overall complete for a metadata tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter (response_format) is not described in the description. Schema coverage is 0%, and while the parameter is self-explanatory, the description should explicitly state that it controls output format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it inventories supported Oura data domains, auth scope requirements, privacy boundary, and recommended first calls. Differentiates from sibling tools that retrieve actual data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies use as a discovery tool before making data calls, but lacks explicit guidance on when to use versus sibling tools like oura_quickstart or oura_capabilities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_demoOura DemoARead-onlyIdempotent
Returns realistic example payloads of oura_daily_summary, oura_wellness_context, and oura_list_daily_readiness so agents see the contract before calling real Oura APIs.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description confirms the tool returns examples (non-destructive, read-only), aligning with annotations (readOnlyHint: true, destructiveHint: false). It adds value by naming the specific payloads returned, beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the tool's purpose and usage context without redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple schema (1 param, no output schema), the description identifies the returned payloads by name but does not detail the contract's structure or contents. It is adequate but could provide more insight into the example data format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter (response_format) with 0% coverage in the description. The description does not mention the parameter or its effect on output, failing to compensate for the lack of schema documentation. The parameter is self-explanatory but should be acknowledged.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns realistic example payloads of three specific sibling tools, providing a concrete verb (returns) and resource (example payloads). It effectively distinguishes itself from siblings as a demo tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by stating 'so agents see the contract before calling real Oura APIs', suggesting it should be used as a precursor to real tool calls. However, it does not explicitly exclude alternative uses or specify when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_exchange_codeExchange Oura OAuth CodeA
Exchange an Oura OAuth authorization code for local tokens. Tokens are stored locally with 0600 permissions and are never returned. Requires explicit user action: the user must complete browser OAuth and supply the authorization code (agents must not invent codes).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | OAuth authorization code, or a full redirect URL containing ?code=... | |
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | Yes | |
| scope | No | |
| expires_at | No | |
| token_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a mutation (readOnlyHint=false), and the description adds that tokens are stored locally with 0600 permissions and never returned, which goes beyond the structured data. However, it does not disclose error handling or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences no fluff. First sentence states the core action, second provides essential behavioral and usage context. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of an output schema, the description covers the main behavioral aspects. It could mention idempotency or one-time use, but it is largely complete for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% with only the 'code' parameter described. The description does not elaborate on parameters beyond the schema, but the 'code' parameter is clearly implied in the tool's purpose. The 'response_format' enum is simple and self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Exchange an Oura OAuth authorization code for local tokens,' which is a specific verb+resource. It clearly distinguishes this tool from siblings like oura_get_auth_url and oura_revoke_access by focusing on the token exchange step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: after the user completes browser OAuth and provides the code. It also warns against inventing codes, providing clear usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_get_auth_urlGet Oura OAuth URLARead-onlyIdempotent
Generate an Oura OAuth authorization URL. Use this first when no local token exists.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Optional OAuth state value generated by the caller. | |
| scopes | No | Optional scope override. Defaults to read-only Oura scopes used by this server. | |
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| scopes | Yes | |
| auth_url | Yes | |
| next_step | Yes | |
| redirect_uri | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, destructive=false. Description adds that it generates a URL, aligning with annotations. Some behavioral context (first step) but doesn't elaborate beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded purpose, no wasted words. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an OAuth URL generation tool with rich annotations and output schema, the description is sufficient. Lacks explanation of what to do with the URL, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers all three parameters with descriptions. Tool description does not add meaning beyond schema, so baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'Generate' and resource 'Oura OAuth authorization URL', with usage hint. Distinguishes from siblings like oura_exchange_code by implying it's the first step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this first when no local token exists', providing clear context. Lacks explicit alternatives or when-not-to-use, but the hint is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_get_personal_infoGet Oura Personal InfoBRead-onlyIdempotent
Get Oura personal profile fields available to the authorized app. Requires the personal scope.
| Name | Required | Description | Default |
|---|---|---|---|
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| endpoint | Yes | |
| privacy_mode | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds no behavioral context beyond this, merely restating scope requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. Purpose and a key prerequisite are front-loaded. Every word is necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a simple read operation given existing annotations and output schema, but it lacks guidance on parameters like privacy_mode and response_format, which affect output behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention any of the three parameters. Schema description coverage is 67%, meaning two parameters have descriptions in the schema. The tool description adds no additional meaning to the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves personal profile fields from Oura, with a specific verb 'Get' and a clear resource. It distinguishes from sibling tools like data retrieval tools, though a similar sibling 'oura_profile_get' exists, causing minor ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies the required 'personal' scope as a prerequisite but provides no explicit guidance on when to use this tool versus alternatives like 'oura_profile_get' or other data tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_daily_activityOura Daily ActivityARead-onlyIdempotent
List daily Oura activity summaries. Supports start/end date filters through after/before and Oura cursor pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context by calling out start/end date filters and Oura cursor pagination, which implies paged results. It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise, front-loaded sentences communicate the operation, the resource, and the two core invocation concepts. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The rich input schema, annotations, and output schema handle per-parameter nuance, safety, and return-value shape. The description supplies the essential orientation, so an agent has enough context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 89% schema description coverage, the schema carries detailed parameter semantics. The description adds a valuable high-level framing by labeling after/before as start/end date filters and by naming cursor pagination as the pagination mechanism, which helps an agent understand the main parameters without restating every detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List daily Oura activity summaries.' It clearly distinguishes this endpoint from sibling tools like oura_list_daily_sleep and oura_list_daily_readiness by naming 'activity' as the domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: the tool lists daily activity summaries and supports date filtering via after/before and cursor pagination. It does not explicitly name when-not-to-use scenarios or alternative endpoints, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_daily_readinessOura Daily ReadinessBRead-onlyIdempotent
List Oura readiness summaries and contributors. Requires daily scope. Not medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. To get the most recent record of this domain, read the resource oura://latest/readiness, which walks the Oura cursor to the end of the window instead of stopping at its oldest block. Narrowing the window with after/before also works. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds a useful auth prerequisite ('Requires daiily scope') and a medical disclaimer, but does not disclose pagination, sorting, or truncation behavior beyond what parameter docs already state. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The action is front-loaded ('List Oura readiness summaries and contributors'), followed by the scope requirement and disclaimer. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a rich input schema, output schema, and strong annotations, the description is mostly sufficient. It names the resource and required scope, while the schema and parameter docs handle pagination, privacy modes, and return details. The main gap is lack of tool-selection guidance, but that is a usage_guidelines issue, not a completeness issue.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, well above the 80% threshold, so the baseline is 3. The top-level description adds no parameter detail; the schema itself thoroughly documents after/before, limit, next_token, privacy_mode, and related parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clear resource ('Oura readiness summaries and contributors'), so an agent knows what the tool returns. It does not explicitly distinguish this from sibling list tools like oura_daily_summary or oura_list_daily_activity, but the resource noun is specific enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only context is a prerequisite ('Requires daily scope') and a disclaimer ('Not medical advice'), with no guidance on when to prefer this tool over alternatives such as oura_daily_summary or oura_list_daily_activity. No exclusions or alternative routing are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_daily_sleepOura Daily SleepBRead-onlyIdempotent
List daily Oura sleep score summaries. Requires daily or sleep data access granted by the user. Not medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it discloses that the user must have granted daily or sleep data access. It does not mention pagination or privacy nuances, but those are documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is short and front-loads the main purpose in the first sentence. The access requirement is useful; however, 'Not medical advice.' does little to help selection or invocation and does not earn its place, preventing a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has nine parameters, pagination behavior, privacy controls, and many siblings, so a richer description would normally be expected. However, the input schema is very detailed and an output schema exists, which offsets much of the complexity. The main contextual gap is lack of usage differentiation among the many related Oura tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (89%), so the schema already explains the parameters in detail. The tool description itself adds no parameter-specific meaning beyond the notion of 'daily sleep score summaries,' which matches the baseline of 3 for schema-heavy tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'List daily Oura sleep score summaries.' This is specific enough to indicate the tool's basic purpose, but it does not explicitly distinguish itself from sibling tools like oura_list_sleep or oura_list_daily_readiness, so it falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an access prerequisite and a medical disclaimer but provides no guidance on when to choose this tool over siblings such as oura_list_sleep, oura_list_daily_readiness, or other Oura data tools. An agent is left to infer the appropriate selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_daily_spo2Oura Daily SpO2ARead-onlyIdempotent
List daily Oura SpO2 averages recorded during sleep when available. Requires spo2 scope. Not medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With strong annotations (readOnly, idempotent, non-destructive), the bar for additional disclosure is lower. The description adds meaningful behavioral context by stating the required auth scope and that records exist only when SpO2 was measured during sleep. This goes beyond the safety profile already conveyed by annotations, though it does not discuss pagination ordering or truncation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The core behavior and scope requirement are front-loaded, and the disclaimer is a single not-infrusive clause. Every sentence earnts its place without duplicating schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's pagination complexity and rich schema descriptions, the description does not need to repeat cursor or threshold details. It covers purpose, availability conditions, and auth scope, which is enough for an agent to select and invoke it correctly. The only small gap is the lack of explicit guidance on how to route among sibling summary tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides comprehensive descriptions for all parameters, including detailed semantics for limit, next_token, all_pages, and privacy mode. The description itself adds no parameter-level meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation (list) and the resource (daily Oura SpO2 averages) while adding the context that data is recorded during sleep and only available when present. It doesn't explicitly name or contrast with sibling tools, but the specificity of the resource makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It communicates a clear prerequisite (Requires spo2 scope) and a condition for data availability ('when available'), which helps an agent decide to call it for daily SpO2 needs. It does not explicitly describe when not to use it or name alternatives, but the resource ispecificity provides adequate routing context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_heartrateOura Heart RateARead-onlyIdempotent
List Oura heart-rate time-series records where the user's ring and membership expose them. Requires heartrate scope. Not medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the call as readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds useful non-obvious behavior: it requires the `heartrate` OAuth scope and warns that data availability depends on ring hardware and membership tier. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the verb and resource. The first two sentences earn their place; 'Not medical advice' is minor boilerplate but does not meaningfully hurt clarity or structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a rich input schema and an output schema, the description covers the selection-critical context: what data it lists, the required scope, and the device/membership caveat. Pagination, privacy mode, and cursors are handled in the parameter descriptions, so nothing blocking correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89% and the parameter descriptions are unusually detailed, especially for `limit`, `next_token`, and `all_pages`. The tool description itself adds no parameter-level meaning, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a specific resource ('Oura heart-rate time-series records'), and adds the availability condition that the ring and membership must expose them. This clearly distinguishes the tool from siblings such as oura_list_daily_sleep or oura_list_workouts by naming the exact data resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context: use this tool for hear-rate time-series data when the user's ring/membership expose it and when the `heartrate` OAuth scope is available. It does not explicitly name alternative tools or exclusion conditions, but the resource and precondition are specific enough that an agent can select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_sessionsOura SessionsARead-onlyIdempotent
List guided and unguided Oura app sessions when the user granted session scope.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive, and the description's 'List' verb is consistent with those. The description adds the session-scope auth context, but does not disclose behavior like pagination order, truncation, or privacy overrides—though those are richly covered in parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. Every word earns its place, and the key resource and scope condition appear immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters and a large sibling family, the definition relies heavily on the schema and annotations; the description adds only one sentence. Output schema is present, but an agent would benefit from a sentence on session data vs other resources or on pagiation behavior to be fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so the input schema carries nearly all parameter meaning; the tool description itself adds no parameter semantics. Baseline 3 is appropriate because the schema does the work and the description does not hinder.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List'), a precise resource ('guided and unguided Oura app sessions'), and a boundary condition ('when the user granted session scope'). This is enough to distinguish it from sibling list_* tools for sleep, workouts, heartrate, and tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the auth prerequisite that session scope was granted; it does not explicitly say when to choose this over sibling list tools or when not to use it. No exclusions or alternatives are given, so the agent must infer routing from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_sleepOura Sleep PeriodsBRead-onlyIdempotent
List detailed Oura sleep period records, including sleep stages and timing where available. Requires the daily scope (Oura has no separate sleep OAuth scope). Not medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, and non-destructive, so the bar for additional behavioral disclosure is lower. The description adds useful context about the OAuth scope requirement and the data-availability caveat ('where available'). It does not describe pagination or output shape, though the limit parameter description compensates substantially.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The top-level description is short and front-loaded with the purpose and content, followed by the auth requirement and a disclaimer. Every sentence earns its place, though 'Not medical advice' is a generic disclaimer that is not directly actionable for tool invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition benefits from a very rich input schema and an output schema, with the limit parameter explaining the hardest behavioral details such as oldest-first ordering and pagination. The description adds the auth prerequisite and availability caveat. The main gap is the lack of an explicit relationship to sibling tools like oura_list_daily_sleep.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 89%, and the parameter descriptions are unusually detailed, especially the limit and next_token fields, which explain oldest-first ordering, truncated/has_more semantics, and cursor constraints. The top-level description adds no direct parameter meaning beyond what the schema already provides, so it stays at the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource ('detailed Oura sleep period records') and a clear action ('List'), and mentions the distinguishing content ('sleep stages and timing where available'). It is clear enough, but it does not explicitly contrast this tool with the sibling oura_list_daily_sleep, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool over alternatives such as oura_list_daily_sleep or oura_daily_summary. It states the auth prerequisite ('Requires the daily scope') and includes a disclaimer, but no when-to-use or when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_tagsOura TagsARead-onlyIdempotent
List user-entered Oura tags when the user granted tag scope.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds an auth-related detail beyond annotations by noting that tag scope must have been granted. It does not elaborate on pagination or output, but those are handled extensively in parameter descriptions and the output schema, and the operation is a non-destructive read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the operation, the resource, and the key precondition with no filler or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only collection tool with rich annotations, nine parameters comprehensively documented in the schema, and an output schema, the one-sentence description is mostly sufficient. It includes the critical scope precondition, though it leaves the exact behavior when tag scope is absent to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, well above the 80% threshold, so the schema already documents the parameters in detail (e.g., limit ordering, next_token semantics, privacy_mode overrides). The tool description itself adds no parameter-specific meaning, but it is not required to compensate because the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'user-entered Oura tags,' which clearly identifies the operation and distinguishes it from sibling list tools targeting other Oura resources (sleep, workouts, heartrate, etc.). The qualifier 'when the user granted tag scope' adds a precise precondition without obscuring the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear context for use: this endpoint is appropriate only when the user has granted tag scope. It does not explicitly name alternative tools or state when not to use it, but the resource-specific wording plus the scope condition supplies adequate situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_list_workoutsOura WorkoutsARead-onlyIdempotent
List Oura workout summaries. Requires workout scope.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return Oura records after this time. Converted to an Oura start_date. | |
| limit | No | Maximum number of records returned by this call, kept from the OLDEST end of the window. Oura v2 serves collections oldest-first, has no sort parameter and no page-size parameter, so limit=1 returns the OLDEST record in the window, never the newest. This domain has no latest-record shortcut resource (only daily readiness has one), so to reach the newest record here, narrow the window with after/before until the response comes back with truncated=false and has_more=false: records are oldest-first, so the LAST one is then the newest that exists in that window. The cap is applied locally after fetching and also stops cursor pagination once it is reached; when it dropped records, truncated is true and has_more is true. If truncated is true, raise limit or set all_pages — do not follow a cursor, because next_token is omitted whenever resuming would skip dropped records. | |
| before | No | Only return Oura records before this time. Converted to an Oura end_date. | |
| all_pages | No | When true, follow the Oura next_token cursor up to max_pages in this one call. Resume later by passing the returned next_token with the same after/before window. | |
| max_pages | No | Maximum upstream Oura pages to fetch in this call when all_pages is true. A runaway guard, not an Oura page index. | |
| next_token | No | Opaque Oura v2 cursor from a previous collection response. Pass it back unchanged with the same after/before window to resume. Oura has no integer page index and no page-size parameter; do not invent or increment a page number. | |
| privacy_mode | No | Optional per-call privacy override. Defaults to OURA_PRIVACY_MODE or structured. raw returns upstream Oura JSON. summary minimizes sensitive health and profile details. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Required true when privacy_mode=raw (agent escalation of redaction). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| records | Yes | |
| endpoint | Yes | |
| has_more | Yes | True when more records exist beyond this response, either upstream (a resumable next_token) or because the limit cap dropped records (truncated). If truncated is true, raise limit or set all_pages; if next_token is present, pass it back. |
| truncated | Yes | True when the limit cap dropped records that had already been fetched. Raise limit or set all_pages (or narrow after/before) to see them. next_token is omitted in this case so a resume cannot skip those rows. |
| next_token | No | Opaque Oura v2 cursor to resume from. Pass this back as input next_token with the same after/before window. Present only when more records exist upstream AND this call did not locally drop fetched records (truncated is false). When truncated is true, next_token is omitted: raise limit or set all_pages instead of following a cursor, which would skip the dropped records. Never increment a page number. |
| privacy_mode | Yes | |
| pages_fetched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds the auth requirement (workout scope) and that results are summaries, but it does not disclose ordering or pagination behavior in prose; those appear later in parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. Every word earns its place: the verb-resource statement and the scoping/auth requirement. It is appropriately front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool definition is operationally complete because the schema describes pagination, ordering, privacy, and cursor behaviors, and an output schema exists so return values do not need prose explanation. The main gap is the absence of explicit wanneer-to-use guidance among the many sibling tools, but this does not prevent a knowledgeable agent from selecting it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89% and the individual parameter descriptions are very detailed (oldest-first ordering, cursor semantics, limit truncation, privacy modes). The main description adds no parameter-level meaning, so with high schema coverage the appropriate baseline is 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb and resource: 'List Oura workout summaries.' The resource is specific enough to differentiate it from sibling tools like oura_list_sleep and oura_list_daily_activity, and the additional scope requirement narrows its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is the implicit prerequisite 'Requires workout scope.' There is no statement about when to prefer this over sibling list tools, no exclusion criteria, and no mention of alternatives. The agent must infer use from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_onboardingOura Onboarding (shared wellness profile)ARead-onlyIdempotent
Return the 11-question Delx wellness onboarding flow (in English or pt-BR) plus the current shared profile state and missing critical fields. Read-only. The agent should ask these questions one-by-one, then call oura_profile_update with explicit_user_intent=true to save. The same profile is reused by every Delx Wellness connector (WHOOP, Garmin, Nourish, etc.) — agents can call the equivalent {connector}_onboarding tools to cover their respective domains, or rely on this one since all connectors share the same questions.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Onboarding locale. Defaults to 'en'. Use 'pt-BR' for Portuguese (Brazil). | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Declares read-only behavior, matches annotations (readOnlyHint, idempotentHint, non-destructive), and adds context about subsequent update step. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with main purpose, no wasted words. Efficient and structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description clarifies return content (flow + profile state + missing fields) and usage pattern, plus relates to sibling tools. Complete for a read-only onboarding retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 50% of params with descriptions (locale has description, response_format has default and enum but no description). Description adds that locale can be 'en' or 'pt-BR' and that response_format defaults to markdown, plus context about the flow. Adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns the 11-question wellness onboarding flow plus profile state and missing fields, and distinguishes from sibling tools by noting that all connectors share the same profile and questions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: the agent should ask questions one-by-one, then call oura_profile_update. Also explains when to use this vs other connector onboarding tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_privacy_auditOura Privacy AuditBRead-onlyIdempotent
Return local privacy, cache, token-path and env-presence posture without revealing secret values.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| project | Yes | |
| cache_path | Yes | |
| token_path | Yes | |
| unofficial | Yes | |
| stdout_safe | Yes | |
| cache_enabled | Yes | |
| config_source | Yes | |
| secret_env_vars | Yes | |
| local_config_path | Yes | |
| local_config_exists | Yes | |
| raw_payloads_opt_in | Yes | |
| privacy_mode_default | Yes | |
| required_env_present | Yes | |
| gps_redaction_default | Yes | |
| redacted_key_patterns | Yes | |
| local_config_secure_permissions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent, non-destructive), the description adds that secret values are not revealed, which is critical for privacy audit. It also lists the categories of information returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the key action 'Return', and every word adds value. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values need not be described. However, the description omits the optional parameter's effect and doesn't differentiate from sibling tools like oura_cache_status, which may cause confusion. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should explain the response_format parameter but does not. It only describes the tool's output, not the input. The parameter's purpose (choosing output format) is left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns local privacy, cache, token-path, and env-presence posture, and explicitly says it avoids revealing secret values. This distinguishes it from siblings like oura_cache_status or oura_connection_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or context for use. The description is purely declarative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_profile_getOura Profile Get (shared wellness profile)BRead-onlyIdempotent
Read the shared Delx wellness profile (~/.delx-wellness/profile.json). Returns the user's preferred name, body basics, goals, devices, training context, nutrition context, agent preferences, and missing critical fields. Cross-connector — the same profile is also available from other Delx Wellness MCPs (WHOOP, Garmin, Nourish, Fitbit, etc). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint. The description adds context on profile contents but does not introduce new behavioral traits beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with the core action in the first sentence and additional details in subsequent sentences. No unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose and output fields adequately for a read-only tool with annotations, but fails to explain the response_format parameter, limiting completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'response_format' lacks schema description (0% coverage) and is not mentioned in the description. While optional and self-explanatory, the description adds no value for parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read the shared Delx wellness profile' with a verb+resource, lists the contents, and mentions cross-connector availability. It does not explicitly differentiate from the sibling update tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context about cross-connector availability and implies read-only use, but lacks explicit when-to-use vs when-not-to-use guidance or direct alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_profile_updateOura Profile Update (shared wellness profile)A
Persist a partial patch to the shared Delx wellness profile (~/.delx-wellness/profile.json). REQUIRES explicit_user_intent=true. Top-level fields stored: profile (preferred_name, language, timezone, units, age_or_birth_year, height, weight, sex_or_gender_context), goals, devices, training, nutrition, preferences, safety, notes. NEVER stores OAuth tokens, API keys, refresh tokens, cookies, or any secret-shaped field — writes will be rejected at validation time. Cross-connector — the same profile is read by other Delx Wellness MCPs.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | Partial WellnessProfileDocument patch. Top-level keys may be: profile, goals, devices, training, nutrition, preferences, safety, notes. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Must be true. Set this AFTER the user has explicitly confirmed they want to save these changes to the shared wellness profile. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses writing to a specific file, the requirement for explicit user intent, and the rejection of secret-shaped fields. It adds significant behavioral context beyond the annotations, which already indicate non-read-only and non-destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus a bullet list of fields. It is front-loaded with the core action and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 params, nested objects) and no output schema, the description covers what it stores and rejects. It could mention typical return values, but it's fairly complete for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning by explaining the patch parameter is partial and listing allowed keys, and clarifying the explicit_user_intent parameter must be true after user confirmation. With 67% schema coverage, this adds value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool persists a partial patch to a shared wellness profile file, listing the specific top-level fields it can store. It distinguishes itself from sibling tools like oura_profile_get by focusing on updates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly requires explicit_user_intent=true, indicating when to use the tool. However, it does not directly contrast with alternatives (e.g., oura_profile_get) or specify when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_quickstartOura QuickstartARead-onlyIdempotent
Personalized 3-step setup walkthrough for the human user. Adapts to current state (env vars set? token present? what's next?). Call this first when the user asks 'how do I connect Oura?'
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds behavioral traits: adapts to current state (env vars, token), which is useful beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Front-loaded with purpose and usage. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one optional param, clear annotations), the description is fully adequate. No need for output schema or nested objects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% but there's only one optional parameter with an enum and default. The description doesn't add parameter details, but the schema is self-explanatory. Baseline 3 plus a point for simplicity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it's a personalized 3-step setup walkthrough for connecting Oura, distinguishing it from sibling tools like oura_connection_status or oura_get_auth_url. The verb 'walkthrough' and resource 'setup' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this first when the user asks how do I connect Oura?' providing clear when-to-use guidance. No mention of when not to use, but the context makes it obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_revoke_accessRevoke Oura OAuth AccessADestructive
Revoke the current Oura OAuth grant and delete the local token file. Use only when the user explicitly wants to disconnect Oura. Gated by explicit_user_intent: true (requires explicit user intent).
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown | |
| explicit_user_intent | No | Must be true after the user explicitly asked to disconnect. Prevents agents from revoking autonomously. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | Yes | |
| token_path | Yes | |
| local_tokens_cleared | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds that it 'deletes the local token file,' which explains the destructive nature beyond annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both essential. First sentence states the action, second gives usage condition. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations (destructiveHint, openWorldHint) and an output schema (present but not shown), the description covers the core behavior and usage. However, it could briefly mention what the user experiences post-revocation (e.g., disconnection confirmed). Still, it is adequately complete for a simple destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: only explicit_user_intent has a description in the schema. The description reiterates the intent parameter but adds no new detail for response_format, which has an enum and default. The schema's own description for explicit_user_intent is already clear ('Must be true after the user explicitly asked to disconnect'). The description adds marginal value: it repeats the gate requirement but does not explain response_format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Revoke the current Oura OAuth grant and delete the local token file.' It specifies the verb (revoke) and the resource (OAuth grant, token file), distinguishing it from related tools like oura_connection_status and oura_get_auth_url.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use: 'Use only when the user explicitly wants to disconnect Oura.' It also notes the gate: 'Gated by explicit_user_intent: true (requires explicit user intent).' This provides clear context and exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_weekly_summaryOura Weekly Recovery ReviewARead-onlyIdempotent
Build a weekly Oura scorecard with readiness, sleep, activity, HRV availability, bottlenecks and actions. Read-only and non-medical.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Recent analysis window in days. | |
| timezone | No | IANA timezone used only for display, e.g. America/New_York. | UTC |
| compare_days | No | Prior comparison window in days. Use 0 to disable comparison. | |
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| generated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, etc. The description adds 'Read-only and non-medical' which reinforces safety and adds non-medical disclaimer. No contradictions; the description provides modest additional context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads key information (weekly scorecard components, read-only, non-medical). Every phrase earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description names output components but does not explain the comparison feature (compare_days parameter) or clarify that 'days' can exceed 7, making it not strictly weekly. With output schema present, return values are covered, but missing context about parameter interplay leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75% (3 of 4 parameters described). The description does not add meaning beyond what the schema provides, so it meets the baseline expectation without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool builds a weekly Oura scorecard with specific components (readiness, sleep, activity, HRV, bottlenecks, actions). It distinguishes from siblings like oura_daily_summary and includes the read-only and non-medical nature, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies weekly use but does not explicitly state when to use this tool vs alternatives like oura_daily_summary or oura_wellness_context. No guidance on when not to use or prerequisites is provided, leaving the agent to infer from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oura_wellness_contextOura Wellness ContextARead-onlyIdempotent
Normalize Oura readiness, sleep and activity load into the shared wellness_context shape for recommendation engines.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window for normalized Oura wellness context. | |
| notes | No | ||
| soreness | No | ||
| timezone | No | IANA timezone used only for display, e.g. America/New_York. | UTC |
| injury_flags | No | ||
| response_format | No | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| source | Yes | |
| soreness | Yes | |
| generated_at | Yes | |
| injury_flags | Yes | |
| recent_training_load | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint. The description adds that the tool normalizes data into a shared shape, which is consistent but does not reveal additional behavioral details beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the action and target, no unnecessary words. Efficient and direct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description does not explain the shape or structure of the returned wellness context. It also fails to describe how the 6 input parameters influence the output. For a normalization tool, this is a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (33%), but the description does not explain how parameters like days, notes, soreness, etc., affect the normalization. The description mentions readiness, sleep, and activity load but does not map them to parameters, leaving agents uncertain about their use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: normalizing Oura readiness, sleep, and activity load into a shared wellness_context shape specifically for recommendation engines. This distinguishes it from sibling tools that provide raw data or other processed views.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for recommendation engines but does not explicitly state when to use this tool versus siblings like oura_list_daily_activity. No exclusion criteria or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct data type or action: readiness, SpO2, heart rate, sessions, sleep, tags, workouts, onboarding, profile get, and profile update. No two tools have overlapping purposes.
All tools follow a consistent 'oura_verb_noun' pattern using snake_case, with verbs like 'list', 'onboarding', 'profile_get', 'profile_update'. The naming is uniform and predictable.
10 tools is well-scoped for an Oura API wrapper, covering the main data endpoints and additional profile management without being excessive or too sparse.
The tool set covers all major Oura data retrieval operations (readiness, SpO2, HR, sleep, sessions, tags, workouts) and includes a complete profile management subsystem with onboarding, get, and update.
Maintenance
Related MCP Connectors
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Related MCP Servers
- AlicenseAqualityAmaintenanceLocal-first MCP server that connects AI agents to your Fitbit activity, sleep, heart-rate, HRV, SpO2 and weight data.331631MIT
- AlicenseAqualityAmaintenanceLocal-first MCP server that connects AI agents to your Withings body, sleep, activity and heart data.232453MIT
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Garmin sleep, HRV, Body Battery, stress, training readiness and activities, keeping tokens on your machine.4271910MIT
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Polar training, sleep, Nightly Recharge and continuous-sample data.372155MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/davidmosiah/oura-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server