usefulapi

Oura MCP server. Read sleep, readiness, activity, stress, heart rate and workouts from the Oura Ring.

Claude

  1. Open Settings → Connectors → Add custom connector
  2. Paste this URL:
    https://oura.usefulapi.io/mcp
  3. Authenticate with Oura when prompted

Cursor · VS Code · Windsurf · Cline

Add to your MCP config, then reload & authorize:

{
  "mcpServers": {
    "oura": {
      "url": "https://oura.usefulapi.io/mcp"
    }
  }
}
live10 toolsFree 100 tool calls / monthPro $9/mo · $90/yr

Tools 10

ToolTypeWhat it does
oura_get_personal_inforead
Get personal info
Fetch the wearer's profile — age, weight, height, biological sex and email. Oura: GET /v2/usercollection/personal_info.
oura_list_documentsread
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_documentread
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_heartrateread
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_levelread
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_subscriptionsread
List webhook subscriptions
List the webhook subscriptions registered for the application. Oura: GET /v2/webhook/subscription.
oura_get_webhook_subscriptionread
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_subscriptionwrite
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_subscriptionwrite
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_subscriptionwrite
Delete a webhook subscription
Remove a webhook subscription. Notifications stop immediately. Oura: DELETE /v2/webhook/subscription/{id}.

Pricing

PlanPriceLimit
Free$0100 tool calls / month
Pro$9/mo · $90/yrUnlimited

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.