MCP (模型上下文协议)服务器,使AI助手能够通过OAuth2认证的API调用访问您的Oura Ring健康数据。
专为与Poke和其他兼容MCP的客户端无缝集成而设计。部署到Railway用于生产环境或本地运行进行开发。
git clone https://github.com/meimakes/oura-mcp-server.git
cd oura-mcp-server
npm install
cp .env.example .env
# 生成AUTH_TOKEN
openssl rand -hex 32
# 生成TOKEN_ENCRYPTION_KEY
openssl rand -hex 32
或者手动操作:
# 生成AUTH_TOKEN
openssl rand -hex 32
# 生成TOKEN_ENCRYPTION_KEY
openssl rand -hex 32
在Railway仪表板中添加环境变量:
AUTH_TOKEN - 您生成的身份验证令牌TOKEN_ENCRYPTION_KEY - 您生成的加密密钥NODE_ENV - 设置为productionCORS_ORIGIN - 设置为*或您的特定域名PORT - 不设置(Railway会自动分配)等待部署完成并记录您的Railway URL(例如,https://your-app.up.railway.app)
https://your-app.up.railway.app/oauth/callback在Railway仪表板中添加这些环境变量:
OURA_CLIENT_ID - 您的Oura客户端IDOURA_CLIENT_SECRET - 您的Oura客户端密钥OURA_REDIRECT_URI - https://your-app.up.railway.app/oauth/callbackRailway将自动重新部署新的配置。
ngrok config add-authtoken YOUR_NGROK_TOKEN
ngrok http 3001
https://your-domain.ngrok.dev)复制.env.example到.env并配置:
# MCP服务器身份验证
AUTH_TOKEN=<生成的令牌>
# Oura OAuth凭证
OURA_CLIENT_ID=<您的客户端ID>
OURA_CLIENT_SECRET=<您的客户端密钥>
OURA_REDIRECT_URI=https://your-domain.ngrok.dev/oauth/callback
# 服务器配置
PORT=3001
NODE_ENV=development
# 令牌加密
TOKEN_ENCRYPTION_KEY=<生成的密钥>
# CORS来源
CORS_ORIGIN=*
# 日志记录(可选)
LOG_LEVEL=info # 选项:error, warn, info, debug
npm run build
npm start
对于带有自动重载的开发:
npm run dev
/oauth/authorize端点:
https://your-app.up.railway.app/oauth/authorizehttps://your-domain.ngrok.dev/oauth/authorizehttp://localhost:3001/oauth/authorizehttps://your-app.up.railway.app/sse(或您的部署URL)AUTH_TOKEN该服务器同时支持SSE和可流式传输HTTP传输,以实现最大兼容性。
配置您的MCP客户端:
https://your-app.up.railway.app/sse(或您的部署URL)AUTH_TOKEN获取用户的个人信息和戒指详情。
获取指定日期范围内的睡眠数据。
参数:
start_date(必需):YYYY-MM-DDend_date(可选):YYYY-MM-DDinclude_hrv(可选):布尔值获取每日准备度评分。
参数:
start_date(必需):YYYY-MM-DDend_date(可选):YYYY-MM-DD获取指定日期范围内的活动数据。
参数:
start_date(必需):YYYY-MM-DDend_date(可选):YYYY-MM-DD获取每五分钟间隔的心率数据。
参数:
start_datetime(必需):ISO 8601格式end_datetime(可选):ISO 8601格式获取锻炼会话。
参数:
start_date(必需):YYYY-MM-DDend_date(可选):YYYY-MM-DD获取详细的睡眠周期数据,包括心率和HRV。
参数:
start_date(必需):YYYY-MM-DDend_date(可选):YYYY-MM-DD获取用户创建的标签和笔记。
参数:
start_date(必需):YYYY-MM-DDend_date(可选):YYYY-MM-DD基于最近数据获取AI驱动的洞察。
参数:
days(可选):要分析的天数(默认:7)GET /health
返回服务器状态、OAuth连接状态和缓存统计信息。
GET /oauth/authorize - 开始OAuth流程
GET /oauth/callback - OAuth回调(自动)
GET /oauth/status - 获取连接状态(需要身份验证)
POST /oauth/disconnect - 断开连接并清除令牌(需要身份验证)
服务器支持两种传输模式:
可流式传输HTTP(推荐用于Poke):
POST /sse - JSON-RPC请求,直接响应
经典SSE:
GET /sse - 建立SSE连接
POST /message - 通过会话发送JSON-RPC请求
所有OAuth令牌都使用AES-256-GCM加密进行静态存储。
MCP端点需要Bearer令牌身份验证:
Authorization: Bearer YOUR_AUTH_TOKEN
在.env中通过CORS_ORIGIN配置允许的来源。
服务器使用结构化日志记录,并具有可配置的日志级别:
error - 仅关键错误(建议用于生产)warn - 警告和错误info - 关键操作、警告和错误(默认)debug - 包括请求/响应正文在内的全部详细信息通过LOG_LEVEL环境变量配置:
LOG_LEVEL=info # 默认 - 平衡日志
LOG_LEVEL=error # 生产 - 最小输出
LOG_LEVEL=debug # 开发 - 详细调试
每个级别记录的内容:
OURA_CLIENT_ID和OURA_CLIENT_SECRET是否正确OURA_REDIRECT_URI与您的部署URL匹配TOKEN_ENCRYPTION_KEY是否正确设置且未更改tokens.json文件是否存在且可读/health端点的使用情况服务器无法启动:
PORT变量(Railway自动分配)OAuth重定向失败:
OURA_REDIRECT_URI使用了您的Railway域令牌未持久化:
tokens.json提供持久存储ngrok连接问题:
OURA_REDIRECT_URIoura-mcp-server/
├── src/
│ ├── index.ts # 主服务器文件
│ ├── oauth/
│ │ ├── handler.ts # OAuth流程处理器
│ │ └── tokens.ts # 令牌管理
│ ├── mcp/
│ │ ├── server.ts # MCP协议实现
│ │ └── tools.ts # 工具定义
│ ├── oura/
│ │ ├── client.ts # Oura API客户端
│ │ └── types.ts # TypeScript类型
│ ├── utils/
│ │ ├── encryption.ts # 令牌加密
│ │ ├── cache.ts # 数据缓存
│ │ └── validation.ts # 输入验证
│ └── middleware/
│ ├── auth.ts # 身份验证中间件
│ └── errorHandler.ts # 错误处理
├── .env # 环境变量(git忽略)
├── tokens.json # 加密的令牌(git忽略)
├── package.json
├── tsconfig.json
└── README.md
npm test
npm run typecheck
npm run lint
docker build -t oura-mcp-server .
docker run -p 3001:3001 --env-file .env oura-mcp-server
可以部署到任何Docker兼容平台(如Fly.io、Render等)
MIT
对于问题或疑问:
欢迎贡献!请阅读CONTRIBUTING.md了解详情。