Skip to main content
Glama
rollecode

Cronometer MCP server

by rollecode

Cronometer MCP server

Version Python Node OAuth

从 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

工具

读取

工具

说明

get_food_log

一天日记中的所有内容。每种食物都包含名称、来源、份量大小、份数,以及该食物为你的营养素添加了什么。你还可以获得卡路里(目标、已摄入、剩余)以及你追踪的每种营养素的总量

get_daily_nutrition

一天的营养素总量

get_nutrition_scores

Cronometer 的营养评分

search_foods

搜索食物数据库

get_food_details

一种食物的完整营养素和份量大小

get_targets

显示在每日总量旁边的营养素目标

get_macro_targets

你的蛋白质、碳水化合物和脂肪目标

list_biometrics

你可以测量哪些项目,以及每项接受的单位

get_biometrics

一段时间内的一项测量值

get_fasting_history

两个日期之间的禁食记录

get_fasting_stats

禁食总量和平均值

list_nutrients

你可以为自定义食物设置的每一种营养素及其单位

写入

工具

功能

add_food_entry

将食物添加到一餐中

edit_food_entry

更改你吃的量或时间

remove_food_entry

删除食物条目

add_custom_food

创建你自己的食物,最多可包含全部 94 种营养素

retire_custom_food

将自定义食物设为停用,或恢复使用

add_note

在某一天写下备注

edit_note

重写备注

add_biometric

记录如体重或体脂等测量值

edit_biometric

修正记错的测量值

add_exercise

添加一项运动

edit_exercise

更改运动持续时间或消耗量

add_fast

记录一次禁食,无论是已结束还是仍在进行中

edit_fast

更改禁食的时间或目标,包括结束仍在进行的禁食

delete_fast

删除一次禁食

copy_day

将某一天的日记复制到另一天

mark_day_complete

将一天标记为已完成,或取消完成

自定义食物

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/token

4. 安装这两个服务

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-auth

cronometer-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:8431
cloudflared tunnel route dns YOUR_TUNNEL cronometer-mcp.example.com
sudo systemctl restart cloudflared

7. 从外部检查

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 单元上的 IPAddressDeny,参见第 4 步

Claude Code 发起的每次调用都返回 401

令牌不匹配,将请求头与 ~/.config/cronometer-mcp/token 进行比较

登录页拒绝密码

尚未存储哈希,请运行第 3 步

登录失败并要求输入 2FA 验证码

参见如果你使用两步验证

nginx 返回 502

登录层已关闭,运行 systemctl status cronometer-mcp-auth

连接

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_USERNAME

你的 Cronometer 电子邮件

CRONOMETER_PASSWORD

你的 Cronometer 密码

CRONOMETER_ACCOUNT_TZ

你记录日记日期所用的时区

CRONOMETER_TOTP_SECRET

你的两步验证密钥,仅在你开启两步验证时需要。需要 totp 额外依赖

ISSUER

服务器的公共地址

PORT

登录服务器端口,默认为 8432

UPSTREAM

MCP 服务器的位置,默认为 http://127.0.0.1:8430

CONFIG_DIR

密码、令牌和数据库的存放位置

CALL_TIMEOUT_MS

调用静默多长时间后会被切断,默认为 120000

MCP_PORT

MCP 服务器端口,默认为 8430

MCP_PUBLIC_URL

公共地址,用于向客户端公布图标

所有机密信息都存放在 ~/.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

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
7Releases (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

  • 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

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/rollecode/cronometer-mcp'

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