Cronometer Api Mcp

io.github.rwestergren由 GitHub 账号 rwestergren 发布v0.2.6更新于 Oct 25, 2026

MCP server for Cronometer nutrition tracking — food logs, diary, macros, fasting

已验证STDIO仅桌面位置与生活数据与分析

概览

AI 生成的概览

一个本地 MCP 服务器,让助手连接 Cronometer 账户,读取饮食日记与营养数据、搜索食物并管理日记条目。

可以做什么
读取某日或最近若干天的饮食日记、每日宏量与微量营养素总量及营养评分,支持“昨天”“N 天前”等相对日期。搜索 Cronometer 食物数据库,获取完整营养档案与份量信息。添加或删除日记条目、复制某日记录、将某日标记为完成或未完成。创建、编辑和停用自定义食物,并按食物 ID 或自由文本配料表生成食谱。读取宏量目标、断食历史与统计,以及体重、体脂等生物特征数据序列。
适用场景
适合在 Cronometer 中记录饮食、希望助手汇总摄入情况、查看宏量或微量营养素、查询食物,或在不打开应用的情况下记录和调整日记条目的用户。
运行要求
通过 stdio 在本地运行,通常用 uvx 从 PyPI 包启动,因此需要 Python 工具(uv)。需要 Cronometer 账户邮箱(CRONOMETER_USERNAME)和密码(CRONOMETER_PASSWORD);启用双重验证的账户还需在 CRONOMETER_TOTP_SECRET 中提供 base32 密钥。可选 CRONOMETER_ACCOUNT_TZ 覆盖账户时区。需要访问 Cronometer 移动端 API 的网络连接。
安装前请注意
服务器会在环境变量中保存 Cronometer 账户密码和双重验证密钥,能访问该配置的人即可登录你的账户。它会写入账户:添加和删除日记条目、创建、编辑和删除自定义食物、创建食谱。它依赖逆向工程得到的移动端 API,可能随时变更。服务器本身没有内置身份验证,任何远程部署都必须置于带身份验证的网关之后。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Cronometer Api Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

cronometer-api-mcp

[License: MIT] [CI] [Build Docker image] [PyPI]

Hosted version for Claude.ai, ChatGPT, and Grok coming soon. Join the waitlist →

An MCP (Model Context Protocol) server for Cronometer nutrition tracking, built on the reverse-engineered mobile REST API.

Unlike cronometer-mcp, which takes a comprehensive GWT-RPC approach against Cronometer's web backend, this server talks to the same JSON REST API used by the Cronometer Android app -- with clean payloads and stable, versioned endpoints.

Features

  • Food log -- diary entries with food names, amounts, meal groups
  • Nutrition data -- daily macro/micro totals and nutrition scores with per-nutrient confidence
  • Food search -- search the Cronometer food database, get detailed nutrition info
  • Diary management -- add/remove entries, copy days, mark days complete
  • Custom foods -- create foods with custom nutrition data
  • Macro targets -- read weekly schedule and saved templates
  • Fasting -- view history and aggregate statistics
  • Biometrics -- weight, body fat, heart rate, and other tracked metrics over a date range

Quick Start

1. Install uv

bash
curl -LsSf https://astral.sh/uv/install.sh | sh

2. Set credentials

bash
export CRONOMETER_USERNAME="[email protected]"export CRONOMETER_PASSWORD="your-password"
Optional: two-factor authentication

If the account has two-factor authentication enabled, /api/v2/login answers TOTP_CODE_REQUIRED unless the request carries the current 6-digit code. Give the server the base32 key that Cronometer showed when 2FA was set up (the same key you scanned into your authenticator app) and it derives the code itself at every login (RFC 6238, SHA-1, 30 s period):

bash
export CRONOMETER_TOTP_SECRET="ABCD EFGH IJKL MNOP QRST UVWX YZ23 4567"

Spaces and lowercase are fine. Leave it unset for accounts without 2FA.

Optional: override the account timezone

Diary entries are stamped in your Cronometer account's timezone, which the server reports at login. If that zone is wrong (for example, an older build had reset it) you can force a specific IANA zone without changing your account settings:

bash
export CRONOMETER_ACCOUNT_TZ="America/Los_Angeles"

When set, this takes precedence over both the value reported at login and any cached session, so it also overrides a stale cached timezone.

3. Configure your MCP client

uvx downloads and runs the server on demand -- no separate install step.

OpenCode (opencode.json)
json
{  "$schema": "https://opencode.ai/config.json",  "mcp": {    "cronometer": {      "type": "local",      "command": ["uvx", "cronometer-api-mcp"],      "environment": {        "CRONOMETER_USERNAME": "{env:CRONOMETER_USERNAME}",        "CRONOMETER_PASSWORD": "{env:CRONOMETER_PASSWORD}",        "CRONOMETER_TOTP_SECRET": "{env:CRONOMETER_TOTP_SECRET}",        "CRONOMETER_ACCOUNT_TZ": "{env:CRONOMETER_ACCOUNT_TZ}"      },      "enabled": true    }  }}
Claude Desktop (claude_desktop_config.json)
json
{  "mcpServers": {    "cronometer": {      "command": "uvx",      "args": ["cronometer-api-mcp"],      "env": {        "CRONOMETER_USERNAME": "[email protected]",        "CRONOMETER_PASSWORD": "your-password",        "CRONOMETER_TOTP_SECRET": "your-base32-key",        "CRONOMETER_ACCOUNT_TZ": "America/Los_Angeles"      }    }  }}

Available Tools

Food Log & Nutrition

ToolDescription
get_food_logDiary entries for a date, each enriched with food name, source, serving measure/count, and that food's per-entry nutrient contribution, plus an energy_summary (target/consumed/remaining kcal) and a nutrition_summary of consumed totals for every tracked nutrient
get_daily_nutritionConsumed macro and micronutrient totals for every nutrient tracked in Cronometer
get_nutrition_scoresCategory scores (Vitamins, Minerals, etc.) with per-nutrient consumed amounts and confidence levels

Food Search & Details

ToolDescription
search_foodsSearch the Cronometer food database by name
get_food_detailsFull nutrition profile and serving sizes for a food

Diary Management

ToolDescription
add_food_entryLog a food serving to the diary
remove_food_entryRemove one or more diary entries
add_custom_foodCreate a custom food with specified nutrition and optional barcodes
update_custom_foodEdit a custom food in place: name, nutrition, serving size, or barcodes
delete_custom_foodRetire a custom food so it leaves search and the Custom Foods list (existing diary entries are kept)
add_recipeCreate a recipe from existing foods referenced by ID and gram weight
import_recipeCreate a recipe from a free-text ingredient list; Cronometer matches each line to a database food and converts the amount to grams
copy_dayCopy all entries from the previous day
mark_day_completeMark a diary day as complete or incomplete

Targets & Tracking

ToolDescription
get_macro_targetsWeekly macro schedule and saved target templates
get_fasting_historyFasting history within a date range
get_fasting_statsAggregate fasting statistics
list_biometricsList trackable biometric metrics and their units
get_biometricsBiometric time series (e.g. weight, body fat) within a date range

All date parameters use YYYY-MM-DD format and default to today when omitted.

Relative dates and recent days

get_food_log, get_daily_nutrition, and get_nutrition_scores also accept "today", "yesterday", and "N days ago" as their date. These are resolved at call time using your Cronometer account timezone, so Claude can pass relative inputs without relying on dates from earlier in a long conversation.

get_food_log and get_daily_nutrition accept days (1–31, default 1), counting back from the inclusive end date:

python
get_food_log(date="yesterday")get_nutrition_scores(date="3 days ago")get_daily_nutrition(days=3)  # Last 3 days, including todayget_daily_nutrition(date="yesterday", days=3)  # Previous 3 complete calendar daysget_food_log(days=7)  # Recent meals, including today

For “my calories the last few days,” use get_daily_nutrition(days=3). Single-day responses retain their existing shape. Multi-day responses contain start_date, end_date, and a days list of daily results, oldest first. Returned dates are always concrete YYYY-MM-DD values.

Transport

stdio only. For remote/hosted use, the stdio server is wrapped by supergateway (see Dockerfile), which owns the HTTP listener and exposes MCP streamable-HTTP at /mcp. The server has no built-in authentication — any remote deployment must sit behind an authenticating gateway or reverse proxy.

Development

For local development, copy .env.example to .env and fill in your credentials:

bash
cp .env.example .env# edit .envuv run cronometer-api-mcp

The CLI auto-loads .env on startup (dev convenience only). Real environment variables always win over .env, so production deployments and MCP client env blocks are unaffected.

How It Works

This server communicates with mobile.cronometer.com -- the same REST API used by the Cronometer Android/Flutter app. The API was reverse-engineered through:

  1. Static analysis of libapp.so (Dart AOT snapshot) from the APK to discover endpoint names
  2. Traffic interception via Frida + mitmproxy to capture exact request/response formats
  3. Trial-and-error against the live API to confirm payload shapes

The API uses two protocols:

  • v2 (POST /api/v2/*) -- JSON-body auth, used for most operations (food search, diary read/write, nutrition, fasting, macros, biometrics)
  • v3 (DELETE /api/v3/user/{id}/*) -- Header-based auth (x-crono-session), used for diary entry deletion

Recipe import is the one asynchronous operation: import_recipe returns a job id, and poll_async_result is polled until the server reports 100% progress and attaches the parsed ingredients.

Python API

You can use the client directly:

python
from cronometer_api_mcp.client import CronometerClientfrom datetime import date
client = CronometerClient()
# Search for foodsresults = client.search_food("chicken breast")
# Get food detailsfood = client.get_food(results[0]["id"])
# Log a servingclient.add_serving(    food_id=food["id"],    measure_id=food["defaultMeasureId"],    grams=200,)
# Get today's diarydiary = client.get_diary()
# Import a recipe from a free-text ingredient listrecipe = client.import_recipe("one hot dog\nketchup\nbun")print(recipe["food_id"], recipe["ingredients"])
# Parse without saving, to review the matches firstpreview = client.import_recipe("2 tbsp olive oil\n200g chicken", save=False)
# Get nutrition scoresscores = client.get_nutrition_scores()

License

MIT

来源:README.md,提交 d76372f

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

4
  1. v0.2.6最新Oct 13, 2026
  2. v0.2.5Oct 8, 2026
  3. v0.2.4Sep 24, 2026
  4. v0.2.3Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分