Oura Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Oura Mcp (Plugin) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
Aggregate score unchanged between these scans.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol server for the Oura Ring API v2. Exposes sleep, activity, readiness, heart rate, and workout data to MCP-compatible clients (Claude Desktop, Claude Code, Cursor, ...) via OAuth.
npx @yasuakiomokawa/oura-mcp configureThe wizard collects your Oura Client ID/Secret, walks through browser OAuth, saves tokens to ~/.config/oura-mcp/, and adds an mcpServers.oura entry to any detected MCP client config. Restart the client and the tools below are available.
Re-running configure pre-fills the saved Client ID / port so you only need to press Enter to keep them. Type --force to wipe saved state and start from scratch:
npx @yasuakiomokawa/oura-mcp configure --forcehttp://localhost:54321/callback(or http://localhost:<port>/callback if you customize OURA_CALLBACK_PORT)
npx @yasuakiomokawa/oura-mcp configureThree paths depending on your client:
1. MCP Registry (auto-discovery clients)
Once published to the official MCP Registry, supported clients can install io.github.YasuakiOmokawa/oura-mcp from their UI. The wizard step still has to run once to obtain OAuth tokens.
2. Manual config (Claude Desktop / Claude Code / Cursor)
Run npx @yasuakiomokawa/oura-mcp configure — Step 4 of the wizard auto-detects:
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)~/.claude.json./.mcp.json~/.cursor/mcp.json./.cursor/mcp.jsonEach detected file is backed up to <file>.bak.<ISO-timestamp> before an atomic write.
To configure manually, add to your client config:
{
"mcpServers": {
"oura": {
"command": "npx",
"args": ["-y", "@yasuakiomokawa/oura-mcp"]
}
}
}3. Skill (optional)
The companion oura-api-skill ships per-endpoint reference and three workflow recipes (weekly review / sleep trend / recovery check). Bundle it as a Claude Code plugin or import into your skills directory.
| Tool | Purpose |
|---|---|
oura_authenticate | Start OAuth flow in browser; returns the URL. Used after refresh_token expires. |
oura_auth_status | Check current token validity and expiry. |
oura_clear_auth | Wipe stored tokens. |
oura_api_list_paths | List every supported GET endpoint with summaries. |
oura_api_get | Generic GET to /v2/.... Auto-paginates via max_pages (1-20) or accepts next_token in params. |
oura_api_get returns structuredContent with { status, data, next_token, pages_fetched, has_more }.
Two ways. The config file (Option A) is the recommended path — it stores secrets at-rest with 0600 and is self-healing. Environment variables (Option B) are kept for CI / Docker / ephemeral environments where writing a file is impractical, but they leak more easily and are not recommended for daily use.
Run the wizard once and forget about it:
npx @yasuakiomokawa/oura-mcp configureThis writes:
~/.config/oura-mcp/config.json # 0600, contains clientId / clientSecret / callbackPort
~/.config/oura-mcp/tokens.json # 0600, contains the OAuth access / refresh tokensPermissions are re-checked on every load and chmod'd back to 0600 if anything else touched them.
config.json schema:
{
"schemaVersion": 1,
"clientId": "...",
"clientSecret": "...",
"callbackPort": 54321
}OURA_CLIENT_ID=...
OURA_CLIENT_SECRET=... # must be set together with OURA_CLIENT_ID
OURA_CALLBACK_PORT=54321 # optional; safe to set in env regardless of Option A/BWhen the server boots and both OURA_CLIENT_ID and OURA_CLIENT_SECRET are set, it uses them and emits a config.env_credentials warning to stderr.
Why not recommended:
process.env is readable from /proc/<pid>/environ by any process running as the same user.process.env will leak the secret.OURA_CLIENT_SECRET=... npx ... typed at the shell ends up in shell history.OURA_CALLBACK_PORT is not a secret and is fine to pass via env in either mode.
args for secretsProcess arguments are visible to other users via ps / /proc/<pid>/cmdline. Use the env block of your MCP client config:
{
"mcpServers": {
"oura": {
"command": "npx",
"args": ["-y", "@yasuakiomokawa/oura-mcp"],
"env": { "OURA_CLIENT_ID": "...", "OURA_CLIENT_SECRET": "..." }
}
}
}oura_authenticate (in chat) or npx @yasuakiomokawa/oura-mcp configure (in terminal).OURA_CALLBACK_PORT=<other port> and update the redirect URI in your Oura developer app to match.oura_api_list_paths. Common slips: missing /v2/ prefix, typo in daily_sleep.OURA_LOG_LEVEL=debug for verbose stderr logging.git clone https://github.com/YasuakiOmokawa/oura-mcp.git
cd oura-mcp
npm install
npm test
npm run buildUseful scripts:
npm run lint / npm run typecheck — Biome + TypeScript checksnpm run test:coverage — Vitest with V8 coveragenpm run update:docs — re-fetch the Oura OpenAPI schema and regenerate skills/oura-api-skill/references/~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.