Skip to main content
Glama
echocharlie

Oura MCP Server

by echocharlie

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
OURA_PERSONAL_ACCESS_TOKENYesYour Oura Personal Access Token from https://cloud.ouraring.com/personal-access-tokens

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

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
oura_get_daily_summaryA

One row per day joining readiness, sleep, activity, and recovery signals.

THIS IS THE CROSS-SOURCE JOIN TABLE. Use it first for almost any question about how training/activity relates to recovery — it lets you join Oura against a Strava connector on date in one step. Reach for the detail tools only to drill into a specific signal.

CSV columns (units in the name): date, readiness_score(0-100), sleep_score(0-100), activity_score(0-100), total_sleep_h, bedtime (HH:MM local, when sleep started), resting_hr_bpm (lowest nightly HR, a resting-HR proxy), avg_hrv_ms, resp_rate_brpm (overnight respiratory rate), temp_deviation_c (body temp vs baseline), breathing_disturbance_idx, steps, active_cal, stress_high_min (stressful daytime minutes), day_summary

Defaults to the last 30 days. Higher readiness/sleep/activity scores are better; a rising resting_hr or positive temp_deviation often signals incomplete recovery. resp_rate_brpm and breathing_disturbance_idx are leading illness/strain flags — a sustained rise in either often precedes a subjective sense of getting sick. bedtime is included because sleep timing (not just duration) drives next-day recovery, and it anchors any analysis of late meals/alcohol relative to sleep.

oura_get_sleep_detailA

Per-night sleep architecture for drilling into specific nights.

Use after oura_get_daily_summary when you need stage breakdown or sleep timing. One row per sleep period (a day may have a nap plus the main sleep).

Concise CSV columns: date, type, bedtime_start, bedtime_end, total_sleep_h, time_in_bed_h, deep_h, rem_h, light_h, awake_h, efficiency_pct, latency_min, avg_hr_bpm, lowest_hr_bpm, avg_hrv_ms, resp_rate_brpm

Defaults to the last 14 days. Use 'detailed' for raw fields and 5-min hypnogram.

oura_get_sleep_timeA

Oura's own bedtime guidance: the optimal bedtime window and what it recommends.

Use to answer "am I going to bed at the right time?" — distinct from oura_get_daily_summary's bedtime, which reports when you ACTUALLY slept. This is what Oura thinks you SHOULD do, derived from your circadian/temperature data.

CSV columns: date, optimal_bedtime_start, optimal_bedtime_end (local HH:MM; blank when Oura couldn't compute a window), recommendation, status

recommendation is one of: follow_optimal_bedtime — you're aligned; keep the current window earlier_bedtime — go to bed earlier later_bedtime — go to bed later earlier_wake_up_time / later_wake_up_time — adjust the wake side instead

status is one of: optimal_found — a concrete window was computed (times populated) only_recommended_found — Oura has a direction but NOT enough data for a window, so the time columns are blank. This is normal, not an error. not_enough_nights / no_data — insufficient history in the range.

Note: Oura returns these times as raw second-offsets from local midnight; this tool decodes them to HH:MM. A run of identical earlier_bedtime rows means Oura has been persistently flagging late sleep timing — worth reading as a trend, not a single day.

oura_get_readiness_detailA

Daily readiness with every contributor broken out — explains WHY readiness moved.

Use when oura_get_daily_summary shows a readiness change and you want the driver. Each contributor is a 0-100 sub-score (higher = better). A low hrv_balance or resting_heart_rate contributor the morning after a hard session points to load.

CSV columns: date, score, temp_deviation_c, activity_balance, body_temperature, hrv_balance, previous_day_activity, previous_night, recovery_index, resting_heart_rate, sleep_balance

Defaults to the last 30 days.

oura_get_stress_resilienceA

Daytime stress load plus long-term resilience — the daytime side of recovery.

Combines the daily_stress and daily_resilience collections into one table so you can see whether high-load days accumulate physiological stress and erode resilience.

CSV columns: date, stress_high_min (stressful daytime minutes), recovery_high_min (restorative minutes), day_summary (restored|normal|stressful), resilience_level (limited|adequate|solid|strong|exceptional), sleep_recovery, daytime_recovery, stress (the last three are 0-100 resilience contributors).

Defaults to the last 30 days. Resilience needs ~weeks of data to populate.

oura_get_workoutsA

Workouts as logged by Oura — cross-check or supplement Strava activities.

Oura auto-detects and lets you tag workouts. Use this to reconcile against a Strava connector (match on date/time), catch sessions Strava missed, or see Oura's intensity label. source shows how the workout was recorded (e.g. auto_detected, manual, confirmed).

CSV columns: date, activity, intensity (easy|moderate|hard), start_time, end_time, duration_min, distance_km, calories, source, label

Defaults to the last 30 days.

oura_get_baselinesA

Slow-moving health baselines: SpO2, breathing, arterial stiffness, VO2 max.

These trend over weeks/months, so the default window is 90 days. Use to track long-term vascular and aerobic health alongside training history.

CSV columns: date, spo2_avg_pct (overnight blood-oxygen %), breathing_disturbance_index, pulse_wave_velocity_m_s, vascular_age_years, vo2_max_ml_kg_min

pulse_wave_velocity_m_s (meters/second) is the RAW arterial-stiffness measurement and the most clinically meaningful vascular metric here — lower is better/more elastic; it is the same class of measure (PWV) used in hypertension research. vascular_age_years is a derived presentation of it, so prefer PWV when tracking real change.

IMPORTANT — sparsity: vo2_max is a measurement EVENT, not a daily value (often only a handful of readings per quarter), so most rows will be blank for it. Blank does NOT mean "no VO2 data" — read the footer, which reports the most recent reading in the window. cardiovascular_age/VO2 also require a compatible ring/firmware.

oura_get_heart_rateA

Fine-grained heart-rate timeseries (one sample every few minutes).

This is high-volume data, so default to a SHORT window (<= ~2 days) and the 'summary' format. Oura tags each sample with a source: awake, rest, sleep, workout, etc. — useful for isolating workout HR or overnight resting HR around hard training days.

summary -> CSV with one row per source: source, samples, min_bpm, avg_bpm, max_bpm, plus a final 'all' row. raw -> CSV: timestamp, bpm, source (capped at limit; narrow the window for more).

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/echocharlie/oura-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server