Skip to main content
Glama
rollecode

Cronometer MCP server

by rollecode

Cronometer MCP server

Version Python Node OAuth

Читайте и записывайте свой дневник питания 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

Инструменты

Чтение

Инструмент

Что вы получаете

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. Пароль никогда не отображается и не попадает в историю вашей оболочки. Сделайте это вручную, если предпочитаете:

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.

Стоит назвать одну ловушку, поскольку симптом сбивает с толку: не добавляйте 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: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

Что вы видите

Что это обычно означает

Вызовы инструментов зависают, сервис показывает «активен»

IPAddressDeny на модуле MCP, см. шаг 4

401 при каждом вызове из Claude Code

Несовпадение токена, сравните заголовок с ~/.config/cronometer-mcp/token

Страница входа отклоняет пароль

Хэш ещё не сохранён, выполните шаг 3

Вход не удаётся, запрашивается код 2FA

См. Если вы используете двухфакторную аутентификацию

502 от nginx

Слой входа не работает, systemctl status cronometer-mcp-auth

Подключение

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