内容
# 我的健身日志连接器
将 MyFitnessPal 连接到 Claude 或任何 MCP 客户端。通过语音记录餐食,搜索食物数据库并包含宏营养信息,跟踪趋势,导出营养历史记录,所有操作均与您真实的 MyFitnessPal 日志同步。
在 PyPI 上发布为 [`mfp-mcp`](https://pypi.org/project/mfp-mcp/)。
<!-- mcp-name: io.github.Mason-Levyy/mfp-mcp -->
> **非官方。** MyFitnessPal 没有公开 API;本项目通过逆向工程 Web 应用的端点来实现功能。它可能会在 MyFitnessPal 更改其网站时中断。请自担风险,使用您自己的账户。

## 为什么选择这个?
MyFitnessPal 移到了 Cloudflare + NextAuth 后台,这导致大多数现有集成依赖的用户名/密码登录功能被破坏。这个服务器:
- **使用您的浏览器会话 cookie 进行身份验证**,通过真正的 Chrome TLS 指纹([curl_cffi](https://github.com/lexiforest/curl_cffi)),可以绕过 Cloudflare。
- **自动刷新会话**(可选):一个无头浏览器配置文件在令牌过期时旋转令牌,失败的调用会自动重试。
- **写入,而不仅仅是读取**:记录、修改和删除真正的日志条目。
- **搜索然后记录**:获取包含宏营养信息的候选食物,然后记录确切的项目。
## 快速入门
1. 连接您的账户(一次性;提示您粘贴 cookie - 参见 [身份验证](#身份验证)):
```bash
uvx mfp-mcp auth
```
2. 将服务器添加到您的客户端。
**Claude 代码**
```bash
claude mcp add myfitnesspal -- uvx mfp-mcp
```
**Claude 桌面版**(`claude_desktop_config.json`)
```json
{
"mcpServers": {
"myfitnesspal": {
"command": "uvx",
"args": ["mfp-mcp"]
}
}
}
```
3. 与它对话: *"记录一个香蕉作为零食"*, *"我昨天吃了什么?"*, *"绘制这个月的体重图表"*。
需要 [uv](https://docs.astral.sh/uv/)。任何支持 stdio 或可流式 HTTP 的 MCP 客户端都可以使用,不仅仅是 Claude。
## 身份验证
MyFitnessPal 停止了无头登录密码功能,因此本项目使用您的浏览器的会话 cookie:
1. 在 [myfitnesspal.com](https://www.myfitnesspal.com) 登录。
2. 打开开发者工具(F12)→ **应用程序**(Chrome)或 **存储**(Firefox)→ **Cookie** → `https://www.myfitnesspal.com`。
3. 复制 `__Secure-next-auth.session-token` 的值。
4. 将其粘贴到 `mfp-mcp auth` 提示符中(输入是隐藏的)。
粘贴来自网络选项卡中任何请求的整个 `Cookie:` 头部信息也可以。Cookie 存储在您的平台配置文件目录中,仅限所有者拥有,或者通过 `MFP_COOKIE` 环境变量提供。
会话大约持续 30 天。当会话过期时,可以重新运行 `auth` - 或者启用自动刷新,这样您就不需要再操作了。
### 自动刷新(推荐)
使用 `autorefresh` 额外功能,`auth` 还会初始化一个持久的无头浏览器配置文件。当 MyFitnessPal 在调用过程中拒绝会话时,服务器会告诉您的客户端它正在重试,启动无头配置文件,让 MyFitnessPal 旋转会话令牌,保存新的 cookie,然后重试调用。
```bash
uvx --from 'mfp-mcp[autorefresh]' playwright install chromium
uvx --from 'mfp-mcp[autorefresh]' mfp-mcp auth
```
然后在您的客户端配置文件中使用相同的 `--from 'mfp-mcp[autorefresh]'` 形式(例如 `uvx --from 'mfp-mcp[autorefresh]' mfp-mcp`)。
## 工具
| 工具 | 功能 |
| --- | --- |
| `fitness_get_day` | 获取某天的营养总量、日志条目和感受笔记 |
| `fitness_search_food` | 搜索食物的匹配结果,包含品牌、热量、宏营养信息、份量和 ID |
| `fitness_log_food` | 记录食物到真实的日志(最佳匹配或确切的搜索候选) |
| `fitness_delete_food` | 按名称匹配删除日志条目 |
| `fitness_modify_food` | 替换条目(或更改其数量) |
| `fitness_log_weight` | 记录体重测量值(在同一天更新重新记录) |
| `fitness_get_exercise` | 读取运动日志(心血管 + 力量训练) |
| `fitness_log_feel` | 保存主观的“感受”笔记(本地存储,永不发送到 MFP) |
| `fitness_get_trends` | 获取某个日期范围内的一个指标:体重、热量摄入、蛋白质、碳水化合物、脂肪 |
| `fitness_bulk_export` | 获取整个日期范围的数据,用于分析 |
高精度记录流程:`fitness_search_food("希腊酸奶")` 返回包含宏营养信息和 `food_id`/`weight_id` 的候选食物;将这些传递给 `fitness_log_food` 以记录确切的食物,而不是依赖最佳匹配。
每日总结和趋势从本地 SQLite 缓存中读取,该缓存从 MyFitnessPal 填充缺失的天数(首次安装时获取最多 30 天,一个请求一天 - 后续调用速度很快)。
水摄入量仅可读取(它出现在每日总结中):MyFitnessPal 的水 *写入* 功能在我们发现的任何端点中都不支持 - `/food/water` 接受 POST 请求但忽略它们。如果您在浏览器中捕获实际的调用,欢迎提交 PR。
## 远程 / HTTP 模式
默认传输方式是 stdio。对于网络客户端:
```bash
mfp-mcp --http --host 127.0.0.1 --port 8484
```
此服务器在 `/mcp` 处提供可流式 HTTP。**没有内置身份验证 - 绝不能将其暴露在互联网上。** 将其绑定到 localhost 并使用能够为您进行身份验证的东西进行前端处理:VPN/tailnet(例如 `tailscale serve`)、身份验证反向代理或 OAuth 感知 MCP 网关。
## 配置
| 变量 | 用途 | 默认值 |
| --- | --- | --- |
| `MFP_COOKIE` | 会话 cookie(完整头部或裸令牌);覆盖保存的文件 | - |
| `MFP_USERNAME` | 您的 MFP 用户名(不是电子邮件);仅在配置文件查找失败时需要 | 自动检测 |
| `MFP_IMPERSONATE` | curl_cffi 浏览器指纹(尝试 `chrome124` 在 403 错误时) | `chrome` |
| `MFP_SYNC_DAYS` | 填充缺失天数的时间窗口(天) | `30` |
| `MFP_MCP_DATA_DIR` | SQLite 缓存和浏览器配置文件存储位置 | 平台数据目录 |
## 故障排除
- **403 / Cloudflare 阻止**:尝试 `MFP_IMPERSONATE=chrome124`(或其他 [curl_cffi 目标](https://github.com/lexiforest/curl_cffi#supported-browsers))。数据中心 IP 地址比住宅 IP 地址更常受到挑战。
- **"会话过期"**:重新运行 `mfp-mcp auth`,或设置 [自动刷新](#自动刷新-推荐)。
- **"无法读取您的 MyFitnessPal 配置文件"**:MFP 的配置文件端点对某些账户返回 500 错误。设置 `MFP_USERNAME` 为您的用户名(不是您的电子邮件)。
- **curl_cffi 安装问题**:预编译的轮子涵盖 Linux/macOS/Windows;musl(Alpine)从源代码构建。
## 工作原理
- [python-myfitnesspal](https://github.com/coddingtonbear/python-myfitnesspal) 解析日志、测量和运动页面 - 在一个 `curl_cffi` 会话上运行,该会话模仿 Chrome 的 TLS 指纹,以便 Cloudflare 允许它仅使用 NextAuth 会话 cookie 通过。
- 写入复制 Web 应用自己的 XHR 调用:旧的食物搜索页面提供 `food_id`/`weight_id`,`/food/add` 接受这些 ID,而删除操作通过 `/food/remove` 进行,并附带页面 CSRF 令牌。
- 每日总结、趋势和导出读取本地 SQLite 缓存,该缓存填充缺失的天数;感受笔记仅存储在本地。
## 开发
```bash
git clone https://github.com/Mason-Levyy/myfitnesspal-mcp
cd myfitnesspal-mcp
uv sync --extra autorefresh
uv run pytest
```
测试运行针对合成的 MyFitnessPal HTML/JSON 固定数据 - 不需要账户。
## 许可证
[MIT](LICENSE)