Renpho Health MCP
Renpho Health MCP — 为你的 Claude 训练教练提供智能秤数据
一个远程 MCP 服务器,部署在 Cloudflare Workers 上,通过 Renpho Health 云 API 将你的 Renpho 智能秤 身体成分数据——体重、体脂、去脂体重、肌肉、水分、骨骼、内脏脂肪、BMR、代谢年龄等——暴露给 Claude。 只需添加一次作为自定义连接器,即可在 Claude 网页版、桌面版和移动版 上使用。与 Strava 和 Google Health 连接器配合使用,让你的教练看到训练负荷、恢复情况和身体成分。
数据来源: Renpho Health 应用(蓝色图标)后端,位于
cloud.renpho.com。旧版 Renpho 应用(renpho.qnclouds.com)上的账户 不受支持——请先在应用中迁移它们。
基于 StartupBros-com/renpho-mcp-server (一个本地 stdio 服务器)和 forkerer/RenphoGarminSync-CLI 逆向工程协议构建,重构为多用户远程 Worker,风格类似 google-health-mcp。
工具
工具 | 回答的问题 |
| “我目前状态如何?” — 最新读数,包含所有指标、类别分类、与 7/30/90 天前的变化,以及向应用体重目标的进展 |
| 一段时间内的读数历史:每次称重的所有指标,或按天/周平均;可选指标子集和设备/阻抗详情 |
| 每个指标的起始/结束平均值、变化、最小/最大/平均值以及最小二乘周速率(含 r²),还有每日/每周序列——体重变化是脂肪还是瘦体重? |
| 每日平均体重,带 7 天滚动均值、拟合周速率,以及达到目标的预计时间(以及达到目标日期所需的速率) |
| 性别、年龄、身高、单位、运动员模式,以及应用中设置的目标(目标体重/日期、目标体脂、起始体重) |
| 秤用户(个人资料)ID、数据表、家庭成员以及 Renpho 报告的每个设备和数据类别 |
| 端到端探测:会话、表、页面排序、每个个人资料的最近读数、绑定与未绑定、看到的设备 |
| 逃生舱口:调用任何 |
| 丢弃缓存的会话和页面并重新登录(在出现新的称重但未显示时) |
| 删除为你的账户缓存的所有内容 |
故障排除: 如果读数看起来缺失、过期或归因于 错误的人,请先运行
run_diagnostics。它会报告数据实际 存储在哪里(哪个表/个人资料,绑定与否),而不是让你从下游症状推断。
Related MCP server: Oura Ring MCP Server
字段映射(Renpho Health API)
来自 RenphoHealth/scale/queryAllMeasureDataList 的原始记录有 ~57 个键。
工具将指标重命名为带单位后缀的 snake_case,解码枚举代码,
丢弃信封噪声,并将任何未识别的字段保留在 extra 下,这样当 Renpho 添加字段时不会丢失任何内容(参见 src/measurements.ts)。
Renpho 键 | 工具字段 | 单位 / 含义 |
|
| 千克(始终为千克,无论应用的显示单位如何) |
|
| — |
|
| % |
|
| 千克 |
|
| % |
|
| 等级 1–59(≤9 健康,10–14 高,≥15 非常高) |
|
| % |
|
| % |
|
| 千克 |
|
| 千克 |
|
| % |
|
| 千卡/天 |
|
| 年 |
|
| 次/分(仅限带心率传感器的秤) |
|
| 升/分钟/平方米 |
|
| 厘米(仅当输入时) |
|
|
|
|
| 布尔值 |
|
| 原始生物阻抗(Ω) |
|
| 读数如何分配( |
|
| 设备 + 标志 |
|
| 读数绑定到的账户 / 测量时所在的个人资料 |
|
| Unix 秒; |
报告为 0 的指标表示“未测量”并被省略。Renpho ID 是
超出 JavaScript 安全范围的 64 位整数,因此客户端在解析前将它们重新引用为字符串(src/json.ts)。
数据如何获取
登录(
renpho-aggregation/user/login)返回一个带有expAt的 bearer token;它会被缓存(密封)在 KV 中,直到临近过期前,然后通过重新登录来续期——Renpho 没有刷新令牌。device/count列出账户的数据表和记录数,并在每次工具调用时重新获取;它是新鲜度信号。每张表两个存储。 每张
measurements_info_N表都从 两个 端点读取:scale/queryAllMeasureDataList(旧存储,device/count统计的就是它的行数)和scale/queryBodyCompositionMeasureData(较新的存储,用于 8 电极 / 多频秤,如 MorphoScan,device/count不 统计它)。行按 id 合并,当两者都存在时保留体成分副本,因为它携带更丰富的字段集;source.endpoint标明某条读数来自哪个存储。测量分页(每页 200 条记录)缓存在 KV 中。旧存储的页面以表、档案集 和记录数 为键,因此新的称重会改变键并自动失效;体成分页面没有计数,改为缓存 15 分钟。分页器检测每个存储的排序方向,只遍历请求窗口所需的页数(每次调用每个存储最多 30 页 / 6 000 条记录)。
选择: 默认返回绑定到已登录账户(
bUserId)的读数;如果尚未绑定任何读数(Wi-Fi 秤在应用绑定读数之前就上传了),则回退到账户的第一个秤用户档案并说明这一点。为家庭成员传入scale_user_id。
缓存与加密
写入 RENPHO_CACHE KV 命名空间的所有内容——会话令牌和测量页面——都使用 AES-256-GCM 密封,密钥由 SESSION_ENCRYPTION_KEY 密钥派生,按用户区分(邮箱的 SHA-256)。如果未设置该密钥,则直接禁用缓存。缓存失败绝不会中断请求。
Renpho 传输层本身是 AES-128-ECB,使用应用中内置的静态密钥;WebCrypto 没有 ECB 模式,因此 Worker 使用纯 JS 的 aes-js(src/crypto.ts,在测试中已与 OpenSSL 逐字节验证)。
登录如何工作(请阅读一次)
Renpho 没有 OAuth。Worker 对 Claude 而言是 OAuth 服务器(workers-oauth-provider),其 /authorize 页面是一个 Renpho 登录表单。你的邮箱/密码会与 Renpho 校验一次,然后存储在 授权授予的加密属性中——加密密钥由 Claude 持有的令牌派生,因此仅凭 KV 内容无法解密。需要凭据是因为 Renpho 会话令牌在几小时后过期,而获取新令牌的唯一方法就是重新登录。
在 Claude 中断开连接器会删除授权授予(连同其中存储的凭据);
delete_my_data清除缓存。设置
ALLOWED_EMAILS(逗号分隔)可阻止其他任何人的 Renpho 账户连接到 你的 部署。留空则任何 Renpho 用户都可以使用(每个用户只能看到自己的数据)。
部署
选项 A — GitHub Actions(无需本地 wrangler)
.github/workflows/deploy.yml 中的工作流在每次推送到 master 时部署(也可手动触发)。应用密钥存放在 Cloudflare 中,而不是 GitHub——GitHub 只保存 Cloudflare API 令牌和账户 ID。
在 Cloudflare 控制台创建两个 KV 命名空间(Storage & Databases → KV):
OAUTH_KV和RENPHO_CACHE。将它们的 ID 粘贴到wrangler.jsonc中并提交。创建 Cloudflare API 令牌(My Profile → API Tokens → "Edit Cloudflare Workers" 模板)并记下你的 Account ID。
添加 GitHub 仓库密钥
CLOUDFLARE_API_TOKEN和CLOUDFLARE_ACCOUNT_ID。推送到
master。 Actions 日志会打印 Worker URL(https://renpho-health-mcp.<subdomain>.workers.dev)。在 Cloudflare 中设置应用密钥(Workers & Pages → renpho-health-mcp → Settings → Variables and Secrets,类型选择 Secret):
SESSION_ENCRYPTION_KEY= 任意长随机字符串。 可选地,将ALLOWED_EMAILS变量设置为你的 Renpho 邮箱。
选项 B — 本地 wrangler
npm install
npx wrangler kv namespace create OAUTH_KV # paste the id into wrangler.jsonc
npx wrangler kv namespace create RENPHO_CACHE # paste the id into wrangler.jsonc
npx wrangler secret put SESSION_ENCRYPTION_KEY # any long random string
npx wrangler deploy在 Claude 中连接
Settings → Connectors → Add custom connector。
URL:
https://renpho-health-mcp.<subdomain>.workers.dev/mcp点击 Connect → 使用你的 Renpho Health 邮箱/密码登录 → 完成。
然后问你的教练:"拉取我最近的秤读数,告诉我上个月的体重下降来自脂肪还是瘦体重。"
连接器图标
Worker 在其 MCP serverInfo.icons(和 websiteUrl)中公布 PUBLIC_URL/icon.png,因此渲染服务器品牌标识的客户端会在连接器列表中显示它。默认是生成的秤图标(npm run icon)。要改用官方的 Renpho Health 应用图标,请从 App Store / Play Store 页面保存 PNG 并嵌入:
npm run icon:embed -- ~/Downloads/renpho-health-icon.png # writes src/icon.ts + assets/icon.png
npm run deploy(官方标志是 Renpho 的商标——用于个人部署没问题,但不能重新分发,这就是它不在本仓库中的原因。)
本地开发
cp .dev.vars.example .dev.vars # set SESSION_ENCRYPTION_KEY
npm run dev # http://localhost:8787
npm test # vitest
npm run typecheck # worker + tests
npm run icon # regenerate assets/icon.png + src/icon.ts使用 MCP Inspector 测试流程:
npx @modelcontextprotocol/inspector@latest
# Transport: Streamable HTTP → http://localhost:8787/mcp → Connect工作原理
Claude (web/desktop/mobile)
└─ custom connector → /mcp
└─ workers-oauth-provider (this Worker IS Claude's OAuth server)
└─ AuthHandler (Renpho sign-in page; validates against Renpho)
└─ RenphoMCP (Durable Object) → RenphoClient → cloud.renpho.comsrc/index.ts— 连接OAuthProvider+McpAgentDurable Object。src/auth-handler.ts— 登录页面(/authorize)、落地页、图标。src/renpho-api.ts— Renpho 客户端:会话缓存、带重试/重新登录的加密传输、与顺序无关的分页器、用户选择。src/measurements.ts— 原始记录 → 精简的教练数据形态、枚举、分类、档案。src/stats.ts— 回归、边缘窗口汇总、滚动均值、目标预测。src/tools.ts— 上述教练工具。src/crypto.ts、src/json.ts、src/dates.ts— AES 辅助函数、大整数安全的 JSON、时区正确的日期。全部为纯函数并经过单元测试。
注意事项与限制
Wi-Fi 秤绑定延迟。 某些 Wi-Fi 秤在应用将其绑定到你的账户之前就上传了读数;在此之前,读数有
scale_user_id但没有bound_user_id。工具会回退到第一个档案并说明这一点(selection: "fallback_scale_user");run_diagnostics会列出隐藏的读数。生物电阻抗有噪声。 水分、一天中的时间和近期训练会使体脂/水分读数波动数个百分点。请在一天中的同一时间称重,并阅读平均值/趋势而非单次读数——趋势工具使用 7 天边缘窗口和滚动均值正是出于这个原因。
单位。 质量以 kg 为单位,成分指标以 % 为单位,与 Renpho 应用一致。
muscle报告为肌肉 质量(kg),sinew报告为骨骼肌百分比;如果你的设备固件报告方式不同,原始值不变——只是标签不同。MorphoScan / 8 电极秤。 它们的读数存放在体成分存储中(见上文),并带有额外的设备特定字段——分段脂肪/肌肉、SMI 等——工具会在
extra下透传这些字段(请求include_details,或查看run_diagnostics中的unrecognised_fields_seen)。请用这些字段名提交 issue,以便正确映射。只有
scale类别有专用工具。围度/卷尺、跑步机、跳绳和身体扫描(MorphoScan)数据会出现在get_scale_users→device_categories中,可以通过query_endpoint探索。速率限制。 当请求过密时 Renpho 返回代码
429;客户端会退避并重试,缓存的页面会继续提供服务。密码更改会使存储的凭据失效——请断开并重新连接连接器。
非官方 API。 这使用的是移动应用的私有 API;Renpho 可能随时更改它。与 Renpho 无关联,也未获得其认可。
隐私
凭据仅用于与 Renpho 进行身份验证,并加密存储在 OAuth 授权授予中;不记录任何日志。
健康数据仅缓存在你自己的 KV 命名空间中,经过密封,可通过
delete_my_data删除;不会向任何第三方发送任何内容。
致谢
API 逆向工程:forkerer/RenphoGarminSync-CLI 和 StartupBros-com/renpho-mcp-server(MIT)。
许可证
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseCqualityCmaintenanceProvides access to body composition data from Renpho smart scales, enabling users to query weight, BMI, body fat percentage, muscle mass, and other health metrics with trend analysis over customizable time periods.3264MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to access and query Oura Ring health data including sleep, activity, readiness, heart rate, and more via the Oura API.MIT
- FlicenseAqualityDmaintenanceFetches body composition data (weight, body fat percentage) from the Tanita Health Planet API and exposes it as MCP tools for AI agents like Claude Desktop.51
- FlicenseAqualityCmaintenanceEnables Claude to read your WHOOP health data including recovery, sleep, strain, and workouts through the official WHOOP API, so you can ask natural language questions about your fitness metrics.7
Related MCP Connectors
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
63 tools for Apple Health, Fitbit, Oura & Health Connect data in Claude, ChatGPT, Grok & Mistral.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/a1dancole/renpho-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server