oura-mcp-server-enhanced
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oura-mcp-server-enhanced What was my sleep score last night?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Oura MCP Server (Enhanced)
An MCP (Model Context Protocol) server that provides comprehensive access to the Oura Ring API v2. Exposes 17 tools covering sleep, activity, heart rate, stress, SpO2, workouts, and more.
Tools
Sleep & Recovery
Tool | Description |
| Detailed sleep sessions -- stages, heart rate, HRV, breathing rate |
| Daily sleep scores and contributor breakdown |
| Recommended and actual sleep timing windows |
| Readiness scores and contributors (HRV balance, body temp, etc.) |
| Recovery capacity and stress tolerance indicators |
Activity & Fitness
Tool | Description |
| Steps, calories, active time breakdown, MET levels |
| Workout sessions with type, calories, distance, duration |
| Guided sessions (meditation, breathing) with biometrics |
| VO2 max cardiovascular fitness estimates |
Health Vitals
Tool | Description |
| Heart rate at 5-minute intervals (uses datetime params) |
| Daily blood oxygen saturation |
| Daily stress levels and recovery summary |
| Estimated cardiovascular age |
User & Device
Tool | Description |
| User profile (age, weight, height) |
| Ring model, color, firmware, setup date |
| Rest mode periods and schedules |
| User-created lifestyle tags and annotations |
All tools with date parameters accept optional start_date and end_date in YYYY-MM-DD format. When omitted, the Oura API defaults to recent data.
Related MCP server: Oura MCP Server (Python)
Setup
Option A: Claude Desktop Extension (recommended)
Download the latest
oura-mcp-server-enhanced.mcpbfrom ReleasesIn Claude Desktop, go to Settings > Extensions > Advanced Settings and enable Install from file
Back on the Extensions page, click Add from file and select the downloaded
.mcpbfileEnter your Oura API Token when prompted
Option B: Manual Setup
1. Get an Oura API Token
Go to Oura Personal Access Tokens and create a new token.
2. Install
Requires Python 3.12+ and uv.
git clone https://github.com/josuhr/oura-mcp-server-enhanced.git
cd oura-mcp-server-enhanced
uv venv && uv pip install -e .3. Configure Claude Desktop
Add the following to your claude_desktop_config.json:
{
"mcpServers": {
"oura": {
"command": "uv",
"args": ["run", "--directory", "/path/to/oura-mcp-server-enhanced", "oura-mcp-server"],
"env": {
"OURA_API_TOKEN": "your_token_here"
}
}
}
}Replace /path/to/oura-mcp-server-enhanced with the actual path and your_token_here with your Oura API token.
4. Run Standalone (optional)
export OURA_API_TOKEN="your_token_here"
oura-mcp-serverBuilding the Extension
To build the .mcpb extension bundle from source:
zip -r oura-mcp-server-enhanced.mcpb manifest.json pyproject.toml uv.lock src/ .python-version -x "src/**/__pycache__/*"Project Structure
src/oura_mcp_server/
├── __init__.py # Package entry point
├── server.py # FastMCP tool definitions and main()
├── client.py # Async HTTP client for Oura API v2
└── transforms.py # Human-readable data formattingCredits
Inspired by tomekkorbak/oura-mcp-server, extended to cover the full Oura API v2.
Available Tools
17 toolsget_daily_activityA
Get daily activity data including steps, calories, active time breakdown, and MET levels.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_daily_cardiovascular_ageB
Get estimated cardiovascular age based on resting heart rate and HRV trends.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_daily_readinessA
Get readiness scores and contributors (activity balance, body temperature, HRV balance, resting heart rate, sleep balance).
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_daily_resilienceA
Get resilience data indicating recovery capacity and stress tolerance.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_daily_sleepB
Get daily sleep scores and contributor breakdown (deep sleep, efficiency, latency, REM, restfulness, timing).
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_daily_spo2A
Get daily blood oxygen (SpO2) saturation readings.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_daily_stressA
Get daily stress levels including stress high, recovery high, and day summary.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_heart_rateA
Get heart rate data at 5-minute intervals throughout the day and night.
Args:
start_datetime: Start datetime in YYYY-MM-DDTHH:MM:SS format. Defaults to ~24 hours ago.
end_datetime: End datetime in YYYY-MM-DDTHH:MM:SS format. Defaults to now.
Inputs: end_datetime, start_datetime. Returns: result
get_personal_infoA
Get user profile information including age, weight, height, and biological sex.
Inputs: no named parameters. Returns: result
get_rest_modeA
Get rest mode periods and their scheduled episodes.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_ring_configurationA
Get ring hardware details including model, color, firmware version, and setup date.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_sessionsA
Get guided and unguided session data (meditation, breathing, etc.) with heart rate and HRV biometrics.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_sleep_dataA
Get detailed sleep session data including sleep stages, heart rate, HRV, and breathing rate.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_sleep_timeB
Get recommended and actual sleep timing windows.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_tagsA
Get user-created tags and lifestyle annotations (e.g. caffeine, alcohol, exercise notes).
Returns enhanced tags when available, falling back to standard tags.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_vo2_maxB
Get VO2 max estimates indicating cardiovascular fitness level.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
get_workoutsB
Get workout sessions with activity type, calories burned, distance, intensity, and duration.
Args:
start_date: Start date in YYYY-MM-DD format. Defaults to yesterday.
end_date: End date in YYYY-MM-DD format. Defaults to today.
Inputs: end_date, start_date. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 17 tools
Each tool targets a distinct metric (e.g., activity, readiness, sleep stages, heart rate) with clear descriptions, so an agent can reliably distinguish between them even when dealing with similar domains like sleep.
All tools follow a 'get_noun' pattern in snake_case, but there is minor inconsistency with the 'daily_' prefix (some tools use it, others don't) and the absence of a verb beyond 'get' makes the naming straightforward yet slightly varied.
17 tools is slightly above the typical well-scoped range (3-15), but each tool covers a necessary Oura metric without redundancy, making the count reasonable for a comprehensive health API.
The tool set covers nearly all major Oura data types (activity, sleep, readiness, heart rate, stress, tags, sessions, workouts, etc.) with no obvious missing CRUD operations or critical gaps.
Maintenance
Related MCP Connectors
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Read sleep, readiness, activity, stress, heart rate and workouts from the Oura Ring.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for the Oura Ring API v2, providing access to sleep, activity, readiness, heart rate, and workout data via OAuth.595 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access Oura Ring health data including sleep, readiness, activity, heart rate, and workouts through MCP tools with OAuth2 authentication.1MIT
- AlicenseAqualityCmaintenanceMCP server for the Oura Ring API v2, enabling natural language queries about sleep, readiness, activity, heart rate, and more.2190 npm1MIT
- AlicenseAqualityBmaintenanceExposes the Oura API v2 as an MCP server with tools to query all 19 data collections (e.g., sleep, heartrate) with automatic pagination and explicit truncation warnings.659 PyPIMIT