健康数据服务器

一个将Oura Ring健康和健康数据作为模型上下文协议工具暴露给AI助手的.NET 10 MCP服务器。

  • by gjlumsden
  • C#
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 gjlumsden/oura-mcp

使用说明

Oura环MCP服务器

A. .NET 10 MCP服务器 这暴露了 欧拉戒指 健康和保健数据 模型上下文协议 AI助手的工具。

免责声明: 这是一个独立开发的开源项目。它不隶属于大浦健康公司,也不由其认可或赞助。“Oura”和“Oura Ring”是大浦健康株式会社的商标。该项目使用 Oura API v2 但Oura不维护或支持。如需Oura官方支持,请访问 ouraring.com.

概述

此服务器连接到 Oura API v2 随着MCP工具的使用,表面会显示睡眠、活动、准备状态、心率等数据 STDIO传输。身份验证是 首次发射时自动:服务器在首次启动时打开您的浏览器进行Oura授权,令牌在本地持久化,以便静默重用和刷新。一个明确的 oura-mcp login 命令也可用于无头或提前设置。

入门指南

先决条件

1.安装

dotnet tool install -g gjlumsden.OuraMcp

无安装选项

或者在不安装的情况下运行(需要.NET 10):

dnx -y gjlumsden.OuraMcp

2.配置您的MCP客户端

将服务器添加到MCP客户端配置中。客户端通过STDIO启动服务器进程,并将Oura凭据作为环境变量注入。 服务器第一次启动时,它会自动打开您的浏览器,使用Oura进行授权 --不需要单独的登录步骤。然后将令牌保存到 ~/.oura-mcp/tokens.json 并在后续启动时重复使用/刷新。

VS代码(GitHub副本) --添加到 .vscode/mcp.json 或用户设置:

{
  "mcpServers": {
    "oura": {
      "command": "oura-mcp",
      "env": {
        "OURA_CLIENT_ID": "<your-client-id>",
        "OURA_CLIENT_SECRET": "<your-client-secret>"
      }
    }
  }
}

克劳德桌面版 --添加到 claude_desktop_config.json:

{
  "mcpServers": {
    "oura": {
      "command": "oura-mcp",
      "env": {
        "OURA_CLIENT_ID": "<your-client-id>",
        "OURA_CLIENT_SECRET": "<your-client-secret>"
      }
    }
  }
}
Using the no-install (dnx) option?

将服务器条目替换为:

{
  "mcpServers": {
    "oura": {
      "command": "dnx",
      "args": ["-y", "gjlumsden.OuraMcp"],
      "env": {
        "OURA_CLIENT_ID": "<your-client-id>",
        "OURA_CLIENT_SECRET": "<your-client-secret>"
      }
    }
  }
}
Prefer to log in ahead of time (headless / CI)?

在将服务器连接到MCP客户端之前,您可以通过运行 login 子命令:

$env:OURA_CLIENT_ID = "<your-client-id>"
$env:OURA_CLIENT_SECRET = "<your-client-secret>"
oura-mcp login              # or: dnx -y gjlumsden.OuraMcp -- login

令牌保存到 ~/.oura-mcp/tokens.json;后续服务器启动将跳过浏览器提示。你也可以通过 --no-login 到 oura-mcp 抑制启动时的自动登录提示(如果令牌在带外配置,则很有用)。

3.开始使用

配置后,您的MCP客户端将自动发现Oura工具。尝试以下提示:

  • “我昨晚睡得怎么样?”
  • “显示我过去一周的准备状态得分”
  • “这个月我的静息心率趋势是什么?”
  • “比较过去两周我的深度睡眠和快速眼动睡眠”
  • “我的最大摄氧量和心血管年龄是多少?”
  • “这周我压力有多大?”
  • “显示我的SpO2趋势——有什么问题吗?”
  • “我这周什么时候锻炼的,燃烧了多少卡路里?”

与其他MCP工具结合

真正的力量来自将Oura数据与其他MCP服务器相结合。例如,与 工作智商 (微软365复制品):

  • “看看我上周的会议,并将其与我的压力水平联系起来”
  • “我哪天开会最多?这对我的睡眠有什么影响?”
  • “我周五压力很大——那天我的日历上有什么会议?”
  • “比较我在会议繁忙日和集中注意力日的准备程度得分”

随着 Azure MCP服务器:

  • “我本周随叫随到——展示我的睡眠质量和准备情况,这样我就知道我是否适合应对事故”

使用GitHub MCP:

  • “在我的日常活动分数旁边显示我的提交活动——我在高能量的日子里编码得更多吗?”

任何与MCP兼容的工具都可以组合在一起——AI助手会自动连接数据源中的点。

可用工具

工具 说明
get_personal_info 从Oura Ring帐户检索个人信息。
get_ring_configuration 从Oura ring检索环配置详细信息
get_daily_sleep 从Oura Ring检索每日睡眠评分和总结
get_sleep_periods 从Oura Ring检索详细的睡眠期数据
get_sleep_time 从Oura Ring检索推荐的睡眠时间窗口
get_daily_activity 从Oura Ring检索每日活动分数和步数
get_workouts 从Oura Ring检索训练数据
get_sessions 从Oura Ring检索冥想和呼吸练习等会话数据
get_daily_readiness 从奥拉戒指中检索每日准备得分
get_daily_stress 从Oura Ring检索每日压力数据
get_daily_resilience 从Oura Ring检索每日弹性数据
get_rest_mode_periods 从Oura Ring检索休息模式时段数据
get_heart_rate 从Oura Ring检索心率数据
get_daily_spo2 从Oura Ring检索每日SpO2血氧数据
get_vo2_max 从Oura Ring检索VO2最大估计值
get_cardiovascular_age 从Oura Ring检索心血管年龄估计值
get_tags 从Oura Ring中检索标签
get_enhanced_tags 从Oura Ring检索增强标签

大多数日期范围工具接受可选 startDate 和 endDate 参数(格式: YYYY-MM-DD).

注: HRV(心率变异性)数据嵌入 get_sleep_periods 响应-在Oura API v2中没有单独的HRV端点。

身份验证流程

此服务器使用 az login-样式OAuth身份验证 模式,类似于 Azure MCP服务器,融入主MCP体验:

  1. 自动首次启动: 当服务器启动且没有令牌时,它会将您的浏览器打开到Oura OAuth同意屏幕,作为其正常启动的一部分——不需要单独的命令。通过 --no-login 如果您在带外配置令牌,请抑制此行为。
  2. 显式登录(可选): 你仍然可以跑 oura-mcp login (或 dnx -y gjlumsden.OuraMcp -- login 对于“不安装”选项,或 dotnet run --project src/OuraMcp -- login 来自源)以提前进行身份验证(例如,无头设置、CI)。
  3. 代币兑换: 授权后,本地回调服务器 http://localhost:8742/callback/ 接收授权码并将其交换为访问/刷新令牌。
  4. 永久存储: 令牌保存到 ~/.oura-mcp/tokens.json (文件权限仅限于Unix上的所有者)。
  5. 自动刷新: 在后续的启动中,服务器加载保存的令牌,并在过期时自动刷新。

OAuth凭据(OURA_CLIENT_ID, OURA_CLIENT_SECRET)从环境变量中读取,从不存储在源代码中。

无头/CI: OURA_MCP_DISABLE_BROWSER

对于完全无头环境(CI代理、没有显示器的容器),您可以设置 OURA_MCP_DISABLE_BROWSER 环境变量。设置时:

  • 服务器跳过启动系统浏览器,跳过在上绑定本地OAuth回调侦听器 http://localhost:8742/callback/.
  • 在此模式下,交互式登录流程无法完成,因此服务器 快速失败 有一个明显的错误,而不是挂起等待回调。

对 OURA_MCP_DISABLE_BROWSER 随着 --no-login 并在带外提供令牌(例如,复制 tokens.json 在另一台机器上生成到令牌目录中)。运行交互式 oura-mcp login 流动,离开 OURA_MCP_DISABLE_BROWSER 未设置。

发展

贡献或从源代码运行:

git clone https://github.com/gjlumsden/oura-mcp.git
cd oura-mcp
dotnet build
dotnet test
# Set OAuth credentials
$env:OURA_CLIENT_ID = "<your-client-id>"
$env:OURA_CLIENT_SECRET = "<your-client-secret>"

# Run the MCP server locally (STDIO) — opens the browser automatically on first launch
dotnet run --project src/OuraMcp

# Or authenticate explicitly first (optional; useful for headless scenarios)
dotnet run --project src/OuraMcp -- login

缓存

服务器包括 内存缓存 以减少会话中多余的Oura API调用。当人工智能助手使用相同的参数调用相同的工具时,缓存的数据将被返回,而不是再次点击API。

缓存是 仅在内存中 --当服务器进程重新启动时,它会自动清除。不同的日期范围被独立缓存。

TTL 端点 基本原理
60分钟 个人信息、戒指配置 很少更改
15分钟 睡眠、准备状态、睡眠时间、睡眠时间 可以改变(例如小睡),但不经常改变
10分钟 活动、压力、恢复力、锻炼、会话、SpO2、最大摄氧量、心血管年龄、标签、休息模式 记录后稳定的日锚数据
1 分钟 心率 高频流数据

韧性

所有Oura API请求都受 标准弹性管道 由...驱动 波莉 通过 Microsoft.Extensions.Http.Resilience:

策略 配置 目的
重试 3次尝试,指数回退+抖动 处理429(速率限制)、500+、408和网络错误
断路器 以10%的故障率打开,中断5秒 防止敲打故障的API
尝试超时 每个请求10秒 限制单个请求持续时间
总超时时间 30秒(包括重试次数) 限制端到端请求持续时间

韧性处理者尊重 Retry-After 从速率受限的响应中提取标头。认证错误(401)和权限错误(403)由客户端单独处理,不会重试。

技术栈

  • .NET 10 /C#中可以为null的引用类型
  • 模型上下文协议 NuGet包(MCP C#SDK)--STDIO传输
  • 系统。文本。JSON 用于序列化
  • IHttpClientFactory 用于HTTP客户端生命周期管理
  • IMemoryCache 用于具有分层TTL的内存中响应缓存
  • 微软。扩展。Http。韧性 (Polly)用于重试、断路器和超时策略

许可证

麻省理工学院