Skip to main content
Glama
rollecode

Cronometer MCP server

by rollecode

Cronometer MCP server

Version Python Node OAuth

Lee y escribe en tu diario de alimentos de Cronometer desde Claude.ai y Claude Code. Habla con mobile.cronometer.com, la misma API que usa la aplicación de Cronometer para Android, y pone un inicio de sesión OAuth 2.1 delante para que puedas añadirlo a Claude.ai como conector personalizado. Claude Code puede usar en su lugar un token simple. No necesitas una suscripción Gold, y no hay límite de diez exportaciones al día como ocurre con la exportación CSV.

Por qué no las otras opciones

  • Terra API envía tus datos de Cronometer a un webhook, pero solo puede leer, y tu registro de comidas pasa por los servidores de otra persona.

  • gocronometer y herramientas de exportación similares solo pueden leer, y tienen límite de peticiones.

  • Las herramientas que extraen del sitio web de Cronometer pueden escribir, pero dependen de códigos que cambian cada vez que Cronometer publica una actualización, y necesitan Gold.

Related MCP server: cronometer-api-mcp

Herramientas

Lectura

Herramienta

Qué obtienes

get_food_log

Todo lo que hay en el diario de un día. Cada alimento viene con su nombre, su origen, el tamaño de la ración, cuántas raciones y lo que ese alimento ha aportado a tus nutrientes. También obtienes calorías (objetivo, consumidas y restantes) y los totales de todos los nutrientes que controlas.

get_daily_nutrition

Totales de nutrientes de un día

get_nutrition_scores

Las puntuaciones nutricionales de Cronometer

search_foods

Buscar en la base de datos de alimentos

get_food_details

Nutrientes completos y tamaños de ración de un alimento

get_targets

Los objetivos de nutrientes que se muestran junto a tus totales diarios

get_macro_targets

Tus objetivos de proteínas, carbohidratos y grasas

list_biometrics

Qué puedes medir y las unidades que acepta cada uno

get_biometrics

Una medición a lo largo del tiempo

get_fasting_history

Ayunos entre dos fechas

get_fasting_stats

Totales y promedios de ayuno

list_nutrients

Todos los nutrientes que puedes configurar en un alimento personalizado, con sus unidades

Escritura

Herramienta

Qué hace

add_food_entry

Añadir un alimento a una comida

edit_food_entry

Cambiar cuánto has comido, o cuándo

remove_food_entry

Eliminar entradas de alimentos

add_custom_food

Crear tu propio alimento, con hasta los 94 nutrientes

retire_custom_food

Retirar un alimento personalizado, o recuperarlo

add_note

Escribir una nota en un día

edit_note

Reescribir una nota

add_biometric

Registrar una medición como el peso o el porcentaje de grasa corporal

edit_biometric

Corregir una medición que te haya salido mal

add_exercise

Añadir un ejercicio

edit_exercise

Cambiar cuánto duró un ejercicio, o cuánto quemó

add_fast

Registrar un ayuno, terminado o todavía en curso

edit_fast

Cambiar los tiempos u objetivo de un ayuno, incluido terminar uno que sigue en curso

delete_fast

Eliminar un ayuno

copy_day

Copiar el diario de un día a otro

mark_day_complete

Marcar un día como completado, o no

Alimentos personalizados

add_custom_food recibe un diccionario de nombre de nutriente a cantidad, de modo que puedes pasarle desde un solo nutriente hasta el catálogo completo en una única llamada:

{
  "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
  }
}

Las cantidades corresponden a una ración completa, cada una en la unidad propia de ese nutriente. Llama a list_nutrients para obtener los nombres aceptados, que provienen del catálogo de tu propia cuenta en lugar de una tabla fija aquí.

Un nutriente que omitas permanece en blanco en Cronometer. Pasar 0 en su lugar indica que el alimento no contiene nada de ese nutriente, y la aplicación trata ambas cosas de forma distinta, así que pasa solo lo que realmente sepas. Un nombre no reconocido es un error en lugar de descartarse silenciosamente, porque un alimento que ha perdido un nutriente sin avisar sigue pareciendo completo.

Dos ventajas que tiene la etiqueta del alimento y que el catálogo no: energy_kj se convierte a calorías, y salt_g a sodio. Pasa uno u otro, no ambos.

Cómo encaja todo

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

El servidor en sí no tiene ningún inicio de sesión propio y se niega a escuchar en cualquier dirección que no sea la máquina local. Así que cualquier cosa que llegue a él ya ha superado el inicio de sesión. Ese inicio de sesión acepta o bien un token OAuth, que es lo que Claude.ai configura por ti, o un token fijo, que es más rápido para Claude Code.

Instalación

git clone https://github.com/rollecode/cronometer-mcp.git
cd cronometer-mcp
./install.sh

El instalador configura Python y Node, pide tus credenciales de Cronometer y una contraseña para la página de inicio de sesión del conector, genera un token y escribe los archivos de servicio y el sitio de nginx con tu propio nombre de host y nombre de usuario rellenados.

Necesitas Node 18 o superior, Python 3.12 o superior y uv.

Poner el servidor en línea queda de tu parte, porque es donde las configuraciones más difieren, y una suposición equivocada aquí pondría tu diario de alimentos en el internet público. Apunta un túnel o un proxy a 127.0.0.1:8431. Con Cloudflare Tunnel:

ingress:
  - hostname: cronometer-mcp.example.com
    service: http://localhost:8431

Tiene que ser HTTPS. OAuth no funcionará sobre HTTP sin cifrar.

Autoalojarlo manualmente

Si prefieres ver cada paso antes que ejecutar el instalador, esto es todo el proceso. El estado final son dos servicios en tu propia máquina, accesibles a través de HTTPS.

1. Obtén el código y sus dependencias

git clone https://github.com/rollecode/cronometer-mcp.git
cd cronometer-mcp
npm install --omit=dev
uv venv && uv pip install -e .

2. Guarda tus credenciales de Cronometer

./set-credentials.sh

Te pide tu correo electrónico, contraseña y zona horaria, y los escribe en ~/.config/cronometer-mcp/env con modo 0600. La contraseña nunca se muestra en pantalla y nunca llega al historial de tu shell. Hazlo manualmente si lo prefieres:

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

Comprueba que funciona antes de seguir. Esto inicia sesión y muestra tu diario:

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. Establece la contraseña del conector y un token

La contraseña es lo que escribes en la página de inicio de sesión al añadir el conector en Claude.ai. Solo se almacena su hash scrypt.

CONFIG_DIR=~/.config/cronometer-mcp node set-password.js 'your-password-here'

El token es el atajo para Claude Code, que envía una cabecera y se salta el navegador por completo.

openssl rand -hex 32 > ~/.config/cronometer-mcp/token
chmod 600 ~/.config/cronometer-mcp/token

4. Instala los dos servicios

systemd/ contiene los dos archivos de unidad. Sustituye YOUR_USER por tu nombre de usuario y cronometer-mcp.example.com por tu nombre de host, y entonces:

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 es el propio servidor en :8430, accesible solo desde la máquina en la que se ejecuta. cronometer-mcp-auth es la capa de inicio de sesión en :8432, y es lo único que se comunica con :8430.

Una trampa que merece la pena mencionar, porque el síntoma es confuso: no añadas IPAddressDeny=any a cronometer-mcp.service. Es una línea de endurecimiento razonable para un servidor que solo lee archivos locales, pero este tiene que alcanzar mobile.cronometer.com, y con ella activada, cada llamada de herramienta se cuelga hasta que agota el tiempo de espera mientras systemd sigue informando del servicio como activo. Tampoco se gana nada con ella, ya que el servidor ya se niega a escuchar más allá de la máquina local.

5. Pon nginx delante

sudo cp nginx/cronometer-mcp.conf /etc/nginx/sites-enabled/cronometer-mcp
sudo nginx -t && sudo systemctl reload nginx

Escucha en 127.0.0.1:8431 y pasa todo a la capa de inicio de sesión. El tiempo de espera de lectura largo y proxy_buffering off importan: el MCP mantiene la conexión abierta y envía los datos a medida que avanza, y el almacenamiento en búfer lo detendría.

6. Dale una dirección HTTPS

Un túnel de Cloudflare evita tener que abrir un puerto del router. Cualquier proxy inverso HTTPS funciona igual de bien.

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. Compruébalo desde fuera

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

La primera devuelve los datos de inicio de sesión. La segunda debe devolver 401: cualquier otra cosa significa que se está omitiendo la capa de inicio de sesión y tu diario está expuesto.

A continuación, conecta un cliente como se describe en Conectar.

Actualización

git pull
uv pip install -e . && npm install --omit=dev
sudo systemctl restart cronometer-mcp cronometer-mcp-auth

Después de añadir o renombrar una herramienta, pulsa Reconectar en el conector de Claude.ai. Eso actualiza la lista de herramientas dentro de una conversación que ya tengas abierta, y tu inicio de sesión se conserva, porque los tokens residen en oauth.db en disco, no en memoria.

Cuando algo va mal

journalctl -u cronometer-mcp -n 50 --no-pager
journalctl -u cronometer-mcp-auth -n 50 --no-pager

Lo que ves

Lo que suele ser

Las llamadas a herramientas se cuelgan, el servicio dice activo

IPAddressDeny en la unidad MCP, ver paso 4

401 en cada llamada desde Claude Code

El token no coincide, compara la cabecera con ~/.config/cronometer-mcp/token

La página de inicio de sesión rechaza la contraseña

Aún no hay hash almacenado, ejecuta el paso 3

El inicio de sesión falla pidiendo un código 2FA

Ver Si usas autenticación de dos factores

502 de nginx

La capa de inicio de sesión está caída, systemctl status cronometer-mcp-auth

Conexión

Claude.ai. Ve a Configuración, Conectores, Añadir conector personalizado, e indícalo https://your-host/mcp. Deja el ID de cliente y el secreto vacíos. Inicia sesión con la contraseña que estableció el instalador. Hacer esto una vez cubre web, escritorio y móvil, porque los conectores pertenecen a tu cuenta, no a un dispositivo.

Claude Code, a través del navegador:

claude mcp add --transport http cronometer https://your-host/mcp --scope user

Luego ejecuta /mcp para iniciar sesión.

Claude Code, con un token, sin navegador:

claude mcp add --transport http cronometer https://your-host/mcp \
  --header "Authorization: Bearer $(cat ~/.config/cronometer-mcp/token)" \
  --scope user

Usarlo sin servidor

Si Claude se ejecuta en la misma máquina, omite el servidor web y el inicio de sesión por completo y deja que inicie el MCP directamente:

claude mcp add cronometer -- /path/to/cronometer-mcp/.venv/bin/cronometer-mcp

Lee tu inicio de sesión de ~/.config/cronometer-mcp/env o de un archivo .env.

Configuración

Variable

Para qué sirve

CRONOMETER_USERNAME

Tu correo de Cronometer

CRONOMETER_PASSWORD

Tu contraseña de Cronometer

CRONOMETER_ACCOUNT_TZ

La zona horaria en la que se cuentan los días de tu diario

CRONOMETER_TOTP_SECRET

Tu secreto de autenticación de dos factores, solo si tienes activado el doble factor. Requiere el extra totp

ISSUER

La dirección pública del servidor

PORT

Puerto del servidor de inicio de sesión, 8432 por defecto

UPSTREAM

Dónde está el servidor MCP, http://127.0.0.1:8430 por defecto

CONFIG_DIR

Dónde se guardan la contraseña, el token y la base de datos

CALL_TIMEOUT_MS

Cuánto tiempo puede estar una llamada en silencio antes de cortarse, 120000 por defecto

MCP_PORT

Puerto del servidor MCP, 8430 por defecto

MCP_PUBLIC_URL

Dirección pública, utilizada para anunciar el icono a los clientes

Todo lo secreto se guarda en ~/.config/cronometer-mcp/, legible solo por ti: env contiene tu inicio de sesión de Cronometer, password-hash la contraseña para la página de inicio de sesión del conector, token el token fijo y oauth.db las aplicaciones y tokens que el servidor de inicio de sesión ha emitido. Los tokens se almacenan codificados, por lo que una copia robada de la base de datos no le da a nadie una clave válida.

Tu sesión de Cronometer se guarda en ~/.cache/cronometer-mcp/session.json, de modo que reiniciar el servidor no inicia sesión una y otra vez ni alcanza el límite de Cronometer.

Si usas autenticación de dos factores

Un servidor que se deja ejecutando por su cuenta no puede escribir un código, así que necesita el secreto que hay detrás del código:

uv pip install -e '.[totp]'

Luego establece CRONOMETER_TOTP_SECRET con el secreto de tu aplicación de autenticación. Sin él, una cuenta con la autenticación de dos factores activada no podrá iniciar sesión y te lo dirá exactamente.

Trabajar en el código

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/

Créditos

El cliente de Cronometer comenzó siendo una copia de rwestergren/cronometer-api-mcp. La capa de inicio de sesión proviene de 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