关于 Whoop MCP Server
这是一个可自托管的开源 MCP 服务,让 Claude、ChatGPT 等应用查询个人 WHOOP 恢复、睡眠、负荷和训练数据。它按请求从 WHOOP 获取数据,不保存健康数据,并要求每个应用单独登录和获准访问。
主要功能
- 01查询恢复、睡眠、负荷和训练记录
- 02按需从 WHOOP 获取最新数据
- 03提供每日概览与历史趋势分析
- 04通过 OAuth 2.1 登录并逐个授权应用
适用场景
- 01询问昨晚睡眠时长和睡眠阶段
- 02查看恢复、HRV 与静息心率趋势
- 03汇总近期训练、心率区间与消耗
- 04通过 AI 应用查看个人 WHOOP 数据
MCP 相关
作为 MCP 服务,它向客户端提供 WHOOP 数据查询工具,并通过 OAuth 2.1 登录和用户授权限制访问。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e WHOOP_CLIENT_ID -e WHOOP_CLIENT_SECRET -e WHOOP_REDIRECT_URI -e MCP_AUTH_PASSWORD -e PUBLIC_URL -e ENCRYPTION_SECRET -e UPDATE_CHECK ghcr.io/yuridivonis/whoop-mcp-server:1.5.1WHOOP_CLIENT_IDClient ID of your WHOOP developer app.WHOOP_CLIENT_SECRET密钥Client secret of your WHOOP developer app.WHOOP_REDIRECT_URIThe server's /callback address, also added to your WHOOP app. WHOOP needs an https address, such as a tunnel to this computer.MCP_AUTH_PASSWORD密钥Password for the sign-in page that protects /mcp, at least 16 characters.PUBLIC_URLThe address MCP clients use to reach the server. Keep the default when running it on this computer.ENCRYPTION_SECRET密钥Key for encrypting the stored WHOOP tokens. Defaults to WHOOP_CLIENT_SECRET.UPDATE_CHECKOnce a day, ask GitHub for the latest release number and mention a newer version in get_today. Sends nothing about you. Set to false to turn it off.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/yuridivonis/whoop-mcp-server:1.5.1Streamable HTTP工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Whoop MCP 服务
无论你使用哪种 AI,都能查看 WHOOP 数据;不久之后,还能在自己的代码中使用。 可自托管、私密且开源。
向 Claude、ChatGPT 或其他 MCP 应用询问“我这周睡得怎么样?”,即可获得基于你自己的恢复、睡眠、体能消耗和锻炼数据的回答。服务由你自行运行:每当你提出问题时,它都会从 WHOOP 获取数据,不保留任何副本,而且只有你授权的应用才能访问。
这是一个独立的开源项目。它使用 WHOOP API 访问 WHOOP 产品中的数据,与 WHOOP 没有任何关联,也未获得 WHOOP 的认可或赞助。
两种使用方式
- 与数据对话。 部署服务,将它连接到你的 AI,然后提问。请从设置开始,再按将服务添加到你的 AI中的说明操作;其中也列出了目前已测试的应用。
- 基于它构建。 此服务内的 WHOOP 客户端(经过类型检查和测试,并谨慎处理 WHOOP 的一次性刷新令牌)正在拆分为一个库,供你在自己的代码中使用。目前尚未发布:关注此仓库的 Releases,了解发布消息。
基于 Whoop Developer API v2 和 Model Context Protocol(MCP)构建。MCP 是 AI 应用用来调用此类工具的开放标准。
功能
- Whoop 提供什么,就呈现什么,不隐藏任何内容:呈现 Whoop API 中的所有生理数据字段,每条记录都带日期,零值显示为零,未评分的日期也会明确标注
- 恢复:每日恢复评分、HRV、静息心率、SpO2、皮肤温度,以及 Whoop 是否仍在校准
- 睡眠:入睡和起床时间、睡眠时长和卧床时长、清醒和无数据时长、浅睡/深睡/REM 阶段、睡眠周期、干扰情况、表现、效率、一致性、呼吸频率、每晚所需睡眠量(基线、睡眠债、体能消耗、小睡抵扣),以及小睡
- 体能消耗:每日体能消耗评分、卡路里、平均和最高心率,以及步数
- 锻炼:活动、当地开始时间、持续时间、体能消耗、心率、卡路里、各心率区间的时长、距离、海拔增幅和高度变化,以及记录到的心率数据占比
- 实时数据:每次回答都会在你提问时从 Whoop 获取,因此数据始终是最新的。服务只存储登录信息和经过加密的 WHOOP 令牌,绝不存储你的健康数据
- 默认保护隐私:每个应用都使用你设置的密码登录(OAuth 2.1);只有在你勾选授权框后,应用才能访问数据,因此其他人无法读取你的数据
- AI 由你选择:已通过 Claude 和 ChatGPT 进行实时测试;其他支持 OAuth 登录的应用也应该可以同样使用(参见兼容性)
MCP 工具
| 工具 | 描述 |
|---|---|
get_today | 每日晨间简报:最新恢复情况、昨晚的睡眠及睡眠需求和小睡情况,以及今日的负荷;包含所有字段并标注日期 |
get_recovery_trends | 每日恢复情况、HRV、静息心率、SpO2、皮肤温度和校准标记,以及已评分日期的平均值 |
get_sleep_analysis | 每晚睡眠:时间、阶段、表现、效率、一致性、干扰、呼吸频率和睡眠需求;小睡;平均值 |
get_strain_history | 每日负荷、卡路里、心率和步数,以及已完成日期的平均值 |
get_workouts | 训练记录,包含活动、时长、负荷、心率、卡路里、每个心率区间、距离和海拔;合计值 |
get_auth_url | 连接 Whoop 账户的链接(仅可使用一次,10 分钟后过期) |
设置
最快方式:在 Railway 上部署
此模板由本项目的维护者发布。Railway 会按部署支出的一定比例向模板创建者分成,链接中也包含推荐代码;这些都不会让你额外付费。Railway 的 Hobby 计划就足够了。
点击一次即可创建一个 Railway 项目,运行带有卷、自动更新和自动生成密钥的 :1 镜像;无需填写任何内容。已于 2026-09-29 进行线上测试。然后:
- 点击服务卡片。其地址位于 Deployments 标签页顶部,格式为
whoop-mcp-server-production-xxxx.up.railway.app。打开该地址。 - 页面会引导你完成后续步骤:创建 Whoop 开发者应用(页面会显示每个字段),将应用的两个密钥粘贴到服务变量中的占位符处,将页面显示的地址添加到 Claude 或 ChatGPT,然后在你首次提问时授权 Whoop。
如果要手动设置或在其他平台上设置,请继续阅读。
1. 部署
每个版本都会发布为可直接使用的镜像 ghcr.io/yuridivonis/whoop-mcp-server。直接部署即可:除非你想修改代码(参见修改代码),否则无需复刻此仓库。以下步骤使用 Railway;要在其他地方运行,请参见 Docker。
- 在 Railway 项目中,点击 New,选择 Docker Image,然后输入
ghcr.io/yuridivonis/whoop-mcp-server:1。接着,在服务的 Settings → Networking → Public Networking 中选择 Generate Domain:这就是你的服务地址,下文中记为your-app.up.railway.app。服务会据此确定 Whoop 回调地址。 - 添加环境变量:
MCP_AUTH_PASSWORD:连接时每个 AI 应用都会要求输入此密码。使用openssl rand -base64 24生成密码,并将其保存在密码管理器中。未设置此变量时,服务不会启动(密码至少需要 16 个字符)。ENCRYPTION_SECRET(可选,建议设置):使用openssl rand -base64 32生成。此变量用于加密存储的 Whoop 令牌,因此以后轮换 Whoop 客户端密钥时,不会导致账号断开连接。- 暂时将
WHOOP_CLIENT_ID设为replace-with-your-client-id,将WHOOP_CLIENT_SECRET设为replace-with-your-client-secret。服务会将这两个值视为未设置;请在创建 Whoop 开发者应用中替换它们。
- 添加一个挂载到
/data的卷。它用于保存登录信息和加密后的 Whoop 令牌;如果没有此卷,每次重新部署都会使你的应用退出登录并断开 Whoop 连接。 - 启用更新:在服务的 Settings 中,找到 Source,选择 Configure Auto Updates,并设置维护时段(例如 Night)。每次发布 1.x 版本时,
:1标签都会更新,Railway 随后会重新部署服务;使用 Pro 计划时,会先备份卷。 - 部署后,打开
https://your-app.up.railway.app/:设置页面会引导你完成其余步骤。如果部署失败,请查看日志:服务会说明缺少什么。
已在 Railway 上运行复刻版本? 将其切换为镜像:打开服务的 Settings,将 Service Source 改为 ghcr.io/yuridivonis/whoop-mcp-server:1,并按照步骤 4 启用自动更新。保留相同的环境变量和卷,这样 Whoop 就能保持连接。如果你的复刻版本早于 1.3.0,请先阅读升级到 1.3.0:每个应用都需要重新登录一次。之后将不再使用你的复刻版本。
2. 创建 Whoop 开发者应用
服务器的设置页面 https://your-app.up.railway.app/ 会按照 Whoop「New App」表单自身的顺序引导你填写,每个值旁边都有一个 Copy 按钮,可供复制粘贴。简要步骤如下:
-
在 Whoop Developer Dashboard 中打开 New App,从上到下填写表单:
- Name:任意名称。批准应用时你会看到它。
- Logo:跳过。
- Contacts:你的电子邮件地址。只有 Whoop 会看到。
- Privacy Policy:本项目的 PRIVACY.md、
https://github.com/yuridivonis/whoop-mcp-server/blob/main/PRIVACY.md,或者你为他人运行服务器时自行修改的副本。批准应用时,用户会看到此链接。 - Redirect URLs:服务器的回调地址,
https://your-app.up.railway.app/callback,必须与设置页面显示的内容完全一致。 - Scopes:
read:recovery、read:cycles、read:sleep和read:workout。服务器不会使用其他权限范围。登录时还会请求offline,它允许服务器续订 Whoop 访问权限,无需你再次登录;控制面板中不会列出它。 - Webhooks:跳过。
点击 Create App:Whoop 会显示应用的 Client ID 和 Client Secret。
-
在服务的 Variables 标签页中,选中
WHOOP_CLIENT_ID里的replace-with-your-client-id,粘贴 Client ID 替换它;对WHOOP_CLIENT_SECRET里的replace-with-your-client-secret执行相同操作;然后点击顶部的 Deploy。设置页面随后会勾选步骤 2 和 3。
如果之后添加了自定义域名,请重新打开设置页面:如果显示的 Redirect URL 有变化,请在 Whoop 应用中更新它,或设置 WHOOP_REDIRECT_URI。
3. 连接你的 AI
将服务器地址 https://your-app.up.railway.app/mcp 添加到 AI 应用中,作为自定义连接器。它会打开服务器的登录页面:确认页面显示的是你要连接的应用,输入 MCP_AUTH_PASSWORD,并勾选允许其读取你的 Whoop 数据。例如,在 Claude.ai 中:Customize → Connectors → + → Add custom connector。
添加到你的 AI 中列出了 Claude、ChatGPT、Claude Code、Cursor、VS Code 和 Windsurf 的操作步骤,以及已测试的平台。应用在重新部署后仍会保持登录状态;没有密码的用户访问 /mcp 时会收到 401 Unauthorized。
4. 连接你的 Whoop 账户
- 在聊天中询问 AI 你的恢复情况。第一次回复会提供一个 Whoop 链接(它会调用
get_auth_url)。 - 打开链接,登录 Whoop 并批准应用,即可完成操作。你会被重定向回来,此后 AI 就能为你作答。
- 随便问吧:“我昨晚睡得怎么样?”
升级到 1.3.0
1.3.0 不再保留 Whoop 数据副本,并会在每个应用接收数据前征求你的同意。升级步骤如下:
- 获取新版本:使用镜像时,Railway 会自动为你更新;或者将 Service Source 切换为
:1标签并重新部署(Docker 使用:1时:重新拉取镜像并重启)。使用分支副本时,点击 GitHub 的 Sync fork 按钮,然后重新部署;也可以按照 Deploy 中的说明切换到镜像。 - 服务器首次启动时,会删除早期版本存储的恢复、睡眠、压力和锻炼数据,并重写数据库文件,确保磁盘上不再留有这些数据。Whoop 连接会保留。日志会显示
Deleted the WHOOP data stored by an earlier version。 - 所有应用都会退出登录一次。下次使用应用时,会打开登录页面:输入密码并勾选允许其读取你的 Whoop 数据。
sync_data已移除。如果应用中仍列有它,请移除连接器并重新添加。- 如果主机保留了卷的备份或快照,请删除升级前创建的那些备份。它们仍包含旧副本。
数据库升级后无法回退到 1.2.x:旧版本无法使用新的登录表为应用登录。
从 1.0.0 升级
1.1.0 在 /mcp 前增加了登录验证。1.0.0 在此处没有身份验证,因此任何能通过 HTTP 与 Claude 正常配合使用的 1.0.0 服务,都会向知道 URL 的任何人提供数据。(未经修改的 1.0.0 还存在请求解析错误,导致 Claude 完全无法通过 HTTP 连接;1.1.0 修复了这两个问题。)升级步骤如下:
- 更新你的分支(点击 GitHub 的 Sync fork 按钮,或合并上游
main分支),或者按照 Deploy 中的说明,将服务切换到该镜像。 - 在 Railway 变量中设置
MCP_AUTH_PASSWORD(参见 Setup 第 1 步)。未设置时,新版本不会启动。这是有意为之。 - 重新部署。
- 在 Claude.ai → Settings → Connectors 中,移除 Whoop 连接器,然后使用相同的 URL 重新添加。Claude 会显示一次登录页面。
- 如果某个工具提示你的 Whoop 授权已过期,请运行一次
get_auth_url以重新连接。 - 可选:在 Whoop 应用中取消勾选
read:profile和read:body_measurement。1.1.0 不再使用它们。
如果你的 1.0.0 服务曾通过公开 URL 与 Claude 正常配合使用,请假设你的数据可能已被读取。为谨慎起见,请在 Whoop 开发者控制面板中轮换客户端密钥,更新 WHOOP_CLIENT_SECRET,然后运行一次 get_auth_url。除非设置了 ENCRYPTION_SECRET,否则存储的 Whoop 令牌是使用旧客户端密钥加密的。服务仍会启动,并将 Whoop 视为未连接,直到你重新连接。
安全性
/mcp只响应已登录的客户端。登录码和刷新令牌只能使用一次,并以哈希形式存储;如果任何一个被使用两次,整个登录会话都会被撤销。- 每个地址每 15 分钟最多可尝试登录 10 次,每小时总计最多 50 次。
- 登录码只会发送给 Claude、ChatGPT、你自己电脑上的桌面应用,或通过
MCP_ALLOWED_REDIRECT_HOSTS添加的 Web 客户端。登录页面会显示你将返回的位置:只有在你主动发起连接时才登录。 - 只有在勾选允许应用读取 Whoop 数据的选项后,该应用才会完成登录。
- Whoop 令牌在静态存储时会加密(AES-256-GCM)。你的健康数据不会被存储:服务会针对每个问题从 Whoop 获取数据,并且只将其发送给你已登录的客户端。
- 更改
MCP_AUTH_PASSWORD会让所有客户端退出登录。 - 服务只会向 Whoop 请求恢复情况、周期、睡眠和锻炼数据。
有关完整的安全模型以及如何私下报告漏洞,请参阅 SECURITY.md;有关部署会存储和共享哪些内容,请参阅 PRIVACY.md。
WHOOP 条款:服务端的职责,以及由你负责的事项
部署此服务端时,你需要注册自己的 Whoop 开发者应用,因此根据 WHOOP 的 API 使用条款,自 2026 年 10 月 6 日起,你就是条款中所说的开发者(“公司”)。条款为各节编号,但未为节内段落编号,因此此处通过节和标题引用各段落。这只是对涉及服务端如何处理数据的义务所作的摘要,不构成法律建议,也不保证任何部署都符合要求:部署前请阅读条款。
| WHOOP 条款 | 要求 | 服务端的职责,以及由你负责的事项 |
|---|---|---|
| 4. WHOOP 数据,WHOOP 数据的禁止事项 | 在 WHOOP 数据传给第三方之前,必须明确征得用户同意 | 你连接的每个应用都是第三方。登录页面会说明数据将发送到哪里,并且只有在你勾选允许共享的选项后,才会登录应用。 |
| 4. WHOOP 数据,WHOOP 数据的禁止事项 | 不得使用数据库或保留永久副本;缓存副本的保留时间不得超过 WHOOP 缓存标头允许的时限 | 不存储任何数据。每次请求时,都会从 WHOOP 获取相应答复;同时发起请求的工具会共用一个请求,处理完成后不会保留任何内容。 |
| 4. WHOOP 数据,WHOOP 数据的禁止事项 | 不得使用 WHOOP 数据来创建、开发、测试、训练、微调或改进 AI | 服务端不会训练任何内容,本项目的测试仅使用合成数据。连接应用前,请关闭允许应用提供方使用你的对话来改进其模型的任何设置。 |
| 2. 公司应用,应用安全 | 对传输中和静态存储的 WHOOP 数据进行加密;在 48 小时内向 WHOOP 报告安全事件 | 如果未使用 https,服务端会拒绝在公共地址上运行;它唯一存储的 WHOOP 数据是你的加密令牌。报告安全事件由你负责:见下文。 |
| 1. WHOOP API 的使用,允许的访问 | 每个应用使用一组 WHOOP 凭据 | 为每次部署提供一个单独的 Whoop 开发者应用。 |
| 3. 限制;保密,保密 | 对开发者凭据保密,且绝不得将其嵌入开源项目 | 服务端从环境变量读取凭据。切勿将其提交到代码仓库,包括派生仓库。 |
| 3. 限制;保密,API 禁止事项 | 不得提供医疗、法律或其他专业建议,也不得用作医疗器械 | 工具只会报告 WHOOP 的数据。它们不会提供建议或作出诊断,你基于这些工具构建的任何内容也不应如此。 |
如果你替他人运行
每次部署仅服务于一个 Whoop 账户。如果你替他人部署,对方就是你的最终用户;根据 2. 公司应用,你需要负责:
- 同意: 对方通过 Whoop 登录连接自己的 Whoop 账户,并自行勾选每个应用的选项,因此他们需要知道服务端密码(
MCP_AUTH_PASSWORD)。不要替他们勾选(最终用户授权与同意)。 - 隐私政策: 根据你的联系方式修改 PRIVACY.md,并在 Whoop 应用中添加该文件的链接(最终用户隐私)。
- 支持: 为他们提供便捷的联系渠道(最终用户授权与同意、应用支持)。
- 安全事件: 如果有人未经授权访问他们的数据,应在发现事件后的 48 小时内通过 [email protected] 通知 WHOOP,并依法告知他们(应用安全)。见 SECURITY.md。
- 更新: 确保部署使用受支持的版本。
- AI: 绝不得使用他们的数据来测试或改进任何 AI 系统,包括你自己的实验。
Docker
每个版本都会以 amd64 和 arm64 镜像的形式发布到 GitHub 的容器注册表中。它运行的服务与上面的 Railway 配置相同:
docker run -d --name whoop-mcp -p 3000:3000 -v whoop-data:/data \
-e WHOOP_CLIENT_ID=replace-with-your-client-id \
-e WHOOP_CLIENT_SECRET=replace-with-your-client-secret \
-e WHOOP_REDIRECT_URI=https://your-server.example.com/callback \
-e MCP_AUTH_PASSWORD=replace-with-a-password-of-16-or-more-characters \
ghcr.io/yuridivonis/whoop-mcp-server:1
- **在具有公开 https 地址的服务上:**将
WHOOP_REDIRECT_URI设置为该地址的/callback,并像使用 Railway 一样,将 AI 应用连接到其/mcp。服务根目录下的设置页面会显示剩余步骤。 - **在自己的电脑上:**Whoop 登录仍需要 https 地址,因此将隧道指向端口 3000(见下文),并使用隧道的
/callback。添加-e PUBLIC_URL=http://localhost:3000,这样同一台电脑上的 MCP 客户端就能连接到http://localhost:3000/mcp。 - 登录信息和 Whoop 令牌保存在
whoop-data卷中,因此重启和升级后仍会保持连接。 - 标签:
:1始终指向最新的 1.x 版本,因此重新拉取它(或重新部署)即可获取修复和新功能,且不会引入破坏性变更。:1.3.0等标签固定到某个确切版本;:latest则跟随每个版本,包括未来的 2.0 版本。
要检查镜像是否由此仓库的发布工作流构建,请运行 gh attestation verify oci://ghcr.io/yuridivonis/whoop-mcp-server:1 --owner yuridivonis。
该服务也已作为 io.github.yuridivonis/whoop-mcp-server 收录在官方 MCP Registry 中。
在自己的电脑上运行
需要 Node.js 22 或更高版本。
# Install dependencies
npm install
# Create .env file (npm run dev loads it)
cat > .env << EOF
WHOOP_CLIENT_ID=replace-with-your-client-id
WHOOP_CLIENT_SECRET=replace-with-your-client-secret
# Whoop needs an https address: use your tunnel's (see below)
WHOOP_REDIRECT_URI=https://your-tunnel.example.com/callback
MCP_AUTH_PASSWORD=replace-with-a-password-of-16-or-more-characters
MCP_MODE=http
EOF
# Run in development mode (restarts on changes)
npm run dev
# Run the tests and the type check
npm test
npm run typecheck
该仓库采用 npm 工作区:服务位于 src/,它所基于的 WHOOP API 客户端位于 packages/whoop-client,这是一个也可以单独使用的库。npm install 会将两者关联起来,而 npm test、npm run typecheck、npm run build 和 npm run dev 会先构建该库。修改库本身时,运行 npx tsc -b -w packages/whoop-client 可在开发过程中持续重新构建。
Whoop 的重定向 URL 必须使用 https(或应用方案),因此在自己的电脑上运行服务时,需要使用 https 隧道,例如 cloudflared tunnel --url http://localhost:3000 或 ngrok http 3000。然后:
- 将
WHOOP_REDIRECT_URI设置为隧道的/callback地址。 - 将该地址添加到你的 Whoop 应用中。
- 将 MCP 客户端连接到隧道的
/mcp地址。
快速隧道每次启动都会获得新地址,因此需要重复步骤 1 到 3;命名隧道则会一直使用同一个地址。流量(包括工具的答复)会经过隧道提供商。
MCP_MODE=stdio 会为以本地命令启动服务的 MCP 客户端运行服务。它不需要登录,因为只有启动它的应用才能访问它。它也无法接收 Whoop 登录,因此请先在 http 模式下运行服务,并使用相同的 DB_PATH 连接一次 Whoop;随后停止服务,再启动 stdio 服务。请勿同时运行两者:Whoop 每次使用都会替换刷新令牌,因此共享同一个数据库的两个服务会互相登出。
修改代码
如需运行自己修改的版本,请 fork 此仓库并部署该 fork,而不是使用镜像:在 Railway 中选择 New → GitHub Repo,系统会构建 Dockerfile。fork 不会自动更新:要获取新版本,请使用 GitHub 的 Sync fork 按钮并重新部署,同时逐步合并自己的修改。如果不需要修改,使用镜像更简单,而且会自动保持最新。
环境变量
| 变量 | 说明 | 默认值 |
|---|---|---|
WHOOP_CLIENT_ID | Whoop OAuth 客户端 ID | 连接 Whoop 所必需。在两项都设置之前,/ 的设置页面会显示操作步骤;包含 replace-with 的值会被视为未设置 |
WHOOP_CLIENT_SECRET | Whoop OAuth 客户端密钥 | 同上 |
WHOOP_REDIRECT_URI | OAuth 回调 URL | PUBLIC_URL + /callback;在 Railway 上为 https://<the service's domain>/callback;其他情况下为 http://localhost:3000/callback |
MCP_AUTH_PASSWORD | 保护 /mcp 的登录页面密码(16 个字符以上) | http 模式下必需 |
PUBLIC_URL | 服务器的公开地址(如果与 WHOOP_REDIRECT_URI 的地址不同)。AI 应用必须连接到 PUBLIC_URL/mcp。 | WHOOP_REDIRECT_URI 的源地址 |
ENCRYPTION_SECRET | 用于加密存储的 Whoop 令牌的密钥 | WHOOP_CLIENT_SECRET |
MCP_ALLOWED_REDIRECT_HOSTS | 允许接收登录码的其他 Web 客户端,以逗号分隔的主机名表示(例如 app.example.com)。Claude、ChatGPT,以及你自己电脑上的桌面应用(本地地址,以及 Cursor、VS Code 和 Windsurf 链接)始终获准。 | 无 |
TRUST_PROXY | 允许报告客户端 IP 的代理(用于登录速率限制):跳数、false 或地址/子网 | Railway 上为 1,其他情况下为 false |
DB_PATH | SQLite 数据库路径(登录信息和加密后的 Whoop 令牌) | ./whoop.db |
PORT | HTTP 服务端口 | 3000 |
MCP_MODE | 服务使用 http;MCP 客户端以本地命令启动服务时使用 stdio(参见在自己的电脑上运行) | http |
UPDATE_CHECK | 每天向 GitHub 查询最新版本号;如果有更新版本,在 get_today 的回答末尾附上一行通知。该请求不会携带任何关于你或你的数据的信息。设为 false 可关闭此功能。 | true |
架构
┌─────────────────────────────────────────────────┐
│ Your AI app (Claude, ChatGPT, ...) │
│ "How did I sleep last night?" │
└────────────────────────┬────────────────────────┘
│ signs in once (OAuth 2.1),
│ then calls tools on /mcp
▼
┌─────────────────────────────────────────────────┐
│ Whoop MCP Server │
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ Sign-in │─────►│ SQLite Database │ │
│ │ (OAuth 2.1) │ │ - sign-ins │ │
│ └─────────────┘ │ - Whoop tokens │ │
│ ┌─────────────┐ │ (encrypted) │ │
│ │ MCP tools │ └──────────────────┘ │
│ └──────┬──────┘ ▲ │
│ ▼ │ │
│ ┌─────────────┐ │ │
│ │ whoop-client│─── tokens ────┘ │
│ │ (library) │ (no health data is stored) │
│ └─────────────┘ │
└─────────┬───────────────────────────────────────┘
│ Whoop OAuth + API v2, live on every call
▼
┌─────────────────────────────────────────────────┐
│ Whoop API │
└─────────────────────────────────────────────────┘
服务端通过 packages/whoop-client 中的 whoop-client 与 WHOOP 通信:这是一个简洁、带类型定义的库,任何人都可以用它基于 WHOOP 数据构建应用,并由它处理登录和令牌刷新。目前尚未发布到 npm。
使用的 Whoop API 端点
GET /v2/cycle- 生理周期(负荷数据)GET /v2/recovery- 恢复评分GET /v2/activity/sleep- 睡眠记录GET /v2/activity/workout- 锻炼记录
贡献
欢迎提交问题和拉取请求。每项更改都必须通过拉取请求进行,只有在 CI 通过且维护者审核后才能合并。
- 更改需附带测试。 新功能或错误修复都要为自动化测试套件添加相应测试:服务端测试位于
test/,WHOOP 客户端测试位于packages/whoop-client/test/。提交拉取请求前,请运行npm test和npm run typecheck。每个拉取请求都会在 CI 中运行这两项测试,以及 Docker 冒烟测试和 CodeQL 扫描。 - 代码风格: 使用严格模式的 TypeScript,遵循
src/、packages/whoop-client/src/和测试中的现有写法。添加依赖时,必须在拉取请求中说明理由。 - 服务端按包名使用 WHOOP 客户端, 即
@yuridivonis/whoop-client,绝不通过packages/whoop-client/src中的路径引用:库的第二个副本会导致其错误上的instanceof检查失效。唯一例外是测试中从packages/whoop-client/test/导入的伪造 WHOOP。 - 安全问题: 请按照 SECURITY.md 中的说明私下报告,不要在问题中公开。
仅使用合成数据。 测试使用返回虚构记录的伪造 Whoop API(packages/whoop-client/test/fake-whoop.ts),未来的评估也会如此。绝不要在测试、测试夹具、问题或拉取请求中放入真实的 Whoop 数据,无论是你自己的还是他人的:WHOOP 的条款禁止将其用于测试 AI 系统,而且这些数据属于个人健康数据。
更新日志
请参阅 CHANGELOG.md。
许可证
MIT - 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。