使用说明
Oura环MCP服务器
一个全面的模型上下文协议(MCP)服务器 欧拉戒指 API V2。通过Claude、ChatGPT或Cursor IDE等人工智能助手从Oura Ring访问睡眠、活动、准备状态、心率、压力和其他健康数据。
安全第一:此服务器实现 仅限只读操作 用户数据。您的健康信息无法修改。
这是什么?
此MCP服务器允许AI助手访问您的Oura Ring健康数据。连接后,您可以提出以下问题:
- “我昨晚睡得怎么样?”
- “我本周的准备得分是多少?”
- “显示我的心率趋势”
- “分析我的压力模式”
关键词:Oura Ring,MCP服务器,模型上下文协议,睡眠跟踪,健康数据,可穿戴API,AI集成,Claude,ChatGPT,Cursor
目录
Oura戒指是什么?
欧拉戒指 是一个智能戒指,可以跟踪:
- 睡眠 -睡眠阶段(深度、轻度、快速眼动)、睡眠质量、时间
- 活动 -一天中的步数、卡路里、运动量
- 准备就绪 -基于睡眠、活动和身体信号的恢复评分
- 心率 -连续心率和心率变异性
- 体温 -皮肤温度偏差
- 压力 -日间压力和恢复模式
- SpO2 -血氧饱和度
此MCP服务器通过以下方式提供对所有这些数据的访问 Oura API V2.
特性
| 特性 | 描述 |
|---|---|
| 37 MCP工具 | 全面覆盖所有Oura API V2端点 |
| 按设计只读 | 无法修改用户数据 |
| OAuth2身份验证 | 基于令牌的安全身份验证,支持刷新令牌 |
| 自动令牌刷新 | 自动刷新过期的访问令牌 |
| 沙盒支持 | 在使用真实数据之前使用模拟数据进行测试 |
| 速率限制 | 内置速率限制和指数回退 |
| 令牌消毒 | 访问令牌永远不会在日志或错误中公开 |
快速开始
1.克隆和安装
git clone https://github.com/trenerok/oura-mcp-server.git
cd oura-mcp-server
npm install
2.获取OAuth2凭据
看 获取访问令牌 在......下面
3.建造
npm run build
4.配置MCP客户端
看 MCP 客户端安装 适用于Claude Desktop、Cursor IDE或其他客户端。
获取访问令牌
Oura使用OAuth2进行身份验证。个人访问令牌于2025年12月被弃用。
步骤1:创建OAuth2应用程序
- 首选 Oura云应用
- 点击“新建应用程序”
- 填写必填字段:
- 显示名称:您的应用程序名称(例如“我的MCP服务器”)
- 描述:简要说明
- 网站:您的网站或GitHub仓库URL
- 隐私政策:URL(可以是您的GitHub仓库供个人使用)
- 服务条款:URL(可以是您的GitHub仓库供个人使用)
- 重定向URI:
http://localhost:8080/callback
- 选择所有 范围 您想访问
- 点击“创建应用程序”
- 复制您的 客户端ID 和 客户端密钥
步骤2:获取访问令牌
使用附带的辅助脚本:
node scripts/get-token.js YOUR_CLIENT_ID YOUR_CLIENT_SECRET
这将:
- 打开浏览器以授权应用程序
- 将授权码替换为令牌
- 显示您的访问令牌和刷新令牌
步骤3:保存您的代币
将令牌添加到MCP配置中(请参阅 MCP 客户端安装).
配置
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
OURA_ACCESS_TOKEN |
是* | OAuth2用户数据访问令牌 |
OURA_REFRESH_TOKEN |
否 | 刷新令牌以自动续订令牌 |
OURA_CLIENT_ID |
否** | OAuth2应用程序客户端ID |
OURA_CLIENT_SECRET |
无** | OAuth2应用程序客户端机密 |
OURA_USE_SANDBOX |
否 | 设置为 true 用于沙箱/模拟数据 |
*用户数据端点需要 **令牌刷新和webhook管理所需
自动令牌刷新
如果你提供 OURA_REFRESH_TOKEN, OURA_CLIENT_ID,以及 OURA_CLIENT_SECRET,服务器将在访问令牌过期时(通常在24小时后)自动刷新您的访问令牌。
MCP 客户端安装
克劳德桌面版
添加到您的 claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
视窗: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"oura": {
"command": "node",
"args": ["/absolute/path/to/oura-mcp-server/dist/index.js"],
"env": {
"OURA_ACCESS_TOKEN": "your_access_token",
"OURA_REFRESH_TOKEN": "your_refresh_token",
"OURA_CLIENT_ID": "your_client_id",
"OURA_CLIENT_SECRET": "your_client_secret"
}
}
}
}
光标IDE
添加到 .cursor/mcp.json 在您的项目目录中:
{
"mcpServers": {
"oura": {
"command": "node",
"args": ["./dist/index.js"],
"env": {
"OURA_ACCESS_TOKEN": "your_access_token",
"OURA_REFRESH_TOKEN": "your_refresh_token",
"OURA_CLIENT_ID": "your_client_id",
"OURA_CLIENT_SECRET": "your_client_secret"
}
}
}
}
其他MCP客户端
为您的客户端使用具有适当配置文件格式的类似配置。
可用工具(共37个)
按类别概述
| 类别 | 计数 | 工具 |
|---|---|---|
| 个人信息 | 1 | 用户资料(年龄、体重、身高) |
| 睡眠 | 6 | 睡眠时间、每日评分、就寝时间建议 |
| 活动 | 2 | 日常活动、步数、消耗的卡路里 |
| 健康指标 | 14 | 心率、准备状态、SpO2、压力、恢复力、心血管年龄、最大摄氧量 |
| 锻炼 | 4 | 锻炼课程、冥想/呼吸课程 |
| 标签 | 4 | 用户创建的标签和增强标签 |
| 设备 | 4 | 环形配置,休息模式时段 |
| 网络钩子 | 6 | Webhook订阅管理 |
完整工具清单
个人信息(1个工具)
| 工具 | 说明 |
|---|---|
get_personal_info |
获取用户资料:年龄、体重、身高、生物性别、电子邮件 |
睡眠(6工具)
| 工具 | 说明 |
|---|---|
get_sleep |
详细的睡眠阶段(深睡、浅睡、快速眼动)、心率、心率 |
get_sleep_by_id |
按文档ID划分的单次睡眠会话 |
get_daily_sleep |
每日睡眠评分及贡献者细分 |
get_daily_sleep_by_id |
按ID列出的单日睡眠记录 |
get_sleep_time |
最佳就寝时间建议 |
get_sleep_time_by_id |
按ID列出的单个睡眠时间文档 |
活动(2个工具)
| 工具 | 说明 |
|---|---|
get_daily_activity |
每日步数、卡路里、活动时间、MET分钟数 |
get_daily_activity_by_id |
按ID列出的单个日常活动文档 |
健康指标(14种工具)
| 工具 | 说明 |
|---|---|
get_heart_rate |
心率时间序列(带时间戳的BPM) |
get_daily_readiness |
贡献者的每日准备度得分 |
get_daily_readiness_by_id |
按ID列出的单一准备文件 |
get_daily_spo2 |
血氧饱和度(SpO2)数据 |
get_daily_spo2_by_id |
按ID列出的单一SpO2文件 |
get_daily_stress |
日常压力水平和恢复时间 |
get_daily_stress_by_id |
按ID列出的单应力文档 |
get_daily_resilience |
每日弹性得分 |
get_daily_resilience_by_id |
按ID列出的单一弹性文件 |
get_daily_cardiovascular_age |
血管年龄估计 |
get_daily_cardiovascular_age_by_id |
按ID列出的单一心血管年龄文件 |
get_vo2_max |
最大摄氧量估计值(心血管健康) |
get_vo2_max_by_id |
按ID列出的单个最大VO2文档 |
锻炼(4个工具)
| 工具 | 说明 |
|---|---|
get_workouts |
锻炼时间(活动类型、卡路里、距离、持续时间) |
get_workout_by_id |
按ID列出的单个锻炼文档 |
get_sessions |
使用心率变异性数据进行冥想和呼吸训练 |
get_session_by_id |
按ID列出的单会话文档 |
标签(4个工具)
| 工具 | 说明 |
|---|---|
get_tags |
用户创建的用于跟踪行为的标签 |
get_tag_by_id |
按ID标记的单标签文档 |
get_enhanced_tags |
具有元数据和时间范围的增强标签 |
get_enhanced_tag_by_id |
按ID显示单个增强标记文档 |
设备(4个工具)
| 工具 | 说明 |
|---|---|
get_ring_configuration |
戒指详细信息:颜色、尺寸、固件、硬件类型 |
get_ring_configuration_by_id |
按ID进行单环配置 |
get_rest_mode_periods |
休息模式激活历史 |
get_rest_mode_period_by_id |
按ID划分的单次休息模式时段 |
Webhooks(6个工具)-需要客户端凭据
| 工具 | 说明 |
|---|---|
list_webhook_subscriptions |
列出所有webhook订阅 |
get_webhook_subscription |
按ID获取特定的webhook |
create_webhook_subscription |
创建新的webhook订阅 |
update_webhook_subscription |
更新现有webhook |
delete_webhook_subscription |
删除webhook订阅 |
renew_webhook_subscription |
到期前续订webhook |
工具参考
公共参数
日期范围参数(大多数工具)
| 参数 | 格式 | 必填 | 说明 |
|---|---|---|---|
start_date |
YYYY-MM-DD |
否 | 日期范围的开始 |
end_date |
YYYY-MM-DD |
否 | 日期范围结束 |
next_token |
string | 否 | 下一页的分页标记 |
DateTime参数(仅心率)
| 参数 | 格式 | 必填 | 说明 |
|---|---|---|---|
start_datetime |
ISO 8601 | 否 | 开始日期时间(例如。, 2024-01-01T00:00:00Z) |
end_datetime |
ISO 8601 | 否 | 结束日期时间 |
next_token |
string | 否 | 分页标记 |
示例响应
个人信息
{
"id": "abc123",
"age": 35,
"weight": 75.5,
"height": 1.80,
"biological_sex": "male",
"email": "user@example.com"
}
每日睡眠
{
"data": [
{
"id": "sleep123",
"day": "2024-01-15",
"score": 85,
"contributors": {
"deep_sleep": 80,
"efficiency": 90,
"latency": 85,
"rem_sleep": 75,
"restfulness": 82,
"timing": 95,
"total_sleep": 88
},
"timestamp": "2024-01-15T00:00:00.000+00:00"
}
],
"next_token": null
}
日常准备
{
"data": [
{
"id": "ready123",
"day": "2024-01-15",
"score": 78,
"contributors": {
"activity_balance": 85,
"body_temperature": 100,
"hrv_balance": 72,
"previous_day_activity": 80,
"previous_night": 75,
"recovery_index": 90,
"resting_heart_rate": 82,
"sleep_balance": 70
},
"temperature_deviation": 0.1,
"timestamp": "2024-01-15T00:00:00.000+00:00"
}
],
"next_token": null
}
心率
{
"data": [
{
"bpm": 62,
"source": "awake",
"timestamp": "2024-01-15T08:30:00+00:00"
},
{
"bpm": 58,
"source": "rest",
"timestamp": "2024-01-15T08:35:00+00:00"
}
],
"next_token": null
}
对于AI代理
本节为使用此MCP服务器的AI代理提供结构化指导。
服务器功能
- 数据访问:只读访问所有Oura Ring健康数据
- 认证:具有自动刷新功能的OAuth2承载令牌
- 实时数据:从Oura API实时获取数据
- 分页:大型数据集返回
next_token用于分页
AI代理的快速入门
- 验证连接:呼叫
get_personal_info第一 - 使用日期范围:始终指定
start_date限制数据 - 处理空数据:空数组表示该期间没有数据
- 检查空值:如果不可用,许多字段可能为空
推荐工作流程
健康仪表盘
1. get_personal_info() → Get user profile
2. get_daily_readiness(start_date: "<7 days ago>") → Weekly readiness trend
3. get_daily_sleep(start_date: "<7 days ago>") → Weekly sleep scores
4. get_daily_activity(start_date: "<7 days ago>") → Weekly activity
5. get_daily_stress(start_date: "<7 days ago>") → Weekly stress patterns
睡眠分析
1. get_daily_sleep(start_date: "<30 days ago>") → Monthly sleep scores
2. get_sleep(start_date: "<7 days ago>") → Detailed sleep sessions with stages
3. get_sleep_time(start_date: "<7 days ago>") → Bedtime recommendations
体能评估
1. get_daily_activity(start_date: "<30 days ago>") → Activity trends
2. get_workouts(start_date: "<30 days ago>") → Workout history
3. get_vo2_max(start_date: "<30 days ago>") → Cardiovascular fitness
4. get_heart_rate(start_datetime: "<today>T00:00:00Z") → Today's heart rate
压力与恢复
1. get_daily_stress(start_date: "<7 days ago>") → Stress levels
2. get_daily_resilience(start_date: "<7 days ago>") → Resilience scores
3. get_daily_readiness(start_date: "<7 days ago>") → Recovery status
关键指标说明
| 度量 | 范围 | 含义 |
|---|---|---|
| 睡眠评分 | 0-100 | 整体睡眠质量(>85=最佳) |
| 准备度得分 | 0-100 | 恢复水平(>85=准备活动) |
| 活动评分 | 0-100 | 每日运动目标进度 |
| 压力(高) | 秒 | 高压力状态下的时间 |
| 恢复(高) | 秒 | 恢复/休息状态的时间 |
| 心率变异性 | ms | 心率变异性(越高=恢复越好) |
| 休息人力资源 | bpm | 静息心率(较低=健康状况较好) |
错误处理
| 错误 | 原因 | 解决方案 |
|---|---|---|
Access token not configured |
缺少OURA_ACCESS_TOKEN | 将令牌添加到配置中 |
401 Unauthorized |
令牌已过期 | 如果提供了刷新令牌,服务器将自动刷新 |
403 Forbidden |
范围未授权 | 使用所需范围重新授权 |
429 Rate Limit |
请求太多 | 服务器自动重试并回退 |
空 data: [] |
日期范围没有数据 | 尝试其他日期范围 |
重要说明
- 日期格式:使用
YYYY-MM-DD对于日期 - 日期时间格式:使用ISO 8601
get_heart_rate(例如。,2024-01-15T00:00:00Z) - 时区:数据以用户的时区返回
- 分页:如果
next_token不为空,有更多数据可用 - 空值:如果戒指没有磨损或数据不可用,则字段可能为空
速率限制
服务器实现自动速率限制 我们的API文件.
| 限制 | 值 |
|---|---|
| 请求: | 每5分钟5000 |
| 算法 | 带充值功能的代币桶 |
| 重试 | 指数回退(1s→ 2s → 4s、 最大30秒) |
| 最大重试次数 | 3次尝试 |
项目结构
oura-mcp-server/
├── src/
│ ├── index.ts # MCP server entry point
│ ├── client.ts # Oura API client with auth & rate limiting
│ ├── rate-limiter.ts # Token bucket rate limiter
│ ├── types.ts # TypeScript type definitions
│ └── tools/
│ ├── index.ts # Tool aggregator
│ ├── personal-info.ts
│ ├── sleep.ts
│ ├── activity.ts
│ ├── health.ts
│ ├── workout.ts
│ ├── tags.ts
│ ├── device.ts
│ └── webhook.ts
├── scripts/
│ └── get-token.js # OAuth2 token helper
├── dist/ # Compiled JavaScript
├── package.json
├── tsconfig.json
├── .env.example
├── .gitignore
├── LICENSE
├── CHANGELOG.md
└── README.md
安全
最佳实践
- 从不提交代币 --使用环境变量
- 使用刷新令牌 --启用自动令牌续订
- 沙盒测试 --设置
OURA_USE_SANDBOX=true为了发展 - 限制范围 --仅请求您需要的OAuth2作用域
安全特性
- 已清除所有错误消息中的访问令牌
- 只读API访问(不能修改数据)
- 自动令牌刷新(无需手动令牌管理)
- 利率限制防止API滥用
故障排除
常见问题
| 问题 | 解决方案 |
|---|---|
Cannot find module |
快跑 npm run build |
Access token not configured |
添加 OURA_ACCESS_TOKEN 转到env |
401 Unauthorized |
令牌已过期;添加刷新令牌或获取新令牌 |
403 Forbidden |
缺少OAuth2作用域;重新授权应用程序 |
| 返回空数据 | 检查日期范围;确保环同步数据 |
Token not authorized for scope |
使用所需作用域重新创建OAuth2应用程序 |
获取帮助
- 检查 Oura API文档
- 在GitHub上打开一个问题
- 检查 MCP协议文件
发展
# Install dependencies
npm install
# Build TypeScript
npm run build
# Watch mode (auto-rebuild)
npm run dev
# Run server
npm start
# Clean build
npm run clean
贡献
- 克隆该仓库
- 创建要素分支:
git checkout -b feature/my-feature - 进行更改和测试:
npm run build - 承诺:
git commit -m "Add my feature" - 推:
git push origin feature/my-feature - 创建拉取请求
api参考
许可证
MIT许可证——见 许可证 文件。
免责声明
本软件按“原样”提供,不提供保修。本项目不隶属于Oura Health Oy或得到其认可。
不是医疗建议。 Oura Ring数据仅供参考,不应用于医疗诊断或治疗。