Skip to main content
Glama
a1dancole

MyFitnessPal MCP

by a1dancole

MyFitnessPal MCP — 你的 Claude 训练教练的营养数据

一个部署在 Cloudflare Workers 上的远程 MCP 服务器,将你的 MyFitnessPal 日记——每一样食物及其份量和时间、每餐和每日的能量/宏量营养素/微量营养素合计、水、记录的运动、步数和体重——暴露给 Claude。只需将其作为自定义连接器添加一次,便可在 Claude 网页、桌面和移动端上使用。它与 Strava、Google Health 和 Renpho 连接器配合使用,让你的教练看到训练负荷、恢复、身体成分和能量补给。

它如何与 MFP 通信: MyFitnessPal 没有公共 API(合作伙伴计划已关闭)。此服务器使用移动应用自身的 OAuth 身份流程以及该应用使用的同一个 api.myfitnesspal.com/v2 API——即存档在 myfitnesspalapi.com 的合作伙伴文档所描述的 API。无需浏览器、无需 Cookie、无需抓取、无需验证码。身份流程的功劳归于:seonixx/myfitnesspal 和 jnelle/MyFitnesspal-API-Golang。非官方;MFP 随时可能更改。

工具

工具

能回答什么

get_daily_nutrition

“我今天吃了什么?”——每餐和每日合计(能量、蛋白质、碳水化合物、净碳水化合物、纤维、糖、脂肪亚型、胆固醇、钠、钾、%DV 微量营养素)、每样食物及其份量和时间戳、水、运动、步数、体重记录

get_food_log

一段时间内的单个食物条目,可按餐次或文本搜索筛选——训练课前后吃了什么、反复出现的食物

get_nutrition_trend

一段时间窗口内的每日合计,含已记录日期的均值、能量最小/最大值、蛋白质/碳水化合物/脂肪的能量占比、周平均值、水/运动/步数

get_exercise_log

MFP 中记录的运动(时长、卡路里、距离、心率)和每日步数

get_weight_log

MFP 中记录的体重条目

get_profile

姓名、性别、出生日期/年龄、身高、地区 + 令牌状态

run_diagnostics

端到端探测:令牌刷新、个人资料、账户接受哪些日记类型/字段(含原始样本)、测量数据、候选目标端点

query_endpoint

逃生舱:使用连接器的身份验证调用 任意 api.myfitnesspal.com / 身份端点

refresh_data

丢弃缓存的日期和记住的请求结构,刷新令牌

delete_my_data

删除你的账户缓存的所有数据

故障排查: 如果某个工具报错或数据看起来缺失,请先运行 run_diagnostics。它会报告 MFP 为你的账户接受的精确 types/fields[] 组合,以及每种条目类型的原始样本。


Related MCP server: MyFitnessPal MCP Server

工作原理

Claude (web/desktop/mobile)
  └─ custom connector → /mcp
       └─ workers-oauth-provider  (this Worker IS Claude's OAuth server)
            └─ AuthHandler        (MFP sign-in page: one-time credential → token exchange)
                 └─ MyFitnessPalMCP (Durable Object) → MfpClient → api.myfitnesspal.com/v2

登录(仅一次,在连接器的 /authorize 页面上)

  1. POST identity-api.myfitnesspal.com/oauth/token — 获取移动应用 OAuth 客户端的客户端凭证令牌。

  2. GET identity-api…/clientKeys — MFP 用于密码登录的 HS512 签名密钥。

  3. POST identity-api…/oauth/authorize,参数为 credentials=<JWT{username, password}> — 返回重定向到 mfp://identity/callback?code=…。

  4. POST …/oauth/token(authorization_code)— 访问令牌 + 刷新令牌 + ID 令牌。

  5. GET identity-api…/users/{sub} — MFP 域用户 ID(mfp-user-id 请求头)和个人资料。

只保留刷新令牌(以及首次访问令牌),加密存放在 OAuth 授权的属性中;密码永远不会被存储。此后 Worker 会静默刷新;最新轮换的刷新令牌以密封形式保存在 KV 中。

读取日记

GET api.myfitnesspal.com/v2/diary?entry_date=YYYY-MM-DD&types=…&fields[]=…,并携带 Authorization: Bearer、mfp-user-id、mfp-client-id 以及应用的 api-version/user-agent 请求头。条目类型:food_entry、diary_meal、exercise_entry、water、steps_aggregate。分页遵循 Link: rel=next 请求头。

移动令牌接受的精确 types/fields[] 组合没有文档记录,因此客户端会发现它们:它先尝试最丰富的请求,然后是较小的字段集,再是不带字段,最后逐个类型尝试——并记住当天有效的组合。任何被拒绝的内容都会在工具结果中报告。已完成的日期不可变,并会缓存(密封)30 天;今天始终是实时数据。每天对应一次上游调用,因此窗口上限为 92 天。

字段映射

nutritional_contents → 带单位后缀的键:energy_kcal(由 kJ 转换)、protein_g、carbohydrates_g、net_carbs_g、fiber_g、sugar_g、fat_g、saturated_fat_g、monounsaturated_fat_g、polyunsaturated_fat_g、trans_fat_g、cholesterol_mg、sodium_mg、potassium_mg,以及 calcium/iron/vitamin_a/vitamin_c/vitamin_d_pct_dv(MFP 将这些存储为每日摄入量百分比)。未知营养素保留在 extra 下。

每日合计在存在时来自 MFP 自己的 diary_meal 摘要(totals_source: "diary_meal"),否则由对 food_entry 行求和得出。

缓存与加密

写入 MFP_CACHE KV 命名空间的所有内容——令牌、发现出的请求结构、日记日期——都会使用从 SESSION_ENCRYPTION_KEY 派生的密钥进行 AES-256-GCM 密封,并按用户分别设置密钥。没有该密钥时,缓存将被禁用。缓存失败绝不会中断请求。


客户端凭证的来源

身份流程需要 MyFitnessPal Android 应用中嵌入的 OAuth 客户端 ID/密钥。此处不提供它们;上面链接的 Go 客户端在其 .env.sample 中附带了它们。请将它们设置为 Worker 机密 MFP_CLIENT_ID 和 MFP_CLIENT_SECRET。如果 MFP 轮换它们,登录将停止工作,直到更新这些值。

部署

方案 A — GitHub Actions

.github/workflows/deploy.yml 会在每次推送到 master 时部署。机密存放在 Cloudflare;GitHub 仅持有 CLOUDFLARE_API_TOKEN 和 CLOUDFLARE_ACCOUNT_ID。

  1. 创建两个 KV 命名空间(MFP_OAUTH_KV、MFP_CACHE),并将其 ID 放入 wrangler.jsonc。

  2. 添加这两个 GitHub 机密并推送。

  3. 在 Cloudflare 中(Workers & Pages → myfitnesspal-mcp → 设置 → 变量和机密)添加机密 SESSION_ENCRYPTION_KEY(任意长随机字符串)、MFP_CLIENT_ID、MFP_CLIENT_SECRET。可选地,将 ALLOWED_EMAILS 变量设置为你自己的 MFP 电子邮件,这样其他人就无法连接到你的部署。

方案 B — 本地 wrangler

npm install
npx wrangler kv namespace create MFP_OAUTH_KV   # paste the id into wrangler.jsonc
npx wrangler kv namespace create MFP_CACHE      # paste the id into wrangler.jsonc
npx wrangler secret put SESSION_ENCRYPTION_KEY
npx wrangler secret put MFP_CLIENT_ID
npx wrangler secret put MFP_CLIENT_SECRET
npx wrangler deploy

在 Claude 中连接

  1. 设置 → 连接器 → 添加自定义连接器。

  2. URL:https://myfitnesspal-mcp.<subdomain>.workers.dev/mcp

  3. 点击连接 → 使用你的 MyFitnessPal 电子邮件/用户名和密码登录 → 完成。

然后:“对 MyFitnessPal 运行诊断,然后显示我昨天的营养。”

连接器图标

Worker 会在其 MCP serverInfo.icons(以及 websiteUrl)中通告 PUBLIC_URL/icon.png,因此渲染服务器品牌信息的客户端会在连接器列表中显示它。默认是一个生成的餐盘和餐具图标(npm run icon)。如果想改用 MyFitnessPal 官方应用图标,请从 App Store / Play Store 的页面中保存 PNG 并嵌入它:

npm run icon:embed -- ~/Downloads/myfitnesspal-icon.png   # writes src/icon.ts + assets/icon.png
npm run deploy

(官方标志是 MyFitnessPal 的商标——适合个人部署,不可再分发,这就是它不在本仓库中的原因。)

本地开发

cp .dev.vars.example .dev.vars   # set the secrets
npm run dev                      # http://localhost:8787
npm test                         # vitest (fake identity + API backend)
npm run typecheck
npm run icon

说明与限制

  • 非官方。 该应用的私有客户端与你自己的凭据一起用于个人用途;MFP 可能轮换客户端或更改 API。

  • Health Connect 已经将 MFP 的餐次摘要同步到 Google Health;本服务器额外提供的是带有时间戳的逐食物日志、微量营养素、水、MFP 运动和体重。

  • 营养素目标尚无确认的端点——run_diagnostics 会扫描候选端点,query_endpoint 可以进一步探索。

  • 子请求限制。 每个日记日期对应一次上游调用;在 Workers 免费套餐(每次请求 50 个子请求)下,请保持未缓存的时间窗口较短。已缓存的日期成本很低。

  • 密码更改会使刷新令牌失效——请断开并重新连接连接器。

隐私

  • 你的密码仅在一次令牌交换中使用,永远不会被存储;刷新令牌以加密形式保存在 OAuth 授权中。

  • 日记数据仅缓存在你自己的 KV 命名空间中,经过密封,并可通过 delete_my_data 删除;不会向任何第三方发送任何数据。

许可证

MIT

Related MCP Connectors

Related MCP Servers