apple-watch-health-mcp

mcp
Security Audit
Fail
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Fail
  • network request — Outbound network request in cloudflare/src/worker.js
  • network request — Outbound network request in cloudflare/test/worker.test.js
  • Hardcoded secret — Potential hardcoded credential in cloudflare/test/worker.test.js
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

Self-hosted Apple Health and Apple Watch bridge for ChatGPT and MCP clients

README.md

Apple Watch Health MCP

把用户明确授权的 Apple Health / Apple Watch 数据,通过自托管 Cloudflare Worker 暴露为远程 MCP 工具,让 ChatGPT、Codex 或其他 MCP 客户端读取最新数据和受限历史。

This project connects user-authorized Apple Health data to an AI assistant through a self-hosted MCP relay.

这是一份可自行部署的实验项目,不是医疗设备,也不提供诊断或治疗建议。

能做什么

  • iPhone 从 HealthKit 读取心率、静息心率、HRV、血氧、呼吸频率、步数、距离、活动能量、噪音暴露、睡眠等数据。
  • Apple Watch 在用户主动开启实时模式后,通过 HKWorkoutSession 获取实时心率样本。
  • 睡眠保存最近 7 天的阶段片段(在床、清醒、核心、深睡、REM 等),其余指标每项保存最近 3 次采样。
  • Cloudflare Worker 自动去重和裁剪历史,并通过四个 MCP 工具返回数据、新鲜度与保留范围。
  • 使用两个独立随机令牌保护上传接口和 MCP 地址。
  • 用户可以随时调用删除接口清空服务器上的健康快照。

重要限制

  • MCP 不能远程启动 Apple Watch 传感器。实时心率必须由用户在手表上打开 App 并点“开始”。
  • watch_measure_now 只能在实时模式已经运行时等待下一条新心率样本。
  • 血氧、噪音、睡眠等指标只能读取 HealthKit 中已有的记录,不能由第三方 App 强制立即测量。
  • HealthKit 后台更新由系统调度,不保证零延迟。设备型号、地区、系统版本和用户授权会影响可用指标。
  • 保留窗口有意保持很短:睡眠 7 天,其他指标 3 次。本项目不是长期健康档案或医疗数据库。

架构

flowchart LR
    W[Apple Watch App] -->|实时心率 HTTPS| C[Cloudflare Worker]
    I[iPhone HealthKit App] -->|受限健康历史 HTTPS| C
    C --> D[(Durable Object\n睡眠 7 天 / 其他 3 次)]
    A[ChatGPT / MCP Client] -->|远程 MCP| C

目录

  • ios/: SwiftUI iPhone App、watchOS App 和 Xcode 工程。
  • cloudflare/: Worker、Durable Object、MCP 接口和自动测试。
  • PRIVACY.md: 数据流、风险和删除方式。
  • SECURITY.md: 密钥管理与漏洞报告建议。

1. 部署 Cloudflare Worker

需要 Node.js 20+、Cloudflare 账号和 Wrangler。

cd cloudflare
npm install
npx wrangler login

生成两个不同的随机令牌,并把它们临时保存在密码管理器中:

openssl rand -hex 32
openssl rand -hex 32

分别写入 Worker Secret:

npx wrangler secret put UPLOAD_TOKEN
npx wrangler secret put MCP_PATH_TOKEN
npm run deploy

部署完成后记下 Worker 地址,例如:

https://watch-health-mcp.<your-subdomain>.workers.dev

2. 配置并安装 Apple App

复制示例配置到两个 target。RelayConfig.plist 已加入 .gitignore,不要提交它。

cp ios/Configuration/RelayConfig.example.plist ios/WatchHealthTest/RelayConfig.plist
cp ios/Configuration/RelayConfig.example.plist "ios/WatchHealthLive Watch App/RelayConfig.plist"

在两个文件中填写:

  • BaseURL: 上一步得到的 Worker 地址,不带末尾 /
  • UploadToken: 写入 Cloudflare 的 UPLOAD_TOKEN

然后:

  1. 用 Xcode 打开 ios/WatchHealthTest.xcodeproj
  2. 在 iPhone 和 Watch 两个 Targets 的 Signing & Capabilities 中选择自己的 Team。
  3. 如果 Bundle Identifier 冲突,把 com.example.AppleWatchHealthMCP 改成自己的唯一标识,并保持 Watch App 的 Companion App Identifier 一致。
  4. 确认两个 Targets 都启用了 HealthKit。
  5. 先运行 iPhone App并授权,再从 Watch App 安装列表安装 WatchHealthLive

没有私密配置文件时,App 仍可本地读取并展示 HealthKit 数据,但不会上传。

3. 连接 MCP 客户端

远程 MCP 地址为:

https://watch-health-mcp.<your-subdomain>.workers.dev/mcp/<MCP_PATH_TOKEN>

把完整地址添加到支持远程 MCP 的客户端中。这个 URL 本身就是访问健康数据的凭证,禁止截图、分享或提交到 GitHub。

可用工具:

  • watch_health_open_session: 首先调用,查看连接、实时模式与数据新鲜度。
  • watch_get_latest_health: 读取所有最新指标、采样时间、数据年龄和历史条数。
  • watch_get_health_history: 读取睡眠近 7 天的完整阶段,或其他指标最近 3 次采样;可通过 metric 参数只查询一项。
  • watch_measure_now: 实时模式开启时,等待一条请求之后产生的新心率样本。

删除云端数据

curl -X DELETE \
  -H "Authorization: Bearer <UPLOAD_TOKEN>" \
  "https://watch-health-mcp.<your-subdomain>.workers.dev/data"

返回 {"ok":true,"deleted":true} 后,Durable Object 中的最新数据、受限历史与待处理命令已被清除。

开发检查

cd cloudflare
npm test
npm run check

iOS 和 watchOS 工程建议使用 Xcode 16 或更新版本。最低部署目标为 iOS 17 和 watchOS 10。

License

MIT

Reviews (0)

No results found