Oura Ring MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| OURA_SANDBOX | No | Set to 1 to serve Oura's public sample data instead of your account. No auth step needed. | |
| OURA_CLIENT_ID | No | Your Oura API application's client ID (the `auth` command asks for it if unset; otherwise read from the token file). | |
| OURA_TOKEN_PATH | No | Where credentials are stored. Must be absolute (`~/` is expanded). Honours XDG_CONFIG_HOME. Defaults to ~/.config/oura-ring-mcp/tokens.json. | ~/.config/oura-ring-mcp/tokens.json |
| OURA_REDIRECT_URI | No | Must exactly match a redirect URI registered on your Oura API application. Defaults to http://localhost:8787/callback. | http://localhost:8787/callback |
| OURA_CLIENT_SECRET | No | Your Oura API application's client secret (the `auth` command asks for it, without echoing, if unset; otherwise read from the token file). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_profileA | Get the user's Oura profile and ring hardware: age, height, weight, biological sex and email; each ring's model, size, color, firmware and setup date; and the latest battery level with its timestamp. Use it for questions about the person or the device, or to put scores in context (e.g. age next to VO2 max or cardiovascular age). Takes no arguments. A part Oura won't share (scope not granted) comes back as an error field while the rest still returns. |
| get_daily_overviewA | Get everything Oura recorded for one day in a single call: readiness (score, contributors, temperature deviation), sleep score and the night's main sleep (stages, HRV, lowest heart rate, efficiency), naps, activity (score, steps, calories), stress, resilience, SpO2, cardiovascular age, VO2 max, bedtime guidance, workouts, sessions and tags. Start here for 'today', 'last night' or any single date; use get_trends for multi-day questions and the list_* tools for one data type over a range. Omit date for the latest day with a sleep or readiness score. Data types the user didn't grant are listed under |
| get_trendsA | Summarize the last N days (default 14, up to 90, including today) as a day-by-day table plus avg/min/max for readiness, sleep and activity scores, sleep hours and stages, HRV, lowest heart rate, temperature deviation, steps, active calories and stress, with readiness-zone counts and workouts per day. Use it for week or month comparisons and 'how am I trending' questions; use get_daily_overview for a single day and the list_* tools for full detail on one data type. Days without data are omitted; today is flagged in_progress and its partial activity is left out of the averages. |
| list_daily_readinessA | List daily readiness scores (0-100, with Oura's zone: optimal 85+, good 70-84, pay_attention below 70) and their contributors: HRV balance, resting heart rate, recovery index, body temperature, sleep balance, previous night, previous-day activity, activity balance and sleep regularity, plus temperature deviation from baseline in °C. Use it to see how readiness and its drivers changed over a range; for a single day use get_daily_overview, and for readiness next to sleep and activity use get_trends. Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records, next_token }, oldest first. Days without data are absent, and today's data appears only after the ring syncs. If next_token is not null, call again with it for the rest. raw: true returns Oura's original objects. |
| list_daily_sleepA | List daily sleep scores (0-100, with Oura's zone) and the contributors behind them: total sleep, efficiency, restfulness, REM, deep sleep, latency and timing. Use it for 'how well did I sleep' over a range; for hours, stages, HRV and heart rate use list_sleep_periods, and for one night's hypnogram use get_sleep_period. Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records, next_token }, oldest first. Days without data are absent, and today's data appears only after the ring syncs. If next_token is not null, call again with it for the rest. raw: true returns Oura's original objects. |
| list_sleep_periodsA | List individual sleep periods (nights and, by default, naps) with bedtime, hours in bed and asleep, deep/REM/light/awake hours, latency, efficiency, average and lowest heart rate, average HRV, breathing rate and the readiness score each produced. Use it for sleep duration, stages and overnight HRV or heart rate across days; use list_daily_sleep for scores only, and pass a sleep_id to get_sleep_period for the full hypnogram. Periods the user rejected or deleted are left out, and each period belongs to the day the user woke up. Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records, next_token }, oldest first. Days without data are absent, and today's data appears only after the ring syncs. If next_token is not null, call again with it for the rest. raw: true returns Oura's original objects. |
| get_sleep_periodA | Get one sleep period in full detail by its sleep_id: the same summary as list_sleep_periods plus a hypnogram (deep/light/REM/awake segments at 5-minute resolution, in local time), heart-rate and HRV curves through the night (downsampled to at most 120 points, with avg/min/max), and the readiness contributors it produced. Use it to explain one specific night; get the id from list_sleep_periods or get_daily_overview first. An unknown id returns a 404 error; raw: true returns Oura's original object. |
| list_daily_activityA | List daily activity: activity score (0-100) and contributors, steps, active, total and target calories, walking-equivalent distance in km, minutes of high/medium/low activity, sedentary, resting and non-wear hours, and inactivity alerts. Use it for movement, step and calorie questions over a range; individual workouts are in list_workouts. An Oura activity day runs 4 a.m. to 4 a.m., so today's row is partial. Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records, next_token }, oldest first. Days without data are absent, and today's data appears only after the ring syncs. If next_token is not null, call again with it for the rest. raw: true returns Oura's original objects. |
| list_workoutsA | List workouts, auto-detected by the ring or added manually, with activity type, label, intensity (easy/moderate/hard), source, start and end time, duration in minutes, calories and distance in km. Use it for training questions such as 'how many runs this month'; narrow it with activity, a case-insensitive substring like 'run' or 'swim'. For whole-day movement use list_daily_activity, and for heart rate during a workout call get_heart_rate with its start and end and source 'workout'. Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records, next_token }, oldest first. Days without data are absent, and today's data appears only after the ring syncs. If next_token is not null, call again with it for the rest. raw: true returns Oura's original objects. |
| list_sessionsA | List mindfulness sessions recorded in the Oura app (meditation, breathing, relaxation, nap, rest, body status) with mood, start and end time, duration, and heart-rate and HRV stats (avg/min/max). Use it for questions about guided practice and how it affected heart rate or HRV; sleep is in list_sleep_periods and exercise in list_workouts. Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records, next_token }, oldest first. Days without data are absent, and today's data appears only after the ring syncs. If next_token is not null, call again with it for the rest. raw: true returns Oura's original objects. |
| list_daily_healthA | List per-day health metrics joined by date: stress (day summary, minutes of high stress and high recovery), resilience level and contributors, average SpO2 and breathing disturbance index, cardiovascular age, VO2 max, and bedtime guidance (Oura's optimal bedtime window). Use it for stress, resilience, breathing and cardio-fitness trends; readiness, sleep and activity scores have their own list_* tools. Each field appears only on days Oura computed it (VO2 max and cardiovascular age update occasionally). Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records } oldest first, plus |
| list_tagsA | List the tags and notes the user logged in the Oura app (e.g. alcohol, caffeine, late meal, sickness, travel, custom tags) with their time, end time if any, and comments, merging classic and enhanced tags into one list sorted by time. Use it to explain unusual readiness or sleep, then cross-check the tagged days with get_daily_overview or get_trends. Range: the last 7 days by default; set start and end (inclusive, YYYY-MM-DD) or days (up to 400, ignored when start is set). Returns { records } oldest first, plus |
| list_rest_mode_periodsA | List Rest Mode periods, which the user turns on when sick, injured or recovering, with start and end day (an ongoing period has no end) and the symptom tags logged during each. Use it to explain dips in readiness or activity, or to check whether the user was unwell on given days. Covers the last 90 days by default; set start and end (inclusive, YYYY-MM-DD) or days. A period that overlaps the range is included. Returns { records, next_token }; raw: true returns Oura's original objects. |
| get_heart_rateA | Get the heart-rate time series between two times, aggregated into buckets aligned to local time (5min, 15min, hour or day) with avg/min/max bpm and the dominant source, plus overall and per-source stats (awake, rest, sleep, workout, session, live). Use it for heart rate at particular times, during a workout or across a day; for overnight averages, lowest heart rate and HRV prefer list_sleep_periods. Defaults to the last 24 hours at hourly resolution; ranges are limited to 30 days per call. resolution 'raw' returns individual samples (the first 2000); latest: true returns only the most recent sample and ignores the other arguments. truncated: true means the range held more samples than one call fetches, so narrow it. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Tools mostly target distinct resources, and the descriptions actively route the agent (get_daily_overview for one day, get_trends for multi-day, list_* for one data type over a range). There is real overlap between get_daily_overview and the various list_* tools, and between list_daily_sleep and list_sleep_periods, but the descriptions explicitly delineate them, so misselection is unlikely.
A clean, predictable verb_noun pattern holds throughout: get_profile, get_daily_overview, get_sleep_period, get_heart_rate, get_trends and list_daily_readiness, list_daily_sleep, list_sessions, list_sleep_periods, list_daily_activity, list_workouts, list_daily_health, list_tags, list_rest_mode_periods. The get_/list_ distinction usefully encodes single-vs-collection semantics.
14 tools is well within the ideal band for a rich health-data domain, and each tool earns its place by covering a distinct Oura data type or aggregation level. No redundant or filler tools.
The surface covers profile/hardware, single-day overview, trends, readiness, sleep scores, individual sleep periods with hypnogram, activity, workouts, health metrics, tags, rest mode, and a raw heart-rate time series. Since the Oura API is read-only, the absence of write operations is appropriate, leaving no obvious gaps.