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/myfitnesspaljnelle/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: Bearermfp-user-idmfp-client-id 以及应用的 api-version/user-agent 请求头。条目类型:food_entrydiary_mealexercise_entrywatersteps_aggregate。分页遵循 Link: rel=next 请求头。

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

字段映射

nutritional_contents → 带单位后缀的键:energy_kcal(由 kJ 转换)、protein_gcarbohydrates_gnet_carbs_gfiber_gsugar_gfat_gsaturated_fat_gmonounsaturated_fat_gpolyunsaturated_fat_gtrans_fat_gcholesterol_mgsodium_mgpotassium_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_IDMFP_CLIENT_SECRET。如果 MFP 轮换它们,登录将停止工作,直到更新这些值。

部署

方案 A — GitHub Actions

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

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

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

  3. 在 Cloudflare 中(Workers & Pages → myfitnesspal-mcp → 设置 → 变量和机密)添加机密 SESSION_ENCRYPTION_KEY(任意长随机字符串)、MFP_CLIENT_IDMFP_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

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

Related MCP Connectors

  • Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.

  • WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.

  • Connect Claude to Fathom meeting recordings, transcripts, and summaries

View all MCP Connectors

Latest Blog Posts

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/myfitnesspal-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server