Oura MCP
Local-first MCP server that gives an AI agent read access to your own Oura Ring data (readiness, sleep, activity, HRV, SpO2, workouts) via a local OAuth flow — tokens never leave your machine.
Daily & weekly briefs —
oura_daily_summary(readiness, sleep, activity, heart-rate, SpO2 snapshot with lookback and timezone) andoura_weekly_summary(scorecard, prior-week comparison, bottlenecks, next-week actions).List daily collections —
oura_list_daily_readiness,oura_list_daily_sleep,oura_list_daily_activity,oura_list_daily_spo2withafter/beforedate filters,limit,next_tokencursor resume,all_pages/max_pages, and per-call privacy override.List detailed collections —
oura_list_sleep(sleep stages/timing),oura_list_workouts,oura_list_heartrate,oura_list_sessions,oura_list_tags, all with the same pagination and privacy controls.Profile —
oura_get_personal_info(requirespersonalscope), plus the shared cross-connector Delx wellness profile:oura_profile_get,oura_profile_update(requiresexplicit_user_intent), andoura_onboarding(11-question flow, EN/pt-BR).Setup & auth —
oura_quickstart(adaptive 3-step walkthrough),oura_connection_status(config/token/scope/Node/client readiness),oura_get_auth_url,oura_exchange_code, andoura_revoke_access(intent-gated disconnect + local token deletion).Discovery & self-documentation —
oura_demo(synthetic readiness/sleep/activity payloads, no account needed),oura_capabilities,oura_agent_manifest(per-client install guidance),oura_data_inventory(domains, scopes, privacy modes),oura_privacy_audit,oura_cache_status.Normalized context for recommendation engines —
oura_wellness_contextmaps readiness/sleep/load plus soreness, injury flags and notes into a sharedwellness_contextshape.Privacy by design — tokens in
~/.oura-mcp/tokens.json(0600), never printed or returned to the client; privacy modessummary/structured/rawwith raw requiring explicit user intent; GPS and secret-shaped values redacted.Transport options — stdio by default, optional stateless Streamable HTTP bound to loopback only (
/health,/mcp).Prompt/resource guidance (from the README) —
oura_daily_checkin,oura_weekly_review,oura_heart_context_investigationprompts andoura://capabilities,oura://summary/daily,oura://latest/readinessresources; read-only, non-medical, not affiliated with Ōura.
Click on "Deploy 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 MCP show 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.
Upgrading to 0.8.0: read the migration guide for local-only HTTP, disabled authenticated-response caching, and stricter input/profile limits.
⚡ 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 # no effect: authenticated responses are never cached
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.
Inputs: client, response_format. Returns: links, oauth, client, hermes, +9 more
oura_cache_statusOura Cache StatusBRead-onlyIdempotent
Show optional local SQLite cache status. Enable with OURA_CACHE=sqlite or OURA_CACHE=true.
Inputs: response_format. Returns: path, enabled, entries, http_cache, +1 more
oura_capabilitiesOura MCP CapabilitiesARead-onlyIdempotent
Explain supported Oura data, privacy boundaries, recommended agent workflow and project links.
Inputs: response_format. Returns: links, creator, project, mcp_name, +8 more
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.
Inputs: client, response_format. Returns: ok, node, cache, oauth, +11 more
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.
Inputs: days, timezone, response_format. Returns: kind, generated_at
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.
Inputs: response_format. Returns: auth, kind, links, notes, +12 more
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.
Inputs: response_format.
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).
Inputs: code (required), response_format. Returns: ok, note, scope, expires_at, +1 more
oura_get_auth_urlGet Oura OAuth URLARead-onlyIdempotent
Generate an Oura OAuth authorization URL. Use this first when no local token exists.
Inputs: state, scopes, response_format. Returns: scopes, auth_url, next_step, redirect_uri
oura_get_personal_infoGet Oura Personal InfoBRead-onlyIdempotent
Get Oura personal profile fields available to the authorized app. Requires the personal scope.
Inputs: privacy_mode, response_format, explicit_user_intent. Returns: data, endpoint, privacy_mode
oura_list_daily_activityOura Daily ActivityARead-onlyIdempotent
List daily Oura activity summaries. Supports start/end date filters through after/before and Oura cursor pagination.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
oura_list_daily_readinessOura Daily ReadinessBRead-onlyIdempotent
List Oura readiness summaries and contributors. Requires daily scope. Not medical advice.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
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.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
oura_list_daily_spo2Oura Daily SpO2ARead-onlyIdempotent
List daily Oura SpO2 averages recorded during sleep when available. Requires spo2 scope. Not medical advice.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
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.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
oura_list_sessionsOura SessionsARead-onlyIdempotent
List guided and unguided Oura app sessions when the user granted session scope.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
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.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
oura_list_tagsOura TagsARead-onlyIdempotent
List user-entered Oura tags when the user granted tag scope.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
oura_list_workoutsOura WorkoutsARead-onlyIdempotent
List Oura workout summaries. Requires workout scope.
Inputs: after, limit, before, all_pages, +5 more. Returns: count, records, endpoint, has_more, +4 more
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.
Inputs: locale, response_format.
oura_privacy_auditOura Privacy AuditBRead-onlyIdempotent
Return local privacy, cache, token-path and env-presence posture without revealing secret values.
Inputs: response_format. Returns: notes, project, cache_path, token_path, +13 more
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.
Inputs: response_format.
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.
Inputs: patch (required), response_format, explicit_user_intent.
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?'
Inputs: response_format.
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).
Inputs: response_format, explicit_user_intent. Returns: ok, note, token_path, local_tokens_cleared
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.
Inputs: days, timezone, compare_days, response_format. Returns: kind, generated_at
oura_wellness_contextOura Wellness ContextARead-onlyIdempotent
Normalize Oura readiness, sleep and activity load into the shared wellness_context shape for recommendation engines.
Inputs: days, notes, soreness, timezone, +2 more. Returns: notes, source, soreness, generated_at, +2 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
Multiple tools have unclear boundaries: oura_capabilities, oura_data_inventory, oura_agent_manifest, and oura_quickstart all describe server capability/setup information, while oura_connection_status and oura_privacy_audit both report local config/privacy posture. The near-twin names oura_list_daily_sleep vs oura_list_sleep and oura_get_personal_info vs oura_profile_get are easily confused despite different underlying data.
The consistent oura_ snake_case prefix and the repeated list_ verb for data retrieval tools provide some pattern, but the verb usage is mixed: two get_ tools, one update_/exchange_/revoke_, and a dozen noun-only names (oura_capabilities, oura_demo, oura_onboarding, oura_quickstart). Resource naming is also inconsistent — daily_activity, daily_sleep, daily_readiness, daily_spo2 use the daily_ prefix while sleep, heartrate, workouts, sessions, tags do not, even though they share the same collection semantics.
At 27 tools, the count is too high for the apparent scope. Eight of them (quickstart, connection_status, data_inventory, agent_manifest, capabilities, demo, privacy_audit, cache_status) are meta/setup tools with substantial functional overlap and could be consolidated into two or three. The ten data-domain tools are justified by Oura's API breadth, but the inflated meta cluster pushes the total past reasonable bounds.
The auth lifecycle (get_auth_url, exchange_code, revoke_access), shared profile read/write, and read access to most major Oura domains are well covered, and the daily/weekly summary tools add helpful derived value. However, standard Oura endpoints for daily resilience, daily stress, daily HRV, and tag creation (POST) are missing, so agents answering questions in those domains will hit dead ends with no workaround.
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.
Hosted Apple Health MCP for Claude and ChatGPT, works outside the US. iPhone app, no local server.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Related MCP Servers
- AlicenseBqualityBmaintenanceLocal-first MCP server that connects AI agents to your Fitbit activity, sleep, heart-rate, HRV, SpO2 and weight data.33229 npm5MIT
- AlicenseBqualityBmaintenanceLocal-first MCP server that connects AI agents to your Withings body, sleep, activity and heart data.23224 npm5MIT
- AlicenseBqualityBmaintenanceLocal-first MCP server that connects AI agents to your Garmin sleep, HRV, Body Battery, stress, training readiness and activities, keeping tokens on your machine.242346 npm13MIT
- AlicenseBqualityBmaintenanceLocal-first MCP server that connects AI agents to your Polar training, sleep, Nightly Recharge and continuous-sample data.38348 npm6MIT