oura-mcp is a remote MCP (Model Context Protocol) server designed to connect Oura Ring health data to any chat client that supports MCP, such as ChatGPT or Claude. It has no user interface of its own, no standalone app, and no built-in model; instead, it acts as a bridge, letting the AI assistant the user already pays for call tools and interpret data in whatever language the user speaks.
Purpose
The core problem this project solves is making Oura Ring data conversational. Users can ask ChatGPT or Claude directly, for example, "How did I sleep this week?", and the assistant will call the tools provided by oura-mcp to retrieve and interpret data such as sleep, readiness, activity, stress, and heart rate. It is not intended for building dashboards or charts (the official Oura app already provides those), nor for retrieving raw data for use by scripts (the Oura API can be called directly).
Main capabilities
- Task-oriented tools: Groups 18 Oura API endpoints into 10 tools, matching the way people actually ask questions rather than a simple one-to-one wrapper.
- Token-efficient responses: The server converts durations to minutes, embeds units in field names (such as deep_min, efficiency_pct), and strips raw time series and internal IDs. A single tool response is 0.2–3 KB instead of 50 KB.
- Selectable response format: Data-intensive tools support response_format: concise | detailed, defaulting to concise and expandable on demand.
- Actionable errors: For example, when a heart rate query range is too wide, it returns "Please query 3 days or fewer, or use oura_get_readiness to view trends" instead of a 400 error.
- Sensible defaults: Every tool works with zero parameters (defaulting to the last 7 days).
- Read-only tools: All tools are marked with readOnlyHint, so ChatGPT will not ask for confirmation on every call.
How to use
Run locally (Claude Desktop)
- Download oura-mcp.mcpb from the latest release and double-click to install. Demo mode takes effect immediately, using fake sample data, with no Oura account required.
- Connect a real ring (about 5 minutes): at developer.ouraring.com/applications create your own Oura application (free, instant, no review required), with the redirect URI set to http://localhost:8888/callback。
- In Claude Desktop: Settings → Extensions → oura-mcp → Configure → paste the application's Client ID and Client Secret (the secret is stored in the operating system keychain).
- Ask Claude a health question, the browser will open the Oura consent page, and after approval you can view your own data. Tokens are kept locally (~/.oura-mcp/, permissions 600).
Docker method
- Register an OAuth application at developer.ouraring.com/applications (redirect URI http://localhost:8888/callback),将凭据放入 .env file, placed alongside a copy of docker-compose.yml.
- One-time browser consent, save the token to ./data: docker compose --profile setup up get-token.
- Run from source: npm install && npm run build, then use "command": "node", "args": ["/path/to/oura-mcp/dist/src/stdio.js"] (set cwd to the repository directory so that data/tokens.json can be resolved).
Self-hosting (remote: ChatGPT, claude.ai web version)
- Requires Node 22+ or Docker, and a host with public HTTPS (a free-tier VM with Caddy is enough). Avoid free tiers that sleep between requests, as ChatGPT cold starts will time out.
- Keep PORT=3000 in .env (or adjust the compose port mapping).
- Develop without a ring: OURA_SANDBOX=1 npm run dev provides Oura sandbox data.
- Connect a chat client: the MCP endpoint is https://your-host/mcp/<MCP_PATH_SECRET>.
- ChatGPT: Settings → Apps → Advanced settings → Enable developer mode; Settings → Apps → Create, paste the MCP endpoint URL, select "No authentication" for authentication; in a conversation, open the + menu → Developer mode → Enable app. This must be set up on the desktop web version; afterward, it will also be available in mobile conversations.
- Claude: Settings → Connectors → Add custom connector, paste the MCP endpoint URL → Add. Claude connects from Anthropic's cloud, so the server must be publicly reachable (it cannot be localhost).
- Clients that only support stdio can use the mcp-remote bridge.
Use cases
- Individual users who want to ask about Oura Ring health data in natural language.
- Users who already use ChatGPT or Claude and want to connect health data into the conversation.
- Users who care about privacy and want to self-host and have full control over their data.
Limitations
- Requires an active Oura subscription (the API returns 403 without a subscription), or use sandbox demo mode.
- Oura deprecated personal access tokens in December 2025; OAuth apps must be used. This is Oura's rule.
- The remote path requires a public HTTPS host, and it cannot be a free tier that sleeps on cold start.
- Self-hosting is designed for a single user, with data flowing directly between the user's server and Oura.
- Some metrics (such as resilience and vo2_max) only have data after wearing the ring for about 2 weeks or completing a fitness test.
- Prompt injection risk: health conversations should be treated as sensitive, and should not be mixed in the same chat with untrusted content such as web browsing.
Security and privacy
- OAuth tokens never leave the user's server; the MCP client only sees tool results.
- Read-only scope; the Oura API has no health data write endpoints, and neither does this server.
- No tool returns the user's email.
- The optional usage log records only tool names and durations, never health values.
Status and roadmap
- Self-hosted, single-user design, currently running the author's family's ring data.
- Coming soon: a one-click Claude Desktop extension (.mcpb) and a free-tier Cloudflare Workers deploy button.