cloudflared--配置~/.cloudflale/config.yml隧道运行
Poke的WHOOP MCP服务器
该项目通过模型上下文协议(MCP)公开WHOOP睡眠和循环压力数据,以便Poke可以通过可流式传输的HTTP进行连接,而传统的HTTP+SSE仍然可用于旧客户端。
先决条件
- 启用了授权码流的WHOOP开发人员应用程序。
- 重定向URL
https://whoop.abhisheksankar.com/oauth/whoop/callback在WHOOP门户网站上注册。 - 来自WHOOP开发人员仪表板的客户端ID和客户端密码。
- 一个公共HTTPS端点(例如,whob.abhisheksankar.com),将为Poke托管此服务器。
设置
npm install
cp .env.example .env更新 .env 在项目根目录中(不要提交此文件):
PUBLIC_BASE_URL=
WHOOP_CLIENT_ID=
WHOOP_CLIENT_SECRET=
TOKEN_STORE_PATH=./data/whoop-tokens.json
PORT=3000
HOST=0.0.0.0
# Optional: require an API key for MCP requests
# MCP_API_KEY=generate-a-strong-key
# Optional: override default scopes (comma-separated)
# WHOOP_SCOPES=offline,read:sleep,read:cycles,read:profile
# Optional: move token storage to Supabase (recommended for Vercel)
# SUPABASE_URL=https://your-project.supabase.co
# SUPABASE_SERVICE_ROLE_KEY=
# SUPABASE_TOKENS_TABLE=whoop_tokens
# SUPABASE_TOKENS_PREFIX=prod使用Supabase持久化代币
Vercel的无服务器文件系统是短暂的,因此当您依赖时,刷新令牌会在部署之间消失 TOKEN_STORE_PATH. 如果你两者都提供 SUPABASE_URL 和 SUPABASE_SERVICE_ROLE_KEY,服务器将令牌存储在Supabase中,而不是磁盘上。创建一个 在Supabase项目中使用简单表(下面的SQL),并确保禁用行级安全性或服务角色键具有插入/更新/删除权限:
create table if not exists whoop_tokens (
key text primary key,
token jsonb not null,
updated_at timestamptz not null default now()
);您可以选择通过以下方式覆盖表名 SUPABASE_TOKENS_TABLE 每个环境的命名空间键使用 SUPABASE_TOKENS_PREFIX. 设置环境变量后,重新部署并完成OAuth流一次,以种子刷新令牌;后续刷新将自动持续。
本地运行
npm run dev打开 http://localhost:3000/oauth/whoop/login 在浏览器中启动WHOOP OAuth流、登录和批准范围。
服务器公开:
POST /mcp--无状态流式HTTP MCP端点。这是Poke和Vercel部署的推荐端点。GET/DELETE /mcp--退货405因为服务器是有意无状态的。GET /sse和POST /messages?sessionId=...--旧客户端的传统HTTP+SSE MCP端点。这些依赖于内存中的会话状态,不适合无服务器部署。POST /sse--已指向的现有可流式传输HTTP客户端的兼容性路径/sse.GET /oauth/whoop/login--启动OAuth流(支持?key=和?next=).GET /oauth/whoop/callback--OAuth重定向处理程序(自动)。GET /healthz--基本准备状态检查。
部署
在HTTPS后面部署服务器 https://whoop.abhisheksankar.com.更新 .env 使用真实的基本URL并重新启动服务。确保端口3000(或您选择的端口)可访问。
Poke配置
如果你设置 MCP_API_KEY,在中发送相同的值 Authorization: Bearer header(Poke的UI接受关键字段,并将其转发为 Authorization).
在Poke的“新整合”形式中:
- 名字:WHOOP(或任何有意义的东西)
- 服务器URL:
https://whoop.abhisheksankar.com/mcp - API密钥:输入以下值
MCP_API_KEY(如果您没有设置,请留空)
可用工具
whoop_sleep_recent--返回最近的睡眠会话,包括持续时间和WHOOP睡眠表现。可选输入:limit,start,end,nextToken,key(用于多用户令牌存储)。whoop_cycle_strain--返回周期摘要,包括应变(压力)和心率指标。与上述可选过滤器相同。
这两个工具都返回与WHOOP分页有效负载匹配的结构化内容,以及用于快速检查的纯文本摘要。
REST端点
GET /metrics/today--返回所存储令牌的当前WHOOP指标的概览JSON快照(可选提供?key=用于多用户设置)。有效载荷包括总睡眠时间、阶段分解、睡眠评分、压力和卡路里燃烧(千焦转换为千卡)。WHOOP的公共API不公开每日步骤总数,因此该字段返回为null目前。
备注
- 服务器为每个用户存储一个令牌集
key(默认值为default).添加?key=user123到/oauth/whoop/login以授权其他帐户。 - WHOOP v2中不存在明确的“步骤”度量;循环应变被暴露为应力代理。
- WHOOP刷新需要
offline范围。服务器现在确保offline默认情况下是请求的,但如果您的现有令牌在更改之前已被授权,则需要重新运行/oauth/whoop/login一次。 - 当请求检测到过期时,令牌会自动刷新,每个帐户有5分钟的安全缓冲区和一次正在进行的刷新,以避免并发刷新竞争。
- OAuth
state是有签名和无状态的,因此回调不再依赖于重启或无服务器调用时内存中的状态。 - 文件支持的令牌写入是原子性的,以避免在中断写入后留下零字节的令牌文件。
- Vercel适用于OAuth回调和无状态
POST /mcp运输。它不适合有状态的SSE/会话传输,因为这些传输依赖于内存中的进程状态。
