The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Oura MCP listing page.
Ask your Oura Ring anything. In ChatGPT or Claude, in any language.
A remote MCP server that connects Oura Ring data to any MCP client. No UI, no app, no model of its own: the assistant you already pay for calls the tools and explains your data in whatever language you speak.
You: how did I sleep this week?
ChatGPT: Your week was uneven, averaging 65/100. Best night was June 29 (77) with strong deep sleep. The rough one was July 2 (47): little REM, low efficiency, and your bedtime drifted way off schedule. The main pattern to fix is sleep timing.
Get started in two clicks: download oura-mcp.mcpb from the latest release and double-click it — Claude Desktop installs the extension, and demo mode works instantly with zero setup (fake sample data, no Oura account needed). Connecting your own ring takes ~5 minutes: Run locally.
Things to try once connected:
One small Node.js process, stateless — a fresh MCP server instance per request. The client model picks the right tools, the server returns compact, pre-shaped JSON, the model does the talking. Curious how it's put together and why? See docs/ARCHITECTURE.md.
When you don't need this: if you want dashboards and charts, the Oura app already does that; if you want raw data for scripts, call the Oura API directly. This server exists for one thing: making your ring data conversational in the chat client you already use.
| Tool | Ask things like |
|---|---|
oura_get_sleep | "How did I sleep this week?" |
oura_get_sleep_detail | "When did I fall asleep? How much deep sleep? Night heart rate?" |
oura_get_readiness | "Should I train today? Is my temperature elevated?" |
oura_get_activity | "How many steps and calories yesterday?" |
oura_get_stress | "How stressed was I on Monday?" |
oura_get_vitals | "What's my SpO2, VO2 max, cardiovascular age?" |
oura_get_workouts | "How was my run? Did I meditate this week?" |
oura_get_tags | "Did coffee affect my sleep?" (reads tags you log in the Oura app) |
oura_get_heartrate | "What was my pulse this afternoon?" (hourly aggregates) |
oura_get_profile | "How charged is my ring?" |
All tools are read-only and marked with readOnlyHint, so ChatGPT does not nag you for confirmation on every call.
deep_min, efficiency_pct), raw time series and internal IDs stripped. A tool response is 0.2–3 KB, not 50.response_format: concise | detailed on data-heavy tools. Concise by default, breakdowns on demand.Oura deprecated personal access tokens in December 2025, so an OAuth app is the only supported way to access your data — this is Oura's rule, not this project's. Registering one is free, instant, and needs no review for personal use. It is also the best part of the design: your tokens are issued to your app and live on your server, so your health data never depends on anyone else's infrastructure — including mine.
No server to deploy: Claude Desktop starts oura-mcp itself as a local process.
Install (two clicks): download oura-mcp.mcpb from the latest release, double-click it, press Install. Done — demo mode works immediately (fake sandbox data, no Oura account), so you can try every tool before any setup. Claude will remind you the numbers are samples.
Connect your real ring (~5 minutes):
http://localhost:8888/callback~/.oura-mcp/, chmod 600).Prefer a config-file setup, or using a different stdio client? The docker route works everywhere:
Ask Claude "how did I sleep this week?" — you'll get answers from Oura's sandbox data, which is exactly how the real thing behaves.
http://localhost:8888/callback) and put the credentials in an .env file next to a copy of docker-compose.yml./data: docker compose --profile setup up get-tokenRunning from source instead of Docker: npm install && npm run build, then use "command": "node", "args": ["/path/to/oura-mcp/dist/src/stdio.js"] (with cwd at the repo so data/tokens.json resolves).
Keep PORT=3000 in .env (or adjust the compose port mapping to match).
Needs Node 22+.
Want to hack on it without a ring? OURA_SANDBOX=1 npm run dev serves Oura's sandbox data, no account needed.
Your MCP endpoint is https://your-host/mcp/<MCP_PATH_SECRET>.
Set up on desktop web; the app then works in mobile conversations too.
Claude connects from Anthropic's cloud, so the server must be publicly reachable (no localhost).
Clients that only speak stdio can use the mcp-remote bridge:
| Variable | Required | Purpose |
|---|---|---|
OURA_CLIENT_ID | yes | Your Oura app's client id |
OURA_CLIENT_SECRET | yes | Your Oura app's client secret |
MCP_PATH_SECRET | yes | Long random URL path segment (openssl rand -hex 24) — the access control for the endpoint |
PORT | no | HTTP port, default 3000 |
OURA_SANDBOX | no | 1 = serve Oura's fake sandbox data, no account needed |
data/tokens.json). Re-run get-token.MCP_PATH_SECRET. Copy the full endpoint URL again.resilience / vo2_max come back empty — Oura computes these after ~2 weeks of wear / a fitness test; the tools work, the account has no data yet.Self-hosted and single-user by design: your data flows directly between your server and Oura, which is also what Oura's API terms expect from personal integrations. It runs my household's ring today.
Coming next: a one-click Claude Desktop extension (.mcpb) and a free-tier Cloudflare Workers deploy button — same server, no VM needed. Open an issue if you want one of these sooner.