Oura MCP server. Read sleep, readiness, activity, stress, heart rate and workouts from the Oura Ring.
Add to your MCP config, then reload & authorize:
{
"mcpServers": {
"oura": {
"url": "https://oura.usefulapi.io/mcp"
}
}
}| Tool | Type | What it does |
|---|---|---|
oura_get_personal_info | read | Get personal info Fetch the wearer's profile — age, weight, height, biological sex and email. Oura: GET /v2/usercollection/personal_info. |
oura_list_documents | read | List documents from a collection List documents from one Oura collection over a date range. This is the main read: pick `collection` for what you want — daily_sleep and sleep for sleep, daily_readiness for recovery, daily_activity for movement, daily_stress and daily_resilience for load, workout and session for exercise, daily_spo2, daily_cardiovascular_age and vO2_max for cardiovascular measures, tag and enhanced_tag for the wearer's own annotations, rest_mode_period and ring_configuration for device state. Oura: GET /v2/usercollection/{collection}. |
oura_get_document | read | Get one document Fetch a single document by id from one collection. Ids come from oura_list_documents. Oura: GET /v2/usercollection/{collection}/{document_id}. |
oura_get_heartrate | read | Get heart-rate samples Fetch individual heart-rate samples over a DATETIME range. This collection is sampled continuously, so it uses start_datetime/end_datetime rather than dates, and can return a great many points — narrow the window or pass latest. Oura: GET /v2/usercollection/heartrate. |
oura_get_ring_battery_level | read | Get ring battery level Fetch ring battery readings over a DATETIME range, or just the latest. Oura: GET /v2/usercollection/ring_battery_level. |
oura_list_webhook_subscriptions | read | List webhook subscriptions List the webhook subscriptions registered for the application. Oura: GET /v2/webhook/subscription. |
oura_get_webhook_subscription | read | Get one webhook subscription Fetch a single webhook subscription with its callback URL, event type and expiry. Oura: GET /v2/webhook/subscription/{id}. |
oura_create_webhook_subscription | write | Create a webhook subscription Register a webhook so Oura notifies your callback URL when data changes. Oura verifies the URL before activating it, and the subscription EXPIRES — renew it with oura_renew_webhook_subscription. Oura: POST /v2/webhook/subscription. |
oura_renew_webhook_subscription | write | Renew a webhook subscription Extend a webhook subscription's expiry. Oura subscriptions lapse if not renewed, so this is the tool that keeps a live integration alive. Oura: PUT /v2/webhook/subscription/renew/{id}. |
oura_delete_webhook_subscription | write | Delete a webhook subscription Remove a webhook subscription. Notifications stop immediately. Oura: DELETE /v2/webhook/subscription/{id}. |
| Plan | Price | Limit |
|---|---|---|
| Free | $0 | 100 tool calls / month |
| Pro | $9/mo · $90/yr | Unlimited |
This is a Model Context Protocol endpoint — meant to be connected from an AI client, not opened in a browser. An invalid_token response at the URL is the auth gate working as designed; clients authenticate automatically.