Cronometer MCP server
Cronometer MCP server
Читайте и записывайте свой дневник питания Cronometer из Claude.ai и Claude Code. Он общается с mobile.cronometer.com — тем же API, который использует приложение Cronometer для Android, — и добавляет перед собой вход через OAuth 2.1, чтобы вы могли подключить его к Claude.ai как пользовательский коннектор. Claude Code может использовать обычный токен. Вам не нужна подписка Gold, и нет ограничения на десять экспортов в день, как при экспорте в CSV.
Почему не другие варианты
Terra API отправляет ваши данные Cronometer на вебхук, но он может только читать, а ваш журнал питания проходит через чужие серверы
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. Пароль никогда не отображается и не попадает в историю вашей оболочки. Сделайте это вручную, если предпочитаете:
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.
Стоит назвать одну ловушку, поскольку симптом сбивает с толку: не добавляйте IPAddressDeny=any в cronometer-mcp.service. Это разумная строка для усиления защиты сервера, который только читает локальные файлы, но этому серверу необходимо обращаться к 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Что вы видите | Что это обычно означает |
Вызовы инструментов зависают, сервис показывает «активен» |
|
| Несовпадение токена, сравните заголовок с |
Страница входа отклоняет пароль | Хэш ещё не сохранён, выполните шаг 3 |
Вход не удаётся, запрашивается код 2FA | |
| Слой входа не работает, |
Подключение
Claude.ai. Перейдите в «Настройки», «Коннекторы», «Добавить пользовательский коннектор» и укажите https://your-host/mcp. Оставьте идентификатор клиента и секрет пустыми. Войдите с паролем, который задал установщик. Однократное выполнение покрывает веб, десктоп и мобильные устройства, потому что коннекторы принадлежат вашей учётной записи, а не одному устройству.
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 запущен на той же машине, пропустите веб-сервер и вход полностью и позвольте ему запустить 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