Cronometer MCP server
Cronometer MCP server
从 Claude.ai 和 Claude Code 读写你的 Cronometer 食物日记。它连接到 mobile.cronometer.com,这是 Cronometer Android 应用所使用的同一 API,并在前面加上 OAuth 2.1 登录,这样你就可以把它作为自定义连接器添加到 Claude.ai。Claude Code 可以直接使用普通令牌。你不需要 Gold 订阅,也不像 CSV 导出那样每天有十次导出限制。
为什么不用其他方案
Terra API 会将你的 Cronometer 数据发送到一个 webhook,但它只能读取,而且你的食物日志会经过他人的服务器
gocronometer及类似的导出工具只能读取,并且会受到速率限制抓取 Cronometer 网站的工具可以写入,但它们依赖的代码每次 Cronometer 发布更新时都会变化,而且它们需要 Gold
Related MCP server: cronometer-api-mcp
工具
读取
工具 | 说明 |
| 一天日记中的所有内容。每种食物都包含名称、来源、份量大小、份数,以及该食物为你的营养素添加了什么。你还可以获得卡路里(目标、已摄入、剩余)以及你追踪的每种营养素的总量 |
| 一天的营养素总量 |
| Cronometer 的营养评分 |
| 搜索食物数据库 |
| 一种食物的完整营养素和份量大小 |
| 显示在每日总量旁边的营养素目标 |
| 你的蛋白质、碳水化合物和脂肪目标 |
| 你可以测量哪些项目,以及每项接受的单位 |
| 一段时间内的一项测量值 |
| 两个日期之间的禁食记录 |
| 禁食总量和平均值 |
| 你可以为自定义食物设置的每一种营养素及其单位 |
写入
工具 | 功能 |
| 将食物添加到一餐中 |
| 更改你吃的量或时间 |
| 删除食物条目 |
| 创建你自己的食物,最多可包含全部 94 种营养素 |
| 将自定义食物设为停用,或恢复使用 |
| 在某一天写下备注 |
| 重写备注 |
| 记录如体重或体脂等测量值 |
| 修正记错的测量值 |
| 添加一项运动 |
| 更改运动持续时间或消耗量 |
| 记录一次禁食,无论是已结束还是仍在进行中 |
| 更改禁食的时间或目标,包括结束仍在进行的禁食 |
| 删除一次禁食 |
| 将某一天的日记复制到另一天 |
| 将一天标记为已完成,或取消完成 |
自定义食物
add_custom_food 接受一个从营养素名称到数量的字典,因此你可以在一次调用中提供从一种营养素到整个目录的任何内容:
{
"name": "Vaasan Ruispalat",
"serving_name": "1 slice",
"serving_grams": 33,
"nutrients": {
"energy": 79, "protein": 3.1, "carbs": 12.5, "fiber": 3.4,
"fat": 0.8, "saturated": 0.2, "salt_g": 0.36,
"iron": 0.9, "magnesium": 26, "b1_thiamine": 0.09, "folate": 11
}
}这些数量对应一整份,每种都使用该营养素自己的单位。调用 list_nutrients 获取可接受的名称,这些名称来自你账户自己的目录,而不是这里内置的表。
你留空的营养素在 Cronometer 中会保持空白。传递 0 则表示该食物不含该营养素,应用会将这两种情况区别对待,所以只传递你确实知道的内容。无法识别的名称会报错,而不是被悄悄丢弃,因为一种悄悄丢失营养素的饮食看起来仍然完整。
食物标签有而目录没有的两个便利:energy_kj 会转换为卡路里,salt_g 会转换为钠。只传其中一个,不要两个都传。
它是如何整合的
Claude.ai / Claude Code
| HTTPS
Cloudflare Tunnel, or any proxy that gives you HTTPS
|
nginx 127.0.0.1:8431
|
auth-server.js :8432 handles the login and the tokens
|
cronometer-mcp :8430 the server itself, local only
|
mobile.cronometer.com服务器本身没有自己的登录,并且它只监听本机。因此,任何到达它的请求都已经通过了登录。该登录接受 OAuth 令牌(Claude.ai 会为你设置)或固定令牌(对 Claude Code 更快)。
安装
git clone https://github.com/rollecode/cronometer-mcp.git
cd cronometer-mcp
./install.sh安装程序会配置 Python 和 Node,询问你的 Cronometer 登录信息和连接器登录页面的密码,生成一个令牌,并写入服务文件和 nginx 站点,其中已填入你自己的主机名和用户名。
你需要 Node 18 或更高版本、Python 3.12 或更高版本,以及 uv。
将服务器部署到公网由你自己完成,因为这是不同设置差异最大的地方,在这里猜错会让你的食物日记暴露在公共互联网上。将隧道或代理指向 127.0.0.1:8431。使用 Cloudflare Tunnel 时:
ingress:
- hostname: cronometer-mcp.example.com
service: http://localhost:8431必须是 HTTPS。OAuth 无法通过纯 HTTP 工作。
手动自托管
如果你不希望运行安装程序,而是想了解每一步操作,这里就是全部过程。最终状态是你自己机器上运行的两个服务,可通过 HTTPS 访问。
1. 获取代码及其依赖
git clone https://github.com/rollecode/cronometer-mcp.git
cd cronometer-mcp
npm install --omit=dev
uv venv && uv pip install -e .2. 存储你的 Cronometer 登录信息
./set-credentials.sh它会提示你输入电子邮件、密码和时区,并将它们写入 ~/.config/cronometer-mcp/env,权限为 0600。密码永远不会回显,也不会进入你的 shell 历史记录。如果你愿意,也可以手动操作:
mkdir -p ~/.config/cronometer-mcp && chmod 700 ~/.config/cronometer-mcp
cat > ~/.config/cronometer-mcp/env <<'EOF'
CRONOMETER_USERNAME=you@example.com
CRONOMETER_PASSWORD=your-password
CRONOMETER_ACCOUNT_TZ=Europe/Helsinki
EOF
chmod 600 ~/.config/cronometer-mcp/env在继续之前先检查它是否正常工作。下面这条命令会登录并打印你的日记:
set -a && . ~/.config/cronometer-mcp/env && set +a
.venv/bin/python -c "from cronometer_mcp import CronometerClient; c=CronometerClient(); print(c.get_diary()['summary'])"3. 设置连接器密码和令牌
密码是你在 Claude.ai 中添加连接器时在登录页面输入的内容。只会存储其 scrypt 哈希值。
CONFIG_DIR=~/.config/cronometer-mcp node set-password.js 'your-password-here'令牌是 Claude Code 使用的快捷方式,它会发送一个请求头并完全跳过浏览器。
openssl rand -hex 32 > ~/.config/cronometer-mcp/token
chmod 600 ~/.config/cronometer-mcp/token4. 安装这两个服务
systemd/ 包含两个 unit 文件。将 YOUR_USER 替换为你的用户名,将 cronometer-mcp.example.com 替换为你的主机名,然后:
mkdir -p ~/.cache/cronometer-mcp
sudo cp systemd/cronometer-mcp.service systemd/cronometer-mcp-auth.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now cronometer-mcp cronometer-mcp-auth
systemctl status cronometer-mcp cronometer-mcp-authcronometer-mcp 是运行在 :8430 的服务器本身,只有它所在的机器可以访问。cronometer-mcp-auth 是 :8432 上的登录层,它是唯一与 :8430 通信的组件。
有一个值得指出的陷阱,因为其症状令人困惑:不要向 cronometer-mcp.service 添加 IPAddressDeny=any。对于只读取本地文件的服务器来说,这是一条合理的加固配置,但这个服务器必须访问 mobile.cronometer.com,而设置后每次工具调用都会挂起直到超时,同时 systemd 仍报告服务处于活动状态。这样做也不会带来任何好处,因为服务器本身已经拒绝在本机之外监听。
5. 在前面放置 nginx
sudo cp nginx/cronometer-mcp.conf /etc/nginx/sites-enabled/cronometer-mcp
sudo nginx -t && sudo systemctl reload nginx它监听 127.0.0.1:8431,并将所有请求传递给登录层。较长的读取超时时间和 proxy_buffering off 很重要:MCP 会保持连接打开并边生成边发送,而缓冲会导致它停滞。
6. 为它提供一个 HTTPS 地址
Cloudflare Tunnel 可以避免开放路由器端口。任何 HTTPS 反向代理也同样有效。
ingress:
- hostname: cronometer-mcp.example.com
service: http://localhost:8431cloudflared tunnel route dns YOUR_TUNNEL cronometer-mcp.example.com
sudo systemctl restart cloudflared7. 从外部检查
curl https://cronometer-mcp.example.com/.well-known/oauth-authorization-server
curl -o /dev/null -w '%{http_code}\n' -X POST https://cronometer-mcp.example.com/mcp第一条命令返回登录详细信息。第二条命令必须返回 401:任何其他结果都意味着登录层被绕过,你的日记已暴露。
然后按照 连接 中的说明连接客户端。
更新
git pull
uv pip install -e . && npm install --omit=dev
sudo systemctl restart cronometer-mcp cronometer-mcp-auth添加或重命名工具后,在 Claude.ai 中点击连接器上的“重新连接”。这会刷新你已打开的对话中的工具列表,而且你的登录状态会保留,因为令牌存储在磁盘上的 oauth.db 中而不是内存中。
当出现问题时
journalctl -u cronometer-mcp -n 50 --no-pager
journalctl -u cronometer-mcp-auth -n 50 --no-pager你看到的现象 | 通常的原因 |
工具调用挂起,服务显示 active | MCP 单元上的 |
Claude Code 发起的每次调用都返回 | 令牌不匹配,将请求头与 |
登录页拒绝密码 | 尚未存储哈希,请运行第 3 步 |
登录失败并要求输入 2FA 验证码 | |
nginx 返回 | 登录层已关闭,运行 |
连接
Claude.ai。 前往设置、连接器、添加自定义连接器,然后输入 https://your-host/mcp。将客户端 ID 和密钥留空。使用安装程序设置的密码登录。只需操作一次,即可覆盖 Web、桌面和移动端,因为连接器属于你的账户而非某个设备。
Claude Code(通过浏览器):
claude mcp add --transport http cronometer https://your-host/mcp --scope user然后运行 /mcp 登录。
Claude Code(使用令牌,无需浏览器):
claude mcp add --transport http cronometer https://your-host/mcp \
--header "Authorization: Bearer $(cat ~/.config/cronometer-mcp/token)" \
--scope user完全不使用服务器
如果 Claude 运行在同一台机器上,可以完全跳过 Web 服务器和登录,让它直接启动 MCP:
claude mcp add cronometer -- /path/to/cronometer-mcp/.venv/bin/cronometer-mcp它从 ~/.config/cronometer-mcp/env 或 .env 文件读取你的登录信息。
设置
变量 | 用途 |
| 你的 Cronometer 电子邮件 |
| 你的 Cronometer 密码 |
| 你记录日记日期所用的时区 |
| 你的两步验证密钥,仅在你开启两步验证时需要。需要 |
| 服务器的公共地址 |
| 登录服务器端口,默认为 8432 |
| MCP 服务器的位置,默认为 |
| 密码、令牌和数据库的存放位置 |
| 调用静默多长时间后会被切断,默认为 120000 |
| MCP 服务器端口,默认为 8430 |
| 公共地址,用于向客户端公布图标 |
所有机密信息都存放在 ~/.config/cronometer-mcp/ 中,只有你可以读取:env 保存你的 Cronometer 登录信息,password-hash 保存连接器登录页的密码,token 保存固定令牌,oauth.db 保存登录服务器已签发的应用和令牌。令牌经过混淆存储,因此即使数据库副本被盗,也不会有人得到可用的密钥。
你的 Cronometer 会话保存在 ~/.cache/cronometer-mcp/session.json 中,因此重启服务器不会反复登录,也不会触发 Cronometer 的限制。
如果你使用两步验证
无人值守运行的服务器无法输入验证码,因此它需要验证码背后的密钥:
uv pip install -e '.[totp]'然后将 CRONOMETER_TOTP_SECRET 设置为你的身份验证器应用中的密钥。如果没有它,开启了两步验证的账户将无法登录,并会明确告诉你这一点。
代码开发
uv venv && uv pip install -e . && uv pip install pytest ruff
.venv/bin/python -m pytest tests -q
.venv/bin/python -m ruff check src/ tests/致谢
Cronometer 客户端最初是 rwestergren/cronometer-api-mcp 的副本。登录层来自 rollecode/obsidian-remote-mcp。
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
- Alicense-qualityDmaintenanceEnables AI assistants to read and write MyFitnessPal data, including food diary, exercises, body measurements, nutrition goals, and water intake.MIT
- AlicenseAqualityBmaintenanceEnables nutrition tracking with Cronometer, including food logging, food search, diary management, and nutrition data retrieval via natural language.13MIT
- Alicense-qualityAmaintenanceConnect MyFitnessPal to Claude or any MCP client. Log meals, search food database with macros, track trends, and export nutrition history against your real MyFitnessPal diary.6MIT
- Alicense-qualityCmaintenanceEnables Claude.ai to read your MacroFactor nutrition data and log food back into MacroFactor.MIT
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.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
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/rollecode/cronometer-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server