Oura Mcp
Sleep, readiness, HRV, resting heart rate, activity and stress from your Oura Ring
- Transport
- Not stated
- Package
- —
- Registry id
- io.github.AntVsl/oura-mcp
No install snippet on purpose. A working MCP config is a command, its arguments and an environment block — the last two are where API keys live, so this catalogue never stores them and cannot publish them. Follow the link above for the authors' own instructions.
Gives Claude, ChatGPT, and Codex access to your Oura Ring data: sleep, readiness, HRV, resting heart rate, activity, SpO₂, stress.
Ask "how did I sleep last week" and your MCP client calls the right tool and gets a summary back — not a wall of JSON:
{
"metric": "sleep_detail",
"period": { "start": "2026-07-23", "end": "2026-07-29", "days": 7 },
"stats": {
"total_h": { "mean": 7.1, "min": 5.9, "max": 8.4 },
"deep_h": { "mean": 1.3, "min": 0.9, "max": 1.8 },
"avg_hrv": { "mean": 42, "min": 31, "max": 55, "trend_per_week": 1.8 },
"efficiency": { "mean": 88, "min": 82, "max": 93 }
}
}
New to MCP? Model Context Protocol lets AI clients reach external data. Install this server, connect it once, then ask about your sleep in plain language. No coding involved.
Works locally in Claude Code and Codex, and remotely in claude.ai and ChatGPT once it is deployed to a server of your own.
Читать по-русски: README.ru.md
Why another one
- Compact by default. Tools return per-day values plus statistics with a
trend, not the raw API payload. Raw responses stay one
raw=Trueaway. A month of heart-rate data shrinks by more than 10×. - One codebase, two transports.
stdiofor local use,streamable-httpfor remote. A flag apart, not a rewrite. - Timezone-correct. Oura filters some endpoints by an internal UTC
timestamp while returning a local
dayfield, and returns heart-rate timestamps in UTC. Both quietly lose or misplace data outside UTC. This server handles it — see Timezone handling. - Survives flaky networks. Follows
next_tokenpagination, retries dropped connections with exponential backoff, and turns HTTP status codes into messages that say what to fix. - Try before authorizing. Oura's sandbox works with no credentials at all.
Quick start
Requires uv. No Oura token needed for this part.
git clone https://github.com/AntVsl/oura_mcp && cd oura_mcp
cp .env.example .env
uv sync
Check that data flows (hits Oura's sandbox, no auth required):
uv run python -m my_oura_mcp.smoke
Connect it locally — the server prints the commands with the absolute path already filled in, and writes nothing itself:
uv run my-oura-mcp install
Then ask your client for an Oura summary. The get_status tool reports which
mode the server is in.
Tools
| Tool | Returns | Default range |
|---|---|---|
get_daily_summary |
Sleep, readiness and activity scores at once | 7 days |
get_sleep |
Sleep stages, efficiency, HRV, resting HR, breathing, temperature | 7 days |
get_sleep_score |
Daily sleep score only — lighter than get_sleep |
7 days |
get_readiness |
Readiness score, HRV balance, temperature deviation | 7 days |
get_activity |
Activity score, steps, calories | 7 days |
get_heartrate |
Per-minute heart rate collapsed to daily stats | 3 days |
get_spo2 |
Blood oxygen during sleep, breathing disturbance index | 7 days |
get_stress |
Time under load and in recovery | 7 days |
get_heart_health |
Cardiovascular age, VO₂max | 30 days |
get_tags |
Tags you entered in the Oura app | 30 days |
get_status |
Server mode and authorization state | — |
Every data tool takes either days_back or an explicit start_date/end_date
pair (YYYY-MM-DD), plus raw to get Oura's untouched response.
Using your own data
The sandbox returns synthetic data. For your own you need an Oura application and a one-time authorization — no review to pass, a fresh application works immediately.
From the project's README.