Connects Claude to the Oura Ring API v2 via OAuth, exposing sleep, activity, readiness, heart rate, and workout data as MCP tools. Ships with a configure wizard that walks you through browser auth and writes tokens to disk with proper permissions. Once installed, you get tools like oura_api_get for generic endpoint access with auto-pagination, oura_authenticate to refresh expired tokens, and oura_api_list_paths to discover available routes. Designed for querying your own ring data in chat workflows like weekly sleep reviews or recovery checks. The companion skill bundle includes per-endpoint references and workflow recipes if you want structured prompts.
Public tool metadata for what this MCP can expose to an agent.
personal_info.listSingle Personal Info DocumentSingle Personal Info Document
No parameter schema in public metadata yet.
tag.listMultiple Tag Documents3 paramsMultiple Tag Documents
end_datevaluenext_tokenvaluestart_datevalueenhanced_tag.listMultiple Enhanced Tag Documents3 paramsMultiple Enhanced Tag Documents
end_datevaluenext_tokenvaluestart_datevalueworkout.listMultiple Workout Documents3 paramsMultiple Workout Documents
end_datevaluenext_tokenvaluestart_datevaluesession.listMultiple Session Documents3 paramsMultiple Session Documents
end_datevaluenext_tokenvaluestart_datevaluedaily_activity.listMultiple Daily Activity Documents3 paramsMultiple Daily Activity Documents
end_datevaluenext_tokenvaluestart_datevaluedaily_sleep.listMultiple Daily Sleep Documents3 paramsMultiple Daily Sleep Documents
end_datevaluenext_tokenvaluestart_datevaluedaily_spo2.listMultiple Daily Spo2 Documents3 paramsMultiple Daily Spo2 Documents
end_datevaluenext_tokenvaluestart_datevaluedaily_readiness.listMultiple Daily Readiness Documents3 paramsMultiple Daily Readiness Documents
end_datevaluenext_tokenvaluestart_datevaluesleep.listMultiple Sleep Documents3 paramsMultiple Sleep Documents
end_datevaluenext_tokenvaluestart_datevaluesleep_time.listMultiple Sleep Time Documents3 paramsMultiple Sleep Time Documents
end_datevaluenext_tokenvaluestart_datevaluerest_mode_period.listMultiple Rest Mode Period Documents3 paramsMultiple Rest Mode Period Documents
end_datevaluenext_tokenvaluestart_datevaluering_configuration.listMultiple Ring Configuration Documents1 paramsMultiple Ring Configuration Documents
next_tokenvaluedaily_stress.listMultiple Daily Stress Documents3 paramsMultiple Daily Stress Documents
end_datevaluenext_tokenvaluestart_datevaluedaily_resilience.listMultiple Daily Resilience Documents3 paramsMultiple Daily Resilience Documents
end_datevaluenext_tokenvaluestart_datevaluedaily_cardiovascular_age.listMultiple Daily Cardiovascular Age Documents3 paramsMultiple Daily Cardiovascular Age Documents
end_datevaluenext_tokenvaluestart_datevaluev_o2_max.listMultiple Vo2 Max Documents3 paramsMultiple Vo2 Max Documents
end_datevaluenext_tokenvaluestart_datevaluetag.getSingle Tag Document1 paramsSingle Tag Document
document_idstringenhanced_tag.getSingle Enhanced Tag Document1 paramsSingle Enhanced Tag Document
document_idstringworkout.getSingle Workout Document1 paramsSingle Workout Document
document_idstringsession.getSingle Session Document1 paramsSingle Session Document
document_idstringdaily_activity.getSingle Daily Activity Document1 paramsSingle Daily Activity Document
document_idstringdaily_sleep.getSingle Daily Sleep Document1 paramsSingle Daily Sleep Document
document_idstringdaily_spo2.getSingle Daily Spo2 Document1 paramsSingle Daily Spo2 Document
document_idstringdaily_readiness.getSingle Daily Readiness Document1 paramsSingle Daily Readiness Document
document_idstringsleep.getSingle Sleep Document1 paramsSingle Sleep Document
document_idstringsleep_time.getSingle Sleep Time Document1 paramsSingle Sleep Time Document
document_idstringrest_mode_period.getSingle Rest Mode Period Document1 paramsSingle Rest Mode Period Document
document_idstringring_configuration.getSingle Ring Configuration Document1 paramsSingle Ring Configuration Document
document_idstringdaily_stress.getSingle Daily Stress Document1 paramsSingle Daily Stress Document
document_idstringdaily_resilience.getSingle Daily Resilience Document1 paramsSingle Daily Resilience Document
document_idstringdaily_cardiovascular_age.getSingle Daily Cardiovascular Age Document1 paramsSingle Daily Cardiovascular Age Document
document_idstringv_o2_max.getSingle Vo2 Max Document1 paramsSingle Vo2 Max Document
document_idstringwebhook.subscription.listList Webhook SubscriptionsList Webhook Subscriptions
No parameter schema in public metadata yet.
webhook.subscription.createCreate Webhook Subscription4 paramsCreate Webhook Subscription
data_typestringtag · enhanced_tag · workout · session · sleep · daily_sleepevent_typestringcreate · update · deletecallback_urlstringverification_tokenstringwebhook.subscription.getGet Webhook Subscription1 paramsGet Webhook Subscription
idstringwebhook.subscription.updateUpdate Webhook Subscription5 paramsUpdate Webhook Subscription
idstringdata_typevalueevent_typevaluecallback_urlvalueverification_tokenstringwebhook.subscription.deleteDelete Webhook Subscription1 paramsDelete Webhook Subscription
idstringwebhook.subscription.renew.updateRenew Webhook Subscription1 paramsRenew Webhook Subscription
idstringheartrate.listMultiple Heart Rate Documents3 paramsMultiple Heart Rate Documents
next_tokenvalueend_datetimevaluestart_datetimevalueA Model Context Protocol server for the Oura Ring API v2. Exposes sleep, activity, readiness, heart rate, and workout data to MCP-compatible clients (Claude Desktop, Claude Code, Cursor, ...) via OAuth.
npx @yasuakiomokawa/oura-mcp configure
The wizard collects your Oura Client ID/Secret, walks through browser OAuth, saves tokens to ~/.config/oura-mcp/, and adds an mcpServers.oura entry to any detected MCP client config. Restart the client and the tools below are available.
Re-running configure pre-fills the saved Client ID / port so you only need to press Enter to keep them. Type --force to wipe saved state and start from scratch:
npx @yasuakiomokawa/oura-mcp configure --force
http://localhost:54321/callback
(or http://localhost:<port>/callback if you customize OURA_CALLBACK_PORT)npx @yasuakiomokawa/oura-mcp configureThree paths depending on your client:
1. MCP Registry (auto-discovery clients)
Once published to the official MCP Registry, supported clients can install io.github.YasuakiOmokawa/oura-mcp from their UI. The wizard step still has to run once to obtain OAuth tokens.
2. Manual config (Claude Desktop / Claude Code / Cursor)
Run npx @yasuakiomokawa/oura-mcp configure — Step 4 of the wizard auto-detects:
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)~/.claude.json./.mcp.json~/.cursor/mcp.json./.cursor/mcp.jsonEach detected file is backed up to <file>.bak.<ISO-timestamp> before an atomic write.
To configure manually, add to your client config:
{
"mcpServers": {
"oura": {
"command": "npx",
"args": ["-y", "@yasuakiomokawa/oura-mcp"]
}
}
}
3. Skill (optional)
The companion oura-api-skill ships per-endpoint reference and three workflow recipes (weekly review / sleep trend / recovery check). Bundle it as a Claude Code plugin or import into your skills directory.
| Tool | Purpose |
|---|---|
oura_authenticate | Start OAuth flow in browser; returns the URL. Used after refresh_token expires. |
oura_auth_status | Check current token validity and expiry. |
oura_clear_auth | Wipe stored tokens. |
oura_api_list_paths | List every supported GET endpoint with summaries. |
oura_api_get | Generic GET to /v2/.... Auto-paginates via max_pages (1-20) or accepts next_token in params. |
oura_api_get returns structuredContent with { status, data, next_token, pages_fetched, has_more }.
Two ways. The config file (Option A) is the recommended path — it stores secrets at-rest with 0600 and is self-healing. Environment variables (Option B) are kept for CI / Docker / ephemeral environments where writing a file is impractical, but they leak more easily and are not recommended for daily use.
Run the wizard once and forget about it:
npx @yasuakiomokawa/oura-mcp configure
This writes:
~/.config/oura-mcp/config.json # 0600, contains clientId / clientSecret / callbackPort
~/.config/oura-mcp/tokens.json # 0600, contains the OAuth access / refresh tokens
Permissions are re-checked on every load and chmod'd back to 0600 if anything else touched them.
config.json schema:
{
"schemaVersion": 1,
"clientId": "...",
"clientSecret": "...",
"callbackPort": 54321
}
OURA_CLIENT_ID=...
OURA_CLIENT_SECRET=... # must be set together with OURA_CLIENT_ID
OURA_CALLBACK_PORT=54321 # optional; safe to set in env regardless of Option A/B
When the server boots and both OURA_CLIENT_ID and OURA_CLIENT_SECRET are set, it uses them and emits a config.env_credentials warning to stderr.
Why not recommended:
process.env is readable from /proc/<pid>/environ by any process running as the same user.process.env will leak the secret.OURA_CLIENT_SECRET=... npx ... typed at the shell ends up in shell history.OURA_CALLBACK_PORT is not a secret and is fine to pass via env in either mode.
args for secretsProcess arguments are visible to other users via ps / /proc/<pid>/cmdline. Use the env block of your MCP client config:
{
"mcpServers": {
"oura": {
"command": "npx",
"args": ["-y", "@yasuakiomokawa/oura-mcp"],
"env": { "OURA_CLIENT_ID": "...", "OURA_CLIENT_SECRET": "..." }
}
}
}
oura_authenticate (in chat) or npx @yasuakiomokawa/oura-mcp configure (in terminal).OURA_CALLBACK_PORT=<other port> and update the redirect URI in your Oura developer app to match.oura_api_list_paths. Common slips: missing /v2/ prefix, typo in daily_sleep.OURA_LOG_LEVEL=debug for verbose stderr logging.git clone https://github.com/YasuakiOmokawa/oura-mcp.git
cd oura-mcp
npm install
npm test
npm run build
Useful scripts:
npm run lint / npm run typecheck — Biome + TypeScript checksnpm run test:coverage — Vitest with V8 coveragenpm run update:docs — re-fetch the Oura OpenAPI schema and regenerate skills/oura-api-skill/references/OURA_CLIENT_IDOptional. Alternative to `npx oura-mcp configure`. Both OURA_CLIENT_ID and OURA_CLIENT_SECRET must be set together.
OURA_CLIENT_SECRETsecretOptional. See OURA_CLIENT_ID.
OURA_CALLBACK_PORTOAuth callback port (default 54321)