Skip to main content
Glama

DkwtMCP

CI PyPI

Servidor MCP local que conecta Claude Desktop con tus datos de Garmin y Apple Health, para leer tu entrenamiento y recuperación, estimar tus zonas de frecuencia cardíaca y de ritmo, analizar tu rendimiento y crear/programar entrenos estructurados — todo desde una conversación con Claude. Sirve tanto para ciclismo como para running.

Proyecto personal del equipo DkwtMCP. Inspirado en FitMCP, pero de uso local: tus credenciales y datos se quedan en tu ordenador, sin servidor ni suscripciones.


Qué hace

  • Garmin — entreno y actividades: lee tus actividades y su detalle (con splits por km), estima tus zonas de FC y tus zonas de ritmo, y crea y programa entrenos estructurados por zonas de FC o por ritmo en tu calendario de Garmin.

  • Garmin — rendimiento y carga: predicciones de carrera (5K/10K/media/maratón), récords personales, VO2max y edad fitness, y estado de entrenamiento con carga aguda/crónica.

  • Apple Health (vía Apple Watch): datos de salud y recuperación (sueño, HRV, FC en reposo, pasos, energía) y todos tus entrenos del Apple Watch (fuerza, caminata, remo, ciclismo indoor, etc.).

  • Transversal: cruza lo planificado (Garmin) con lo ejecutado y calcula tu adherencia al plan.

La gracia es que Garmin y Apple no se hablan entre ellos, pero aquí conviven en la misma conversación: puedes preguntar "¿cómo dormí (Apple) y qué entreno me toca hoy (Garmin)?".


Related MCP server: Garmin MCP Server

Avisos importantes

  • Garmin usa la librería no oficial python-garminconnect. Funciona muy bien pero es frágil ante cambios de Garmin; la versión está fijada en requirements.txt. Es para uso personal.

  • Apple Health no tiene API en la nube: los datos se obtienen exportando desde el iPhone (ver más abajo). Es solo lectura.

  • Este software se ofrece "tal cual", sin garantías. Úsalo con tu propia cuenta y bajo tu responsabilidad.


Requisitos

  • macOS (probado) o Linux. Windows debería funcionar con ajustes de rutas.

  • Claude Desktop.

  • Una cuenta de Garmin Connect.

  • Python 3.10 o superior — solo para la instalación desde el código (opción B). Con el binario (opción A) no necesitas Python.

  • (Opcional) Un Apple Watch + la app Health Auto Export para los datos de recuperación/fuerza.

  • Node.js solo si quieres probar con el MCP Inspector (opcional).


Instalación

Hay dos formas, según tu perfil:

  • A) Sin conocimientos técnicos (Mac, sin Python): usa el binario ya compilado. Solo tienes que colocar una carpeta, iniciar sesión en Garmin una vez y pegar una línea en Claude Desktop. Sigue la guía paso a paso con capturas: packaging/GUIA_INSTALACION.pdf. (El binario dkwtmcp hay que compilarlo en un Mac una vez con packaging/build_mac.sh, o pedírselo a quien te comparta el proyecto.)

  • B) Desde el código (desarrolladores, con Python): sigue los pasos de abajo.

  • C) Con pip, en una línea (si ya tienes Python y solo quieres usarlo) — la más sencilla:

    pip install dkwtmcp
    dkwtmcp login     # login de Garmin, una vez

    Esto instala el comando dkwtmcp (servidor MCP) y dkwtmcp login. En la config de Claude Desktop pon como command la ruta que te devuelva which dkwtmcp. Nota: por esta vía no hay .env del proyecto, así que los ajustes se pasan en el bloque env de la config.

    Para actualizar a la última versión: pip install --upgrade dkwtmcp.

Instalación desde el código (opción B)

git clone <URL-de-tu-repo> DkwtMCP
cd DkwtMCP

python3 -m venv .venv
source .venv/bin/activate           # en Windows: .venv\Scripts\activate
pip install -r requirements.txt

cp .env.example .env                 # y rellena tus valores (ver abajo)

Configuración (.env)

Edita .env:

ENABLE_GARMIN=true
ENABLE_APPLE=false                   # ponlo a true si usas Apple Watch

GARMIN_EMAIL=tu_email@ejemplo.com
GARMIN_PASSWORD=tu_contraseña

APPLE_EXPORT_DIR=                     # ruta a tu carpeta de exports de Apple (ver sección Apple)

Tu .env nunca se sube a git (está en .gitignore).


Login de Garmin (una sola vez)

El servidor no hace login interactivo (se colgaría pidiendo el código 2FA), así que se generan los tokens una vez con un script:

python scripts/garmin_login.py

Te pedirá tu email, contraseña y, si tienes verificación en dos pasos, el código 2FA. Los tokens quedan guardados en ~/.dkwtmcp/garmin/ y se reutilizan en cada arranque. Solo hay que repetirlo si caducan.

Nota: Garmin limita los intentos de login por IP. Si ves un error 429, espera 30–60 minutos (o cambia de red, p. ej. el punto de acceso del móvil) y reintenta.


Sincronización con Apple Health

Apple Health no se puede sincronizar hacia Garmin ni tiene API en la nube. La forma práctica de traer tus datos del Apple Watch (sueño, HRV, FC en reposo, fuerza) es la app Health Auto Export – JSON+CSV (App Store), que exporta automáticamente a una carpeta.

1. Instala y configura Health Auto Export

  1. Instala Health Auto Export – JSON+CSV en el iPhone.

  2. Crea una automatización (o exportación) con estas opciones:

    • Formato: JSON.

    • Destino: iCloud Drive (así los archivos aparecen también en tu Mac).

    • Frecuencia: por ejemplo, diaria.

  3. Métricas de salud — asegúrate de incluir al menos: Sleep Analysis, Heart Rate Variability, Resting Heart Rate, Heart Rate, Steps, Active Energy.

  4. Entrenos (Workouts) — es una categoría aparte. Si quieres ver tus sesiones de fuerza, añade también una exportación de Workouts en JSON al mismo sitio.

Puedes usar dos automatizaciones (una de métricas y otra de workouts) apuntando a subcarpetas dentro de una carpeta común; el MCP las lee de forma recursiva.

Sobre el sueño: el MCP entiende tanto el formato agregado (en minutos) como el detallado por segmentos, y calcula fases (Profundo, Esencial/Core, REM), Vigilia y Tiempo en la cama para que coincidan con la app Salud del iPhone.

2. Apunta APPLE_EXPORT_DIR a la carpeta

Health Auto Export guarda en su propia carpeta de iCloud, cuya ruta en el Mac es del tipo:

/Users/TU_USUARIO/Library/Mobile Documents/iCloud~com~ifunography~HealthExport/Documents

Pon esa carpeta (la que contiene tus subcarpetas de export) en APPLE_EXPORT_DIR, y ENABLE_APPLE=true. El escaneo es recursivo, así que basta con apuntar a la carpeta padre.

iCloud: si tienes activado "Optimizar almacenamiento del Mac", los archivos pueden estar solo en la nube. Haz clic derecho en la carpeta → Descargar ahora para que estén en local.

3. Importa

Los datos de Apple se importan bajo demanda. En una conversación de Claude di "importa mi Apple Salud" (ejecuta apple_import_export), que guarda una base local (SQLite) en ~/.dkwtmcp/apple/.

El import es incremental por defecto: solo procesa los archivos nuevos o cambiados desde la última vez (rápido, ideal para la automatización diaria de Health Auto Export). Si alguna vez quieres reconstruir desde cero, pide un import con full_rebuild.


Perfil de usuario (opcional)

Para no repetirle a Claude tu FC máxima o tu ritmo umbral cada vez, guárdalos en el .env:

USER_MAX_HR=179
USER_THRESHOLD_PACE=4:20
USER_RESTING_HR=
USER_AGE=

Las herramientas de zonas (garmin_hr_zones, garmin_pace_zones) usan estos valores por defecto cuando no se los indicas. Consulta lo configurado con fitness_profile.


Conectar a Claude Desktop

  1. En Claude Desktop: Ajustes → Developer → Edit Config (abre claude_desktop_config.json).

  2. Añade el bloque de mcpServers (ver claude_desktop_config.example.json), ajustando las rutas a tu instalación:

{
  "mcpServers": {
    "DkwtMCP": {
      "command": "/ruta/a/DkwtMCP/.venv/bin/python",
      "args": ["-m", "dkwt_mcp.server"],
      "cwd": "/ruta/a/DkwtMCP/src",
      "env": { "PYTHONPATH": "/ruta/a/DkwtMCP/src" }
    }
  }
}
  1. Cierra Claude Desktop del todo (Cmd+Q) y reábrelo. Deberías ver DkwtMCP en el menú de herramientas.

Usa el Python del entorno virtual (.venv/bin/python), no el del sistema; si no, no encontrará las dependencias.

Consejo: instrucciones del proyecto

Para que Claude elija bien las herramientas, en tu Proyecto de Claude añade instrucciones tipo: "la recuperación (sueño, HRV, FC reposo) viene de Apple; las actividades, entrenos, zonas (FC y ritmo), rendimiento y carga, de Garmin". Y si eres corredor, indícalo ("entreno running, prográmame por ritmo con sport=running") para que use ritmo en vez de zonas de FC.


Herramientas disponibles

Herramienta

Plataforma

Qué hace

garmin_daily_readiness

Garmin

Recuperación del día (readiness, HRV, sueño, FC reposo, estrés, Body Battery)*

garmin_get_activities

Garmin

Últimas actividades con métricas

garmin_get_activity

Garmin

Detalle de una actividad

garmin_sleep / garmin_hrv

Garmin

Desglose de sueño / HRV nocturna*

garmin_hr_zones

Garmin

Estima tus zonas de FC (Karvonen o %FCmax), filtrando lecturas imposibles

garmin_pace_zones

Garmin

Estima zonas de ritmo (running) a partir del ritmo umbral

garmin_activity_splits

Garmin

Parciales (splits) de una actividad con ritmo por km y FC

garmin_race_predictions

Garmin

Predicciones de tiempo 5K / 10K / media / maratón

garmin_personal_records

Garmin

Récords personales (mejores marcas)

garmin_fitness_metrics

Garmin

VO2max (correr y ciclismo) y edad fitness

garmin_training_status

Garmin

Estado de entrenamiento, carga aguda/crónica, VO2max y endurance score

garmin_schedule_workout

Garmin

Crea y programa entrenos estructurados: pasos por tiempo o distancia, series con repeticiones, y objetivos de FC, ritmo o potencia (previsualización por defecto)

garmin_plan_week

Garmin

Programa varias sesiones de golpe (el plan de la semana o del bloque)

garmin_list_workouts / garmin_delete_workout

Garmin

Listar / borrar entrenos guardados

fitness_planned_vs_actual

Transversal

Compara plan (entrenos programados) vs. ejecutado y calcula adherencia

fitness_weekly_summary

Transversal

Resumen del periodo: km/horas (Garmin) + sueño/HRV/reposo/pasos (Apple)

fitness_recovery_vs_training

Transversal

Cruce día a día de entreno vs. recuperación (HRV, sueño, FC reposo)

garmin_add_body_composition

Garmin

Registra peso y composición corporal (para básculas que no sincronizan)

fitness_body_composition

Transversal

Evolución de peso, % grasa y músculo (Garmin + Apple) con tendencia

fitness_daily_brief

Transversal

Brief de la mañana: recuperación de anoche + ayer + plan de hoy

fitness_dashboard

Transversal

Genera un cuadro de mando en HTML interactivo: PMC (forma/fatiga/frescura), ACWR, zonas de FC, carga semanal y composición corporal

fitness_log_rpe

Transversal

Puntúa el esfuerzo de una sesión (RPE 1-10) para calcular la carga por sRPE

apple_import_export

Apple

Importa tus exports de Apple Health/Health Auto Export a una base local

apple_query_metric

Apple

Sueño (por noche), HRV, FC reposo, pasos, energía en un rango

apple_get_workouts

Apple

Entrenos del Apple Watch (fuerza, caminata, remo, etc.)

fitness_profile

Perfil

Muestra tu perfil (FCmáx, FC reposo, edad, ritmo umbral) del .env

nutrition_setup_profile

Nutrición

Alta guiada del perfil nutricional (con cribado de seguridad)

nutrition_profile

Nutrición

Muestra el perfil nutricional guardado

nutrition_guidance

Nutrición

Pautas generales del día: macros, hidratos según carga y timing pre/intra/post

* Las métricas de recuperación de Garmin (sueño, HRV, Body Battery…) requieren un reloj/pulsera Garmin; un ciclocomputador Edge no las registra. En ese caso usa las herramientas de Apple.


Ejemplos de uso

Una vez conectado, habla con Claude en lenguaje natural:

Ciclismo / general

  • "Lista mis últimas 5 actividades de Garmin."

  • "Estima mis zonas de frecuencia cardíaca."

  • "Prográmame un 4×5 minutos en Zona 4 para el sábado (primero en previsualización)."

  • "Móntame el plan de la semana que viene: rodaje Z2 el martes, series el jueves y salida larga el domingo." (garmin_plan_week)

  • "¿Cumplí el plan esta semana?" (plan vs. ejecutado)

Running

  • "Estima mis zonas de ritmo, mi umbral es 4:20/km."

  • "Prográmame un rodaje de 40 min en ritmo fácil el domingo."

  • "Un 5×1000 m a 4:20-4:30 con 2 min de recuperación, para el martes." (series por distancia, agrupadas como repeticiones)

  • "¿Cómo dosifiqué mi última carrera? Enséñame los splits."

  • "¿Qué tiempo predice Garmin para mi media maratón? ¿Y mis récords?"

  • "¿Cómo va mi estado de entrenamiento y mi carga aguda/crónica?"

Recuperación y fuerza (Apple)

  • "¿Cómo dormí anoche?"

  • "¿Cuántos entrenos de fuerza hice en junio y cuánto sumaron?"

Nutrición (orientación general, ver SECURITY.md)

  • "Créame el perfil nutricional." (nutrition_setup_profile)

  • "¿Qué debería comer hoy?" / "Hoy tengo salida larga, ¿cómo lo enfoco?" (nutrition_guidance)

Resúmenes y correlaciones (Garmin + Apple)

  • "Hazme el resumen de esta semana." (fitness_weekly_summary)

  • "¿Mi HRV baja los días que entreno duro?" / "¿Duermo peor tras la fuerza?" (fitness_recovery_vs_training)

  • "Apunta mi medición de hoy: 89 kg, 38% de grasa, 30 kg de músculo." (garmin_add_body_composition)

  • "¿Cómo va mi peso y mi % de grasa estos 3 meses?" (fitness_body_composition)

  • "Dame el brief de hoy: ¿cómo vengo y qué me toca?" (fitness_daily_brief)

  • "Genérame el cuadro de mando." (fitness_dashboard — crea el HTML en dashboard/ en segundos)

Seguridad en escritura

Las herramientas que escriben en Garmin llevan confirmación: garmin_schedule_workout usa dry_run (por defecto solo previsualiza) y garmin_delete_workout requiere confirm=true.


Los tres flujos del día a día

Brief de la mañana — fitness_daily_brief

"Dame el brief de hoy."

El vistazo antes de decidir si entrenas y cómo:

  • Recuperación de anoche: sueño, HRV y FC en reposo. Se fija en la noche de hoy; si el reloj aún no ha sincronizado devuelve null, nunca la noche anterior disfrazada de anoche.

  • Ayer y lo que llevas hoy: actividades de Garmin más entrenos del Apple Watch.

  • Planificado para hoy, por este orden: lo ya entrenado → lo programado en Garmin → el plan semanal local (fitness_set_week_plan) → tu calendario habitual.

Cuadro de mando — fitness_dashboard

"Genérame el cuadro de mando."

Rellena una plantilla HTML con tus datos y devuelve la ruta del archivo. Se genera en segundos (frente a los minutos que tarda si le pides a Claude que dibuje el HTML desde cero en la conversación).

  • Dónde queda: dashboard/cuadro_mando.html en el proyecto; si esa ruta no existe o no es escribible (por ejemplo con el binario o instalado por pip), va a ~/.dkwtmcp/dashboard/. Puedes forzar otra con output_path.

  • Qué incluye: PMC (forma/fatiga/frescura con CTL, ATL y TSB), ACWR, carga semanal por sRPE, reparto por zonas de FC y composición corporal.

  • Modos (focus): completo (por defecto), entrenos (oculta el bloque de peso y composición) y recomp (lo destaca). Basta con decirlo en lenguaje natural: "el cuadro de mando, solo entrenos".

  • La carga usa sRPE (RPE × minutos), que sirve igual para fuerza y para e-bike. Puntúa las sesiones con fitness_log_rpe para que el PMC sea fiel.

Perfil nutricional — nutrition_setup_profilenutrition_guidance

"Créame el perfil nutricional." y luego "¿qué debería comer hoy?"

El alta es una entrevista guiada que empieza por el cribado de salud y solo después pregunta objetivo, patrón alimentario, alergias, horarios y entrenamiento. Se previsualiza (dry_run=true) antes de guardar en ~/.dkwtmcp/nutrition/profile.json.

  • Solo para personas adultas. Por debajo de 18 años no da pautas y deriva a pediatría o a un dietista-nutricionista: en crecimiento las necesidades son otras y es la etapa de mayor riesgo de trastorno alimentario.

  • Derivación en dos niveles. Ciertas condiciones (enfermedad renal, diabetes, anticoagulantes, TCA, embarazo, lactancia y otras) bloquean las pautas y derivan a un profesional; otras (hipertensión leve, colesterol, SOP, tiroides controlado…) las permiten con un aviso reforzado. Si mencionas una condición nueva en la conversación, pásala en condiciones_hoy y se vuelve a comprobar.

  • Solo patrones con respaldo científico: mediterráneo, comida real, DASH, nórdico y flexitariano, con modificadores (baja en hidratos moderada, vegetariano, vegano, ayuno intermitente moderado). Los estilos sin aval (keto estricta, carnívora, detox, alcalina, ayuno prolongado…) se reconducen al equivalente razonable en vez de aplicarse.

  • Qué devuelve nutrition_guidance: rango de proteína (con el porqué), estrategia de hidratos según el tipo de día, mínimo de grasa, timing pre/intra/post y principios de calidad. El tipo de día se deduce con la misma prioridad que el brief y se expone en tipo_dia_detectado_por, así que sabes si es un hecho o una previsión.

  • Lo que nunca hace: calcular calorías, prohibir alimentos, proponer compensar excesos con restricción o ejercicio extra, ni aceptar objetivos por debajo de un IMC saludable.

Es orientación general de estilo de vida, no asesoramiento médico ni nutricional individualizado. Ver SECURITY.md.


Probar sin Claude Desktop (opcional)

Con el MCP Inspector:

cd src
npx @modelcontextprotocol/inspector python -m dkwt_mcp.server

Compartir con otra persona

En packaging/ hay lo necesario para generar un binario de macOS autocontenido (con PyInstaller) que no requiere Python en el ordenador de destino, pensado para alguien sin conocimientos técnicos. Cada persona usa su propia cuenta de Garmin. Ver packaging/GUIA_INSTALACION.pdf.

Genéralo con bash packaging/build_mac.sh (resultado en dist/dkwtmcp). Notas:

  • El binario no lee el .env del proyecto. Trae Garmin, el cuadro de mando y la nutrición pública (las tres nutrition_*); Apple queda desactivado, y el módulo de nutrición personal no se incluye nunca (--exclude-module). Si hace falta configurar algo, se pasa por el bloque env de la config de Claude Desktop (ver packaging/claude_desktop_config.companero.json).

  • Cada persona genera su propio perfil nutricional en su ordenador (~/.dkwtmcp/nutrition/profile.json); no viaja dentro del binario.

  • Hay que recompilarlo cada vez que quieras que la otra persona reciba mejoras: no se actualiza solo.

  • Para comprobar que un binario recién hecho responde, sin depender de otras herramientas:

    { printf '%s\n' \
    '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"cli","version":"1"}}}' \
    '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
    '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"fitness_profile","arguments":{"params":{}}}}' ; sleep 8; } | ./dist/dkwtmcp 2>/dev/null

Solución de problemas

DkwtMCP no aparece en Claude Desktop. Revisa que en claude_desktop_config.json la ruta a Python sea la del entorno virtual (.venv/bin/python) y que cwd/PYTHONPATH apunten a src. Cierra Claude del todo (Cmd+Q) y reábrelo; recargar la ventana no basta.

Cambié el código y no veo el cambio. El servidor MCP se carga al arrancar Claude Desktop. Tras editar código, cierra y reabre Claude Desktop. Si tocaste datos de Apple, vuelve a importar ("importa mi Apple Salud").

Login de Garmin: error 429. Garmin limita los intentos por IP. Espera 30–60 minutos sin reintentar, o cambia de red (p. ej. el punto de acceso del móvil) y repite el login.

Login de Garmin falla / dejó de funcionar. Los tokens pueden caducar, o Garmin puede haber cambiado su sistema (la librería es no oficial). Vuelve a ejecutar python scripts/garmin_login.py. Si sigue fallando, comprueba si hay una versión nueva de garminconnect.

Las métricas de recuperación de Garmin (sueño, HRV, Body Battery) salen vacías. Esas las mide un reloj/pulsera Garmin en la muñeca; un ciclocomputador Edge no las registra. Si llevas Apple Watch, usa las herramientas de Apple para la recuperación.

Apple: "no hay datos importados". Ejecuta primero apple_import_export ("importa mi Apple Salud"). El import borra y reconstruye la base cada vez.

Apple: no encuentra la carpeta de exports. Health Auto Export guarda en su propia carpeta de iCloud (.../iCloud~com~ifunography~HealthExport/Documents). Apunta APPLE_EXPORT_DIR ahí. Si usas iCloud con "Optimizar almacenamiento", haz clic derecho en la carpeta → Descargar ahora.

Herramientas de running (predicciones, récords, estado) salen con campos vacíos. Requieren un reloj Garmin con esos datos calculados y actividades recientes. Si algún campo sale null pese a tenerlo en Garmin, es cosa del parseo: ábrelo con response_format: "json" y repórtalo.


Preguntas frecuentes (FAQ)

¿Necesito saber programar o tener Python? Para la vía del binario (opción A) no. Para instalar desde el código (opción B) sí necesitas Python.

¿Funciona con el plan gratuito de Claude? Sí. Los MCP locales por archivo de configuración funcionan en Claude Desktop, también en el plan Free.

¿Se suben mis datos a algún sitio? No. Todo es local: tus credenciales van en .env (nunca al repo) y los datos se guardan en ~/.dkwtmcp/ de tu ordenador. No hay servidor.

¿Puedo compartirlo? ¿Y usarlo varias personas? Sí. El código se comparte; cada persona usa su propia cuenta de Garmin (su propio login y tokens).

¿Sirve para ciclismo y para running? Para ambos. Ciclismo por zonas de FC/potencia; running por zonas de ritmo, con análisis de rendimiento y carga.

¿Soporta Strava? No por ahora. Sus términos (2025) prohíben usar sus datos en IA, así que se retiró del alcance.

¿Por qué puede dejar de funcionar Garmin de repente? Usa una librería no oficial; si Garmin cambia su sistema de acceso, puede romperse hasta que la librería se actualice. Es un riesgo asumido de un proyecto personal.

¿Cada cuánto tengo que importar los datos de Apple? Cuando quieras refrescar. Con una automatización de Health Auto Export que deje los archivos en la carpeta, basta con volver a decir "importa mi Apple Salud".

¿Funciona en Windows? Debería, ajustando rutas. Está probado en macOS.


Estructura del proyecto

DkwtMCP/
├── src/dkwt_mcp/
│   ├── app.py              # instancia FastMCP
│   ├── server.py           # entrypoint (stdio)
│   ├── cli.py / login.py   # login de Garmin y arranque
│   ├── config.py           # configuración desde .env
│   ├── common.py           # utilidades (errores, formato)
│   └── providers/
│       ├── garmin.py       # herramientas garmin_*
│       ├── apple.py        # herramientas apple_*
│       └── fitness.py      # herramienta transversal fitness_*
├── scripts/garmin_login.py
├── packaging/              # binario y guía para compartir
├── requirements.txt
├── .env.example
└── claude_desktop_config.example.json

Desarrollo y tests

El proyecto incluye una batería de tests (funciones puras de parseo y construcción de entrenos) que se ejecutan en cada push mediante GitHub Actions.

pip install -r requirements-dev.txt
pytest -q

Contribuir

Las aportaciones son bienvenidas: lee CONTRIBUTING.md para el entorno de desarrollo y las convenciones del proyecto.

Importante: al abrir un issue no incluyas credenciales, tokens ni datos de salud reales. Ver SECURITY.md para cómo se tratan tus datos y cómo reportar un problema de seguridad.


Licencia

Publicado bajo licencia MIT — ver LICENSE. Puedes usarlo, modificarlo y distribuirlo libremente, conservando el aviso de copyright (el crédito a la autora).

Cómo citar

Si usas este proyecto, cítalo por favor. GitHub mostrará un botón "Cite this repository" gracias a CITATION.cff. En resumen:

Infantes, N. (2026). DkwtMCP – MCP local para Garmin y Apple Health.


Proyecto personal, sin relación con Garmin ni Apple. Usa una librería no oficial para Garmin; su funcionamiento puede romperse si Garmin cambia su sistema. No hay garantía de ningún tipo. Tú eres responsable del uso que hagas de tus propias cuentas y datos.

Available Tools

22 tools
fitness_body_compositionA
Read-onlyIdempotent

Evolucion de peso, % de grasa y masa muscular/magra en un periodo.

Lee de Garmin (bascula / entradas manuales) y de Apple Health, y muestra los valores por fecha mas la tendencia (diferencia entre el primero y el ultimo). Pensado para seguimiento mensual, no para pesarse a diario.

Args: params: start (YYYY-MM-DD), end? (por defecto start+6 dias; usa un rango amplio, p. ej. 3 meses, para ver tendencia), response_format.

Returns: str: series por fecha y tendencias de peso/grasa/musculo; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent, non-destructive), the description reveals it reads from Garmin and Apple Health, shows per-date values plus trend (difference between first and last), and expects monthly usage. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a clear purpose paragraph and structured Args/Returns section. While slightly informal and in Spanish, it is efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (two data sources, trend calculation) and absence of an output schema, the description fully explains what data is returned (series by date, trends for weight/fat/muscle) and error handling. It covers all necessary context for an AI to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description compensates well by explaining start (YYYY-MM-DD), end (optional, defaults to start+6 days, but suggests wide range), and response_format. This adds clear meaning beyond the schema's bare descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly explains the tool tracks evolution of weight, fat %, and muscle mass over a period, combining data from Garmin and Apple Health. It specifies monthly tracking vs daily weighing, distinguishing it from siblings like garmin_add_body_composition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description states it is designed for monthly tracking—not daily weighing—and recommends a wide date range (e.g., 3 months) for trend analysis. However, it does not explicitly name alternative tools or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitness_daily_briefA
Read-onlyIdempotent

Resumen de la mañana: como vienes de recuperacion y que tienes planificado hoy.

Junta en una sola llamada: recuperacion de anoche (HRV, sueño y FC reposo de Apple, con Garmin como respaldo), lo que entrenaste ayer, y los entrenos que tengas programados para hoy en Garmin.

Args: params: date? (YYYY-MM-DD, por defecto hoy), response_format.

Returns: str: brief del dia; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true, establishing safety and non-destructiveness. The description adds value by noting data aggregation from Apple with Garmin as fallback, and that output is a string. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences plus an Args/Returns section. It is front-loaded with the core purpose and efficiently conveys all essential information without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity as an aggregator, the description covers key aspects: data sources, components retrieved, and return format. It does not detail error handling or missing data scenarios, but these are minor gaps. Overall sufficiently complete for a read-only summary tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not mention parameters, but the input schema provides clear descriptions for both 'date' (format and default) and 'response_format' (enum with defaults). With schema covering parameter semantics adequately, a baseline of 3 is appropriate despite zero description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides a morning brief summarizing recovery (HRV, sleep, resting HR from Apple with Garmin backup), yesterday's training, and today's planned workouts. It distinguishes itself from individual Garmin data tools and other composite summaries, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies using this tool for a consolidated morning brief instead of calling multiple individual tools. However, it lacks explicit when-to-use or when-not-to-use guidance, and does not name alternatives directly. Context is clear but not fully prescriptive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitness_planned_vs_actualA
Read-onlyIdempotent

Compara los entrenos PLANIFICADOS con las actividades REALMENTE ejecutadas en un rango de fechas, y calcula la adherencia al plan.

"Planificado" = solo entrenos estructurados de tu biblioteca que hayas programado (no las actividades ya completadas que Garmin lista en el calendario). El cruce es por dia: si un dia tenia entreno programado y hubo actividad, se considera cumplido; si habia plan y no hubo actividad, no realizado; si hubo actividad sin plan, extra.

Args: params: start (YYYY-MM-DD), end? (YYYY-MM-DD, por defecto = start), response_format (markdown|json).

Returns: str: resumen con dias planificados, cumplidos, no realizados y extra, porcentaje de adherencia, y el detalle por dia; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals important behavioral details: planned includes only scheduled structured workouts, cross is by day, and outputs include adherence percentage. Annotations already declare read-only, idempotent, non-destructive, and the description adds context beyond those.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured with clear sections for explanation, arguments, and returns. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple input schema and presence of output schema, the description covers all necessary aspects: return format, adherence calculation logic, and detailed output description, making it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to parameters by explaining date formats (YYYY-MM-DD) and the response_format enum values, which are already in the schema. It also contextualizes the parameters within the tool's logic.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool compares planned vs actual workouts and calculates adherence. It distinguishes from siblings like garmin_get_activities or fitness_weekly_summary by focusing specifically on plan adherence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the tool is used for comparing planned and actual workouts in a date range. While it does not explicitly mention alternatives, the context of siblings makes its unique purpose clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitness_profileA
Read-onlyIdempotent

Muestra el perfil configurado (FCmax, FC reposo, edad, ritmo umbral).

Estos valores se guardan en el .env (USER_MAX_HR, USER_RESTING_HR, USER_AGE, USER_THRESHOLD_PACE) y los usan por defecto las herramientas de zonas cuando no se los indicas explicitamente. Asi no tienes que repetirlos cada vez.

Args: params: response_format (markdown|json).

Returns: str: los valores del perfil, o un aviso de que estan sin configurar.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) indicate a safe read operation. Description adds context that values come from .env and are defaults for zone tools, reinforcing behavior without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is 4 lines, front-loaded with purpose, then usage context, then parameter and return info. Efficient but slightly verbose. No wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity and presence of output schema, description sufficiently covers input, behavior (reads from .env, returns profile or warning), and relationship with sibling tools. No obvious gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter 'response_format' with enum. Schema already describes it as 'markdown o json' with default 'markdown'. Description repeats this without additional semantics beyond what schema provides. Schema coverage is 0% per context, but the schema description is functional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Muestra el perfil configurado' (shows configured profile) listing specific fields (FCmax, FC reposo, edad, ritmo umbral). This is a specific verb and resource, and it distinguishes from sibling Garmin and fitness tools by focusing on local environment variables.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains that these values are defaults used by zone tools when not explicitly provided, implying when to check/use this tool. It does not explicitly state when not to use it, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitness_recovery_vs_trainingA
Read-onlyIdempotent

Cruza, dia a dia, lo que entrenaste (Garmin + Apple) con tu recuperacion (HRV, sueño y FC en reposo de Apple).

Sirve para ver correlaciones: si la HRV baja tras dias duros, si duermes peor los dias de fuerza, etc. Requiere Apple importado para la recuperacion.

Args: params: start (YYYY-MM-DD), end? (por defecto start+6 dias), response_format.

Returns: str: tabla por dia con entreno y metricas de recuperacion; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the tool is read-only, idempotent, and non-destructive. The description adds that it requires Apple data for recovery and returns a table or error string. It does not contradict annotations but also does not elaborate on behavior beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loads the main purpose. The parameter list follows clearly. One could argue for slightly more structure, but it remains efficient without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool's purpose, inputs, output format, and prerequisites are covered. The 'Returns' line specifies a table by day or an error, which is adequate given no output schema. However, it could detail the output columns for greater completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description repeats parameter names and formats already documented in the input schema. With schema coverage effectively high (the schema includes descriptions for start, end, and response_format), the description adds no new semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to cross-reference daily training data from Garmin and Apple with recovery metrics (HRV, sleep, resting HR). The verb 'Cruza' (cross) and the specific resources (training + recovery) make it distinct from sibling tools that focus on individual metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete use cases (correlating HRV drops after hard days, worse sleep after strength days) and a prerequisite (Apple data imported). It implies when to use this tool over others, though it does not explicitly list alternative tools for specific purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitness_weekly_summaryA
Read-onlyIdempotent

Resumen de entrenamiento y recuperacion de un periodo (por defecto una semana).

Cruza Garmin (actividades, km, horas) con Apple (sueño medio, HRV media, FC reposo media, pasos, entrenos de fuerza). Requiere haber importado Apple para la parte de recuperacion.

Args: params: start (YYYY-MM-DD), end? (por defecto start+6 dias), response_format.

Returns: str: resumen agregado del periodo; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds value beyond annotations by clarifying that the tool returns a string summary or error message, and explains the default date range logic. Annotations already indicate read-only, idempotent, non-destructive behavior; description complements this with operational details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: a clear one-sentence summary, a technical prerequisite, then an explicit Args list, and a Returns line. Every sentence is informative with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that returns a string summary, the description covers purpose, prerequisites, parameters, and output format. Despite having an external output schema, the description self-contains return type information, making it fully complete for selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is listed as 0%, the description actually explains all parameters in the Args section: start (format), end (optional with default behavior), and response_format (markdown/json). This adds significant clarity beyond the schema's simple type constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it generates a weekly summary of training and recovery by combining Garmin and Apple data. It specifies the data sources (activities, km, hours from Garmin; sleep, HRV, resting HR, steps, strength from Apple), setting it apart from siblings that only focus on one source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states that Apple data import is required for the recovery part, giving a clear condition for proper usage. However, it does not mention alternative tools among siblings for when Apple data is unavailable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_activity_splitsA
Read-onlyIdempotent

Devuelve las vueltas (laps) de una actividad con su ritmo, FC y distancia.

Util para ver como dosifico un corredor. Nota: usa las VUELTAS de la actividad; si el reloj tiene auto-lap cada km, saldra el ritmo km a km. Si la actividad no tiene vueltas (no se pulso lap ni hay auto-lap), saldra como un unico tramo.

Args: params: activity_id (str), response_format (markdown|json).

Returns: str: lista de splits con distancia_km, tiempo, ritmo (min/km) y FC media; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Las anotaciones ya indican que es solo lectura, idempotente y no destructiva. La descripción añade detalles sobre el comportamiento según la configuración de vueltas (auto-lap vs. manual) y el formato de retorno, sin contradecir las anotaciones. Esto da una transparencia completa.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

La descripción es concisa: un párrafo inicial con propósito y detalle conductual, seguido de 'Args' y 'Returns' en formato claro. No hay oraciones redundantes y la información esencial está al inicio. Muy bien estructurada.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Para una herramienta simple (1 parámetro requerido, opcional de formato), la descripción cubre el propósito, el comportamiento con auto-lap, el formato de retorno (lista de splits con campos) y errores. Aunque no se muestra el esquema de salida, la descripción lo especifica. Es completa para su complejidad.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

La cobertura de descripción del esquema es 0%, por lo que la descripción del tool debe compensar. Solo repite los nombres y tipos de los parámetros ('activity_id (str)', 'response_format (markdown|json)'), sin añadir significado más allá de lo que ya está en el esquema. No explica el valor por defecto ni ejemplos de uso, por lo que es solo marginalmente útil.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

El verbo 'Devuelve' seguido del recurso 'vueltas (laps) de una actividad' especifica claramente la acción y el objeto. La descripción distingue el propósito de otros hermanos (como 'garmin_get_activity') al enfocarse en parciales por km, y explica casos límite como auto-lap o ausencia de vueltas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

La frase 'Util para ver como dosifico un corredor' da una guía de uso en contexto. La nota sobre auto-lap ayuda a saber cuándo los datos serán por km. Sin embargo, no contrasta explícitamente con herramientas hermanas ni dice cuándo no usarla, aunque la especificidad lo hace útil.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_add_body_compositionA

Guarda en Garmin Connect una medicion de peso y composicion corporal.

Util si tu bascula no se sincroniza con ninguna app: le dictas los valores y quedan registrados en Garmin, donde luego los lee fitness_body_composition para ver la evolucion.

SEGURIDAD: por defecto NO escribe (dry_run=True): devuelve una previsualizacion. Llama con dry_run=False para guardarlo.

Args: params: weight_kg (obligatorio), date?, time?, body_fat_pct?, water_pct?, muscle_mass_kg?, bone_mass_kg?, visceral_fat?, bmi?, basal_met_kcal?, metabolic_age?, dry_run, response_format.

Returns: str: previsualizacion de lo que se guardaria, o confirmacion del registro; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses default dry_run safety behavior, which annotations do not provide. Notes it writes to Garmin. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Efficiently structured: purpose, context, safety, args list. Each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers use case, safety, relation to sibling, and return format. Adequate given rich schema and output description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already provides detailed parameter descriptions. Tool description lists params with optional markers but adds no new meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'Guarda' and resource 'medicion de peso y composicion corporal en Garmin Connect'. Distinguishes from siblings like fitness_body_composition (read) by stating its write function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit use case: when scale doesn't sync. Mentions safety dry_run but lacks explicit when-not-to-use or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_daily_readinessA
Read-onlyIdempotent

Resume la recuperacion de un dia: training readiness, HRV, sueño, FC reposo, estres y Body Battery. La herramienta clave para decidir si empujar o descansar.

Args: params: date (YYYY-MM-DD), response_format (markdown|json).

Returns: str: dict con readiness_score, fc_reposo, estres_medio, body_battery_min/max, sueño_score, sueño_horas, hrv_media_noche; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and destructiveHint=false. Description adds detailed return fields (readiness_score, fc_reposo, etc.) and context about the data source (Garmin daily readiness). No contradictions; adds value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise with a brief introductory sentence followed by structured Args and Returns sections. No unnecessary words, though the Args section could be integrated into the prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the tool's purpose, required input (date), output format options, and lists return fields. It is complete for a read-only tool with output schema (though output schema not shown). Error handling is minimally mentioned ('Error: ...').

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (tool description does not document parameters beyond what schema provides). However, the description does mention date format and response_format options, repeating schema info without adding new semantics. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it summarizes daily recovery metrics (training readiness, HRV, sleep, etc.) using specific verbs like 'Resume la recuperacion de un dia'. It distinguishes from sibling tools like garmin_sleep or garmin_hrv by being a comprehensive daily readiness summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage ('La herramienta clave para decidir si empujar o descansar') but does not explicitly state when to avoid or mention alternative tools among the 21 siblings, such as garmin_training_status or fitness_recovery_vs_training.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_delete_workoutA
DestructiveIdempotent

Borra un entreno guardado de tu biblioteca de Garmin.

SEGURIDAD: requiere confirm=True. Sin confirmacion no borra nada.

Args: params: workout_id (str), confirm (bool), response_format (markdown|json).

Returns: str: confirmacion de borrado o aviso de que falta confirmar; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true. The description adds the behavior that deletion only occurs when confirm=True, and that without confirmation it returns a warning. This goes beyond the annotations by specifying the safety mechanism.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief and includes sections (main, SEGURIDAD, Args, Returns). It is not overly verbose, though the Args section could be omitted as the schema already defines parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the return type (confirmation or error message) and the safety confirmation. For a simple delete tool, this is adequate. It could mention error cases (e.g., workout_id not found) but the given information suffices.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% per context (though schema has descriptions), so baseline is 3. The description merely lists parameter names and types without adding semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the verb 'Borra' (delete) and the resource 'entreno guardado de tu biblioteca de Garmin', clearly distinguishing it from sibling tools like garmin_list_workouts (list) and garmin_schedule_workout (create).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description highlights a critical safety guideline: 'requiere confirm=True. Sin confirmacion no borra nada.' It implicitly tells when to use (delete) but does not provide explicit exclusions or alternatives. However, the context of sibling tools makes the usage clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_fitness_metricsB
Read-onlyIdempotent

VO2max (correr y ciclismo) y edad fitness de Garmin.

Args: params: date? (YYYY-MM-DD, por defecto hoy), response_format (markdown|json).

Returns: str: vo2max_running, vo2max_cycling y edad_fitness; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate safety. However, it adds no additional behavioral details like data source, syncing requirements, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the metric names. It includes an args section and returns section, making it well-structured. However, it could be slightly more concise by avoiding repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the annotations and existing output schema, the description is adequate but lacks contextual details such as that data comes from Garmin Connect, potential latency, or conditions for missing data. It does not fully explain parameter behavior beyond basic syntax.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description reiterates the parameters (date and response_format) with brief explanations, but these are already covered by the input schema (defaults, patterns, enum). With 0% schema description coverage, the description adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's output: VO2max for running and cycling, and fitness age from Garmin. It distinguishes among siblings by specifying unique metrics, though it lacks an explicit verb like 'get' or 'retrieve'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, such as other Garmin metric tools (e.g., garmin_hrv, garmin_sleep). The description does not provide context or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_get_activitiesA
Read-onlyIdempotent

Lista las ultimas actividades registradas con sus metricas resumidas.

Args: params: limit (1-50), response_format (markdown|json).

Returns: str: lista con id, nombre, tipo, fecha, distancia_m, duracion_s, fc_media, potencia_media_w; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds that it returns a string with a list of activities or an error, and explains the response format parameter. However, it does not disclose ordering (likely most recent first) or any potential pagination/rate limits. Contributes some value beyond annotations but is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, using a clear docstring format with Args and Returns sections. Every sentence adds essential information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with two parameters and annotations providing safety clues, the description is fairly complete. It explains the purpose, parameters, and return format. However, it lacks mention of ordering (likely most recent first) and any default behavior, which would improve completeness. An output schema exists but is not shown; the description states return type as string, which is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explicitly lists the arguments: limit (1-50) and response_format (markdown|json), adding constraints and enum values. This clarifies the parameters beyond the schema. Could mention defaults (limit=10, response_format=markdown) which are in schema but not in description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool lists the latest registered activities with summarized metrics. It specifies the verb (list), resource (activities), and scope (summarized metrics). This distinguishes it from siblings like garmin_get_activity, which retrieves a single activity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives. The description implies it's for listing recent activities, but does not mention when not to use it or provide alternative tool suggestions. The sibling tools are varied, so more context would help an AI agent decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_get_activityA
Read-onlyIdempotent

Devuelve el detalle de una actividad concreta de Garmin.

Args: params: activity_id (str), response_format (markdown|json).

Returns: str: metricas clave (distancia, duracion, desnivel, FC media/max, potencia, calorias, VO2max, training effect); o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, indicating a safe read operation. The description adds minimal behavioral context (e.g., possible error format) but does not disclose rate limits, data freshness, or permissions. Since annotations are rich, the description adds only marginal value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a clear docstring structure (Args/Returns). It is front-loaded with the core purpose and uses minimal sentences without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one required parameter and an output schema, the description provides a sufficiently complete overview of inputs and outputs. However, it does not mention the language (Spanish) which might confuse non-Spanish agents, and it omits handling of optional parameters beyond the default.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for parameters, so the description must compensate. It lists activity_id and response_format with valid values (markdown|json) and explains returned metrics (distancia, duracion, etc.). This adds meaningful context beyond the schema, though the description could be more explicit about the enum values for response_format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns details of a specific Garmin activity, using a specific verb and resource. It distinguishes from sibling tools like garmin_get_activities (which lists activities) by focusing on a concrete activity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you have a specific activity_id, but it does not explicitly state when to use this versus alternatives like garmin_get_activities or garmin_activity_splits. No when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_hrvA
Read-onlyIdempotent

Variabilidad de la frecuencia cardiaca (HRV) de la noche indicada.

Args: params: date (YYYY-MM-DD), response_format (markdown|json).

Returns: str: dict con media de la ultima noche, media semanal, estado (balanced/ unbalanced/low) y rango base; o aviso si el dispositivo no reporta HRV.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, idempotentHint=true, etc. Description adds valuable context: return includes weekly average, status, and base range, plus warning if device lacks HRV data. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise: one-liner purpose plus structured Args/Returns block. Every sentence is informative with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, annotations, and output schema, the description covers return structure, failure mode, and parameter details adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but description explains date format (YYYY-MM-DD) and response_format options, adding meaning beyond the schema's regex and enum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves HRV data for a specified night, with parameter details and return structure. It distinguishes from sibling tools like garmin_sleep or garmin_hr_zones by focusing on HRV.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (for HRV data), but no explicit guidance on when to use this vs. alternatives like garmin_hr_zones or garmin_daily_readiness. No exclusions or context provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_hr_zonesA
Read-onlyIdempotent

Estima tus zonas de frecuencia cardiaca (Z1-Z5) a partir de tus datos.

Determina la FC maxima por prioridad: max_hr (si lo das) > mayor FC max observada en tus ultimas actividades > formula de Tanaka (208 - 0.7*edad). Usa la FC de reposo de Garmin. Calcula las zonas por Karvonen (FC reserva) o por %FCmax.

OJO e-bike: con bici electrica cuesta llegar a la FC maxima real, asi que la estimacion observada puede quedarse corta. Un test de campo o dar tu max_hr real da mejores zonas. Esta tool NO escribe en Garmin: las zonas se configuran a mano en Garmin Connect (Ajustes de usuario > Zonas de FC).

Args: params: max_hr?, age?, scan_activities (1-100), method (karvonen|hrmax), response_format (markdown|json).

Returns: str: FCmax y FC reposo usadas, metodo, fuente de la FCmax, y la tabla de zonas Z1-Z5 con su rango en ppm; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds substantial behavioral details: max HR derivation priority, use of Karvonen or %FCmax, e-bike caveat, and explicit statement that it does not write to Garmin. These go beyond annotations, though the description could mention that it may need recent activity data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, then algorithm, caveats, usage note, and finally args/returns. Every sentence provides useful information; no redundancy. Front-loaded with the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (multiple methods, fallbacks, caveats), the description covers all necessary aspects: algorithm, parameter roles, return format, and important notes (no writing to Garmin). Combined with rich schema descriptions and annotations, it is complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Each parameter has a description in the input schema (e.g., age: 'Edad, para estimar FCmax...'). The tool description repeats some but also explains the overall algorithm, giving context (e.g., why max_hr is optional and how it influences the calculation). This adds value beyond the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Estima tus zonas de frecuencia cardiaca (Z1-Z5)', specifying the action (estimates) and resource (HR zones). It distinguishes from siblings like garmin_pace_zones (pace zones) and explicitly notes it does not write to Garmin, setting it apart from write tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the algorithm and caveats (e.g., e-bike limitation) and notes the tool is read-only. However, it does not explicitly mention when to use this tool over other Garmin tools, though the context makes it clear this is the only HR zone estimator.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_list_workoutsA
Read-onlyIdempotent

Lista los entrenos guardados en tu biblioteca de Garmin (con su id).

Util para obtener el workout_id que necesitan garmin_schedule_workout (reprogramar) o garmin_delete_workout.

Args: params: limit (1-100), response_format (markdown|json).

Returns: str: lista con id, nombre, deporte y duracion_s; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. Description adds no additional behavioral traits beyond listing workouts, so it does not significantly improve transparency beyond what annotations already provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise: one sentence for purpose, one sentence for usage context, then clear Args and Returns sections. No wasted words, front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage context, parameters, and return format adequately. Lacks details on ordering or error messages beyond a generic 'Error: ...', but annotations and output schema (present per context) likely fill gaps. Minor omission of pagination behavior, but limit parameter implies a capped list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite schema description coverage being 0% (per context), the description explicitly lists parameters with their valid ranges (limit 1-100) and options (response_format markdown or json), fully compensating for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Describes clearly that the tool lists saved workouts with their IDs, and mentions its utility for obtaining workout_id for scheduling or deletion. Distinguishes from sibling tools by specifying the resource (saved workouts) and linking to specific dependent tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool (to get workout_id for schedule or delete), providing clear usage context. Does not mention when not to use or alternatives, but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_pace_zonesA
Read-onlyIdempotent

Estima las zonas de ritmo de carrera (Z1-Z5) a partir del ritmo umbral.

Si das threshold_pace lo usa; si no, intenta leer tu umbral de lactato de Garmin. Las zonas se calculan como multiplos del ritmo umbral (modelo clasico de 5 zonas).

Args: params: threshold_pace? ('M:SS'/km), response_format (markdown|json).

Returns: str: ritmo umbral usado y la tabla de zonas Z1-Z5 con su rango de ritmo (min/km); o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, indicating a safe read operation. The description adds behavioral context: it calculates zones using the classic 5-zone model based on threshold pace, and returns the threshold used and zone ranges. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with purpose, and includes parameter hints and return info. It is efficiently structured with minimal waste, though slightly verbose with the 'Args:' and 'Returns:' formatting.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the richness of annotations and input schema, the description adequately covers the tool's purpose, parameters, and return value. It explains the fallback behavior and output format, making it complete for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for parameters (threshold_pace format and default behavior, response_format enum). The tool description repeats this info and adds a brief summary. Since schema coverage is good, the description adds marginal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: estimating running pace zones (Z1-Z5) from threshold pace. It specifies that it uses provided threshold_pace or reads from Garmin lactate threshold, effectively differentiating from sibling tools like garmin_hr_zones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool: provide threshold_pace or omit to auto-fetch from Garmin. It does not explicitly mention when not to use or compare with alternatives, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_personal_recordsB
Read-onlyIdempotent

Lista tus records personales de Garmin (mejores marcas).

Args: params: response_format (markdown|json).

Returns: str: lista de records con tipo, valor y fecha; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the tool's safety and side-effect profile. The description adds minimal behavioral context—mentioning return format (markdown or json) and error output—but does not expand beyond what annotations imply. With strong annotation coverage, a score of 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, front-loading the purpose. The Args/Returns section provides additional structure, though the formatting is slightly informal. Overall, it is efficient without unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that annotations cover safety and idempotency, and an output schema exists, the description is fairly complete. It specifies the return content ('lista de records con tipo, valor y fecha') and format options. However, it could be more explicit about the exact types of personal records included.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description only clarifies the response_format parameter by listing its allowed values ('markdown|json'), which are already defined as an enum in the schema. It does not describe the inner structure of the 'params' object or provide any additional semantics beyond the schema. This is insufficient compensation for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: listing personal records from Garmin ('mejores marcas'). The verb 'Lista' is specific, and the resource 'records personales de Garmin' distinguishes it from sibling tools like garmin_race_predictions or garmin_get_activities, though it could be more precise about the types of records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description does not mention scenarios, prerequisites, or compare with sibling tools such as garmin_get_activities or garmin_race_predictions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_race_predictionsA
Read-onlyIdempotent

Predicciones de tiempo de Garmin para 5K, 10K, media maraton y maraton.

Args: params: response_format (markdown|json).

Returns: str: tiempos estimados por distancia; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, openWorldHint=true, idempotentHint=true. The description adds relevant behavioral context by specifying the return format (markdown/json) and the possibility of an error string, which is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two sentences plus args section) and front-loaded with the key purpose. However, it could be slightly better structured (e.g., bullet points for distances) but remains efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, clear annotations, and output schema), the description adequately covers the necessary context: distance types, return format, and error handling. It is complete for its complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already defines the 'response_format' parameter with an enum and a description ('markdown o json'). The tool description merely repeats this information without adding further semantic value beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Predicciones de tiempo de Garmin para 5K, 10K, media maraton y maraton', which clearly communicates the specific verb (predicciones) and resource (tiempo) for distinct distances, making it easily distinguishable from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like garmin_personal_records or garmin_fitness_metrics. The description implies usage through the name but lacks explicit context or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_schedule_workoutA

Crea un entreno estructurado y lo programa en una fecha del calendario de Garmin.

SEGURIDAD: por defecto NO escribe (dry_run=True): devuelve una previsualizacion. Para crear y programar de verdad, hay que llamar con dry_run=False.

Cada paso tiene un tipo (warmup/interval/recovery/cooldown/rest), una duracion en minutos y un objetivo opcional:

  • ciclismo: ZONA DE FC (hr_zone 1-5) o rango de FC (hr_min/hr_max) o potencia.

  • correr (sport='running'): RITMO en 'M:SS' por km (pace_fast/pace_slow), o zona/rango de FC.

Args: params: date (YYYY-MM-DD), sport (por defecto cycling), name, steps[], description?, dry_run, response_format (markdown|json).

Returns: str: en dry_run, la previsualizacion (pasos + duracion estimada). Si se ejecuta de verdad, el workout_id creado y la confirmacion de programacion; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

La descripción revela comportamientos clave más allá de las anotaciones: que por defecto es dry_run (no escribe) y que para crear realmente se debe pasar dry_run=False. También especifica lo que devuelve en cada caso (previsualización vs. workout_id). No contradice las anotaciones.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

La descripción es concisa y bien estructurada: encabezado con la acción principal, luego advertencia de seguridad, luego detalles de pasos y argumentos, y finalmente lo que retorna. Cada frase aporta información útil sin redundancia.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Para un herramienta compleja con pasos anidados y objetivos opcionales, la descripción cubre todos los aspectos: cómo definir pasos, objetivos por deporte, formato de fecha, parámetros de salida (preview vs. confirmación). Con el esquema y la salida existentes, es completa para que un agente la use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Aunque el esquema tiene descripciones detalladas de los parámetros (la cobertura es alta), la descripción agrega valor al explicar los objetivos deportivos específicos (FC, ritmo, potencia) y la seguridad del dry_run. La descripción compensa la dependencia del esquema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

La descripción comienza con una acción específica: 'Crea un entreno estructurado y lo programa en una fecha del calendario de Garmin'. Esto distingue claramente el propósito de otros hermanos como garmin_list_workouts (listar) o garmin_delete_workout (eliminar). El verbo y el recurso están bien definidos.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

La descripción incluye una advertencia de seguridad sobre el dry_run, explicando cuándo usar dry_run=False para escribir realmente. También detalla los pasos y objetivos por deporte. Sin embargo, no menciona alternativas entre los hermanos ni cuándo no usar esta herramienta.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_sleepA
Read-onlyIdempotent

Desglose del sueño de una noche: fases, duracion total y puntuacion.

Args: params: date (YYYY-MM-DD), response_format (markdown|json).

Returns: str: dict con horas totales, fases (profundo/ligero/rem/despierto en horas), score y FC/respiracion media si estan disponibles; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, indicating safe, non-destructive behavior. The description adds transparency by detailing the output structure (hours total, phases, score, optional heart rate/respiration) and mentions error handling with 'Error: ...'. This goes beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a one-line purpose followed by clear Args and Returns sections. Every sentence adds value, no redundancy. Front-loaded with the core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (single date, sleep data), the description covers output structure and error cases. Although an output schema exists, the description explains the return values adequately. It could mention behavior for missing data or date ranges, but overall it is complete for the intended use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite the schema having parameter descriptions, the context notes 0% schema description coverage, so the description must compensate. It explicitly lists the parameters: date (YYYY-MM-DD) and response_format (markdown|json), matching the schema and clarifying their types. The return description further enriches understanding of how parameters affect output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides a breakdown of a night's sleep including phases, total duration, and score. The title 'Desglose de sueño (Garmin)' reinforces this. The sibling tools are distinct (readiness, activities, HRV, etc.), so there is no confusion about its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates it is for querying sleep data for a single night, but it does not explicitly state when to use this tool versus alternatives like garmin_daily_readiness or fitness_daily_brief that may also include sleep metrics. No exclusion criteria or context switching guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_training_statusA
Read-onlyIdempotent

Estado de entrenamiento, carga aguda/cronica, VO2max y endurance score.

Reune training status (estado, carga aguda, ratio agudo/cronico), VO2max y, si estan disponibles, endurance score y hill score.

Args: params: date? (YYYY-MM-DD, por defecto hoy), response_format (markdown|json).

Returns: str: dict con estado de entrenamiento y metricas de carga; o "Error: ...".

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds that the tool returns a dict or error string but does not disclose any additional side effects, authorization needs, or rate limits beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two paragraphs with a concise first line listing metrics. It is front-loaded with the purpose and efficiently lists parameters. No unnecessary sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema (context signal), the description need not detail return structure. It covers the main function, parameters, and return type (str: dict or error). No missing elements for a simple data retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% coverage for the top-level 'params' parameter, but nested parameters (date, response_format) are described. The description repeats these parameter details (format, defaults) and adds context about their meaning, compensating for the schema's lack of top-level description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool gathers training status, acute/chronic load, VO2max, endurance score, and hill score. The verb 'reune' (gathers) specifies a read operation, and the list of metrics distinguishes the tool from siblings like garmin_fitness_metrics, though not explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus related tools like garmin_fitness_metrics or garmin_daily_readiness. It lacks any mention of conditions, prerequisites, or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 22 tool updatesv0.1.0
    • First observedfitness_body_composition
    • First observedfitness_daily_brief
    • First observedfitness_planned_vs_actual
    • First observedfitness_profile
    • First observedfitness_recovery_vs_training
    • First observedfitness_weekly_summary
    • First observedgarmin_activity_splits
    • First observedgarmin_add_body_composition
    • First observedgarmin_daily_readiness
    • First observedgarmin_delete_workout
    • First observedgarmin_fitness_metrics
    • First observedgarmin_get_activities
    • First observedgarmin_get_activity
    • First observedgarmin_hr_zones
    • First observedgarmin_hrv
    • First observedgarmin_list_workouts
    • First observedgarmin_pace_zones
    • First observedgarmin_personal_records
    • First observedgarmin_race_predictions
    • First observedgarmin_schedule_workout
    • First observedgarmin_sleep
    • First observedgarmin_training_status

TDQS

A3.7/5.0
Disambiguation4/5

Most tools target distinct metrics (readiness, sleep, HRV, zones, activities, workouts, body composition), but there is minor overlap between garmin_fitness_metrics and garmin_training_status (both include VO2max) and between fitness_weekly_summary and fitness_recovery_vs_training. Descriptions are detailed enough to guide selection.

Naming Consistency3/5

Naming mixes prefixes 'garmin_' and 'fitness_' with inconsistent patterns: nouns ('garmin_sleep'), verb_noun ('garmin_get_activities'), and multi-word descriptors ('fitness_recovery_vs_training'). No uniform convention, but still readable.

Tool Count4/5

22 tools is on the higher side for a single server, but each serves a distinct purpose within the fitness/health domain. The count is justifiable given the comprehensive coverage of data retrieval, analysis, and workout management.

Completeness4/5

The tool surface covers data retrieval, workout scheduling, and analysis, with CRUD for workouts. Minor gaps: no manual input tools for sleep or HRV, and activities are read-only. However, core training and recovery workflows are well-supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that connects Garmin Connect data to Claude, enabling training analysis, recovery checks, and personalized plans based on real metrics like HRV, training load, and activities.
    15
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A local, read-only MCP server that allows Claude Desktop to access Garmin Connect data such as activities and recovery metrics, enabling AI-assisted running plan creation and adjustment.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    A local, single-user, read-only MCP server that gives Claude Code access to your Garmin health and training data, exposing tools for health snapshots, training status, run details, body metrics, and training analysis.
    1
    MIT

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/bynoe17/DkwtMCP'

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