技能潮 SkillTide 提交收录
官方说明7 个来源MCP 服务8 天前
proscar87/oura-mcp

proscar87/oura-mcp

Raw access to all Oura Ring API v
在 GitHub 查看 ↗直链 · 无中转页
配置模板(请按你的客户端调整)
claude mcp add oura-mcp -- npx -y oura-mcp
这是根据仓库名生成的可粘贴骨架,命令行参数与包名请以该项目 README 为准。
★ 数取值
0 ★ · proscar87/oura-mcp · 取自该仓库的 GitHub 页面 · (2026-10-16 20:00:20 核对)
来源明细
收录自 punkpeye/awesome-mcp-servers 榜单(我们从中收集的条目之一) · 条目类型:MCP 服务
收录与活跃
收录于 2026-10-09 · 最近见到 2026-10-16 · 共见到 32 次 · 被 7 个来源列出
评分构成
综合分 703 · 7 个来源 · mcp
常见问题(答案都来自我们的记录)
怎么安装?
我们【没有】从该仓库取到安装命令(我们的 install 覆盖率只有约 4%)。请看它的 README 或 releases 页。
它适合谁 / 用来做什么?
我们把它归在这些标签下: MCP 服务。标签来自条目自身,不是我们强加的分类。
谁维护它、还在更新吗?
仓库 proscar87/oura-mcp;我们收录于 2026-10-09;最近见到 2026-10-16。这里没有"官方认证"或"质量评级"——我们只记录来源与时间。
第三方质量标记

oura-mcp

以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →

English | 简体中文 | 한국어 | Español
The Oura v2 API as an MCP
server. All 19 collections, six tools, no dependencies beyond the MCP SDK.
One local day of heart rate is 1,231 samples across 2 pages
A client that doesn't follow Oura's next_token returns **1,000 of them — 81%,
looking complete, with nothing saying otherwise.** Measured against the real API
on 9 August 2026, one person, one ring, 24 hours.
**The test to apply to any Oura MCP server, including this one:** does it take
next_token — or a cursor, or a limit — as a tool parameter? If it does,
pagination is the model's job, and a model that forgets to ask again produces a
confident answer off partial data. This server paginates to exhaustion before it
returns, and tells you how many pages it took.
That's one of **four** ways Oura under-delivers without saying so. All four are
measured below, and all four are corrected here.
Install
Download **oura-mcp.mcpb** from the
latest release and
double-click it. Claude Desktop does the rest — no terminal, no Python, no Node.
It runs on Oura's official sample data out of the box, and every sample response
says so, so nothing can pass for your own sleep.
Prefer the command line? uvx --from mcp-oura oura-mcp.
Prefer no Python on your machine at all?
-i is not optional: an MCP server speaks over stdin and stdout, not over a
port. Without it the container has no stdin, the handshake never arrives, and
the client reports a server that doesn't show up.
In **claude.ai** or **ChatGPT**, in a browser? Those connect by URL, so the
server has to live somewhere public: deploy it as a Worker on your own
Cloudflare account — free, about ten minutes, yours alone. See
Remote: claude.ai and ChatGPT.
---
The problem, measured
Oura does not return errors when it can't give you what you asked for. It
returns something different, shaped like a correct response. These are the four
we found by measuring against the real API on 9 August 2026:
1. Skip the pagination and you get a fraction
If next_token comes back and you don't follow it, you receive the first page
and **nothing warns you**. One local day of heartrate — one person, one ring,
24 hours — is **1,231 samples across 2 pages**. A client that doesn't paginate
gets 1,000 of 1,231: 81%, looking complete. A month is ~37,000.
2. Asking for a single day returned zero records
end_date **does not behave the same across collections**:
| Exclude the last day requested | Include it |
|---|---|
| daily_activity, sleep, workout | daily_sleep, daily_readiness, daily_stress, daily_spo2, daily_resilience, daily_cardiovascular_age, sleep_time |
And on top of that, **workout filters by UTC date while reporting day in
local time**: at -06:00, asking for July 16–18 returned records from the 15th
and 16th — *before* the requested start.
Here the range is inclusive on both ends, always. Two extra days are requested
on each side and then trimmed, which is correct whichever way a given collection
behaves — and stays correct when Oura changes it.
3. latest=true is ignored where it doesn't apply
Only heartrate and ring_battery_level honor it. In the other seventeen Oura
doesn't error: it **returns the entire collection**. You ask for the latest
record, you get ten, and you believe it's one. Here it's rejected before the
request goes out.
4. A field that doesn't exist is silently ignored
fields=does_not_exist returns the **complete** record — the projection never
happens — and fields=score,does_not_exist applies the good one and drops the
bad one without a word. Here, fields that never appeared are reported under
ignored_fields.
**The pattern is always the same:** you ask for one thing, you get another, and
nothing warns you. That's why this package would rather shout than quietly
under-deliver.
Installation
Try it with no credentials
The sandbox is official — it's in Oura's OpenAPI spec, with 34 mirror routes —
and serves synthetic data without authentication. 18 of the 19 collections work
there: personal_info doesn't, which makes sense, since it's the one returning
email, age, weight and height.
This is the right order: first you watch the server work and learn the shape of
the data, then you go get credentials.
With your own data
**Oura stopped issuing Personal Access Tokens in December 2025.** Existing ones
still work; new ones can't be created. So there are two paths:
**a) OAuth2 — the one that works today.** Register an application at
cloud.ouraring.com/oauth/applications
with the redirect http://localhost:9876/callback/ — **the trailing slash is
来源
awesome · https://github.com/proscar87/oura-mcp
按领域浏览
MCP 服务
收录于
昨天

更多MCP 服务

查看MCP 服务全部 5,525 条 →

所属领域与标签

每个标签都能点进去看同类的全部条目。数字是当前库里的真实条数。

浏览全部领域 →

← 返回索引