mcpField
W
Whoop MCP Server

Whoop MCP Server

本地服务
github.com健康医疗164 周前更新

关于 Whoop MCP Server

这是一个可自托管的开源 MCP 服务,让 Claude、ChatGPT 等应用查询个人 WHOOP 恢复、睡眠、负荷和训练数据。它按请求从 WHOOP 获取数据,不保存健康数据,并要求每个应用单独登录和获准访问。

主要功能

  1. 01查询恢复、睡眠、负荷和训练记录
  2. 02按需从 WHOOP 获取最新数据
  3. 03提供每日概览与历史趋势分析
  4. 04通过 OAuth 2.1 登录并逐个授权应用

适用场景

  1. 01询问昨晚睡眠时长和睡眠阶段
  2. 02查看恢复、HRV 与静息心率趋势
  3. 03汇总近期训练、心率区间与消耗
  4. 04通过 AI 应用查看个人 WHOOP 数据

MCP 相关

作为 MCP 服务,它向客户端提供 WHOOP 数据查询工具,并通过 OAuth 2.1 登录和用户授权限制访问。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"yuridivonis-whoop": {
"command": "docker",
"args": [
"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.1"
],
"env": {
"WHOOP_CLIENT_ID": "<WHOOP_CLIENT_ID>",
"WHOOP_CLIENT_SECRET": "<WHOOP_CLIENT_SECRET>",
"WHOOP_REDIRECT_URI": "<WHOOP_REDIRECT_URI>",
"MCP_AUTH_PASSWORD": "<MCP_AUTH_PASSWORD>",
"PUBLIC_URL": "<PUBLIC_URL>",
"ENCRYPTION_SECRET": "<ENCRYPTION_SECRET>",
"UPDATE_CHECK": "<UPDATE_CHECK>"
}
}
}
}
启动命令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.1
需要配置的环境变量
WHOOP_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/yuridivonis/whoop-mcp-server:1.5.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

README 配图

Whoop MCP 服务

CI OpenSSF Scorecard OpenSSF Best Practices Latest release License: MIT

无论你使用哪种 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 上部署

点击一次即可创建一个 Railway 项目,运行带有卷、自动更新和自动生成密钥的 :1 镜像;无需填写任何内容。已于 2026-09-29 进行线上测试。然后:

  1. 点击服务卡片。其地址位于 Deployments 标签页顶部,格式为 whoop-mcp-server-production-xxxx.up.railway.app。打开该地址。
  2. 页面会引导你完成后续步骤:创建 Whoop 开发者应用(页面会显示每个字段),将应用的两个密钥粘贴到服务变量中的占位符处,将页面显示的地址添加到 Claude 或 ChatGPT,然后在你首次提问时授权 Whoop。

如果要手动设置或在其他平台上设置,请继续阅读。

1. 部署

每个版本都会发布为可直接使用的镜像 ghcr.io/yuridivonis/whoop-mcp-server。直接部署即可:除非你想修改代码(参见修改代码),否则无需复刻此仓库。以下步骤使用 Railway;要在其他地方运行,请参见 Docker。

  1. 在 Railway 项目中,点击 New,选择 Docker Image,然后输入 ghcr.io/yuridivonis/whoop-mcp-server:1。接着,在服务的 Settings → Networking → Public Networking 中选择 Generate Domain:这就是你的服务地址,下文中记为 your-app.up.railway.app。服务会据此确定 Whoop 回调地址。
  2. 添加环境变量:
    • 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 开发者应用中替换它们。
  3. 添加一个挂载到 /data 的卷。它用于保存登录信息和加密后的 Whoop 令牌;如果没有此卷,每次重新部署都会使你的应用退出登录并断开 Whoop 连接。
  4. 启用更新:在服务的 Settings 中,找到 Source,选择 Configure Auto Updates,并设置维护时段(例如 Night)。每次发布 1.x 版本时,:1 标签都会更新,Railway 随后会重新部署服务;使用 Pro 计划时,会先备份卷。
  5. 部署后,打开 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 按钮,可供复制粘贴。简要步骤如下:

  1. 在 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。

  2. 在服务的 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 账户
  1. 在聊天中询问 AI 你的恢复情况。第一次回复会提供一个 Whoop 链接(它会调用 get_auth_url)。
  2. 打开链接,登录 Whoop 并批准应用,即可完成操作。你会被重定向回来,此后 AI 就能为你作答。
  3. 随便问吧:“我昨晚睡得怎么样?”

升级到 1.3.0

1.3.0 不再保留 Whoop 数据副本,并会在每个应用接收数据前征求你的同意。升级步骤如下:

  1. 获取新版本:使用镜像时,Railway 会自动为你更新;或者将 Service Source 切换为 :1 标签并重新部署(Docker 使用 :1 时:重新拉取镜像并重启)。使用分支副本时,点击 GitHub 的 Sync fork 按钮,然后重新部署;也可以按照 Deploy 中的说明切换到镜像。
  2. 服务器首次启动时,会删除早期版本存储的恢复、睡眠、压力和锻炼数据,并重写数据库文件,确保磁盘上不再留有这些数据。Whoop 连接会保留。日志会显示 Deleted the WHOOP data stored by an earlier version。
  3. 所有应用都会退出登录一次。下次使用应用时,会打开登录页面:输入密码并勾选允许其读取你的 Whoop 数据。
  4. sync_data 已移除。如果应用中仍列有它,请移除连接器并重新添加。
  5. 如果主机保留了卷的备份或快照,请删除升级前创建的那些备份。它们仍包含旧副本。

数据库升级后无法回退到 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 修复了这两个问题。)升级步骤如下:

  1. 更新你的分支(点击 GitHub 的 Sync fork 按钮,或合并上游 main 分支),或者按照 Deploy 中的说明,将服务切换到该镜像。
  2. 在 Railway 变量中设置 MCP_AUTH_PASSWORD(参见 Setup 第 1 步)。未设置时,新版本不会启动。这是有意为之。
  3. 重新部署。
  4. 在 Claude.ai → Settings → Connectors 中,移除 Whoop 连接器,然后使用相同的 URL 重新添加。Claude 会显示一次登录页面。
  5. 如果某个工具提示你的 Whoop 授权已过期,请运行一次 get_auth_url 以重新连接。
  6. 可选:在 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。然后:

  1. 将 WHOOP_REDIRECT_URI 设置为隧道的 /callback 地址。
  2. 将该地址添加到你的 Whoop 应用中。
  3. 将 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_IDWhoop OAuth 客户端 ID连接 Whoop 所必需。在两项都设置之前,/ 的设置页面会显示操作步骤;包含 replace-with 的值会被视为未设置
WHOOP_CLIENT_SECRETWhoop OAuth 客户端密钥同上
WHOOP_REDIRECT_URIOAuth 回调 URLPUBLIC_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_PATHSQLite 数据库路径(登录信息和加密后的 Whoop 令牌)./whoop.db
PORTHTTP 服务端口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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。