TrainBud
Habla con tus datos de entrenamiento de Garmin Connect. 14 herramientas que cubren actividades, sueño, frecuencia cardíaca, recuperación, composición corporal, estrés y VO2 máx, más una capa de memoria para metas y carreras. Los hallazgos se calculan contra tus propias líneas base de 28 días mediante detectores en código, no generados por el modelo. Se ejecuta localmente: credenciales en un .env local, caché SQLite en tu máquina, sin cuenta y sin servicio alojado. Incluye una aplicación opcional para reloj Connect IQ.
Documentación
TrainBud
Habla con tus datos de entrenamiento.
TrainBud es un servidor MCP de código abierto que conecta tus datos de fitness de Garmin Connect con Claude, Cursor y otros asistentes de IA. Pregunta sobre entrenamientos, sueño, frecuencia cardíaca, recuperación y composición corporal en lenguaje natural — de forma privada, en tu máquina.
Aviso: TrainBud es un proyecto comunitario no oficial. No está afiliado, respaldado ni patrocinado por Garmin Ltd. Garmin Connect es una marca comercial de Garmin Ltd.
Pruébalo
Una vez conectado a tu cliente MCP, haz preguntas como:
- "¿Qué hice hoy?"
- "¿Cómo ha sido mi sueño esta semana?"
- "¿Estoy lo suficientemente recuperado para entrenar fuerte mañana?"
- "¿Mi frecuencia cardíaca en reposo está bajando?"
Consulta examples/prompts.md para más ideas.
Por qué TrainBud
- Privado — las credenciales permanecen en tu
.envlocal; los datos se almacenan en caché en tu máquina - Local primero — caché SQLite, tokens de sesión en
.trainbud/ - Funciona en todas partes — Windows, macOS, Linux (Node.js 20+)
- Cualquier cliente MCP — Claude Desktop, Cursor y otros clientes compatibles con stdio
- Obtención inteligente — llamadas API por lotes y re-autenticación automática cuando las sesiones expiran
Inicio rápido
npx trainbud setup
El asistente de configuración te guía a través de las credenciales, la autenticación y la conexión de Cursor o Claude Desktop — sin necesidad de editar la configuración de MCP. Luego reinicia tu cliente MCP y pregúntale qué hiciste hoy.
Para mantener trainbud en tu PATH en lugar de escribir npx cada vez:
npm install -g trainbud
trainbud setup
Requiere Node 22+. Guía completa: QUICKSTART.md
Desde el código fuente (para colaboradores, o para ejecutar una versión no publicada)
git clone https://github.com/Zsadigzade/trainbud.git
cd trainbud
npm install
npm run build
npm link # puts `trainbud` on your PATH; undo with `npm unlink -g trainbud`
trainbud setup
Sin npm link, cada trainbud <command> en este README es
node dist/index.js <command> ejecutado desde la raíz del repositorio. Si dist/ aún no existe,
ejecuta npm run build primero.
Plugin de Claude Code (recomendado)
Instálalo como un plugin de Claude Code — habilidades y servidor MCP en un solo paso:
/plugin marketplace add Zsadigzade/trainbud
/plugin install trainbud@trainbud
Configura las credenciales y luego reinicia Claude Code:
export GARMIN_EMAIL="your@email.com"
export GARMIN_PASSWORD="yourpassword"
| Comando | Qué hace |
|---|---|
/trainbud:trainbud-setup | Configuración inicial y diagnósticos |
/trainbud:trainbud | Pregunta sobre entrenamientos, sueño, recuperación, FC, estrés, VO2 máx. |
Los archivos del plugin están en plugin/. Consulta plugin/README.md.
Habilidades de Claude Code (en el repositorio)
Este repositorio también incluye habilidades de proyecto en .claude/skills/ para desarrollo sin instalar el plugin:
| Comando | Qué hace |
|---|---|
/trainbud-setup | Instalar, autenticar, configurar MCP, ejecutar verificación en vivo |
/trainbud | Pregunta sobre entrenamientos, sueño, recuperación, FC, estrés, VO2 máx. |
Abre el repositorio en Claude Code (claude en este directorio) — las habilidades se cargan automáticamente.
Para usar las habilidades en cualquier proyecto sin el plugin, cópialas a ~/.claude/skills/.
Después de la configuración, reinicia tu cliente MCP y prueba /trainbud con "¿Qué hice hoy?"
Panel de control
trainbud serve aloja un panel de control en /dashboard. Está diseñado primero para teléfonos, porque el
flujo de emparejamiento es: estás junto al reloj sosteniendo un teléfono cuando apruebas un
código.
Muestra lo que destaca hoy en comparación con tus propios valores de referencia, esta semana frente a la anterior, y la frecuencia cardíaca en reposo y el sueño trazados frente a tu propia mediana de 30 días — todo leído desde el almacén de historial local, por lo que se muestra al instante y funciona incluso cuando tu sesión de Connect ha expirado. Una interrupción en una línea es un día sin medición, no un cero.
También es donde le dices a TrainBud con quién está hablando:
| Configuración | Qué cambia |
|---|---|
| Nombre, unidades, deporte principal, objetivo semanal | Cada renderizador, y lo que se le dice a la IA sobre ti |
| Umbrales | Dónde el verde se vuelve ámbar y el ámbar se vuelve rojo — también en el reloj |
| Tarjetas del reloj | Qué tarjetas aparecen en la muñeca y en qué orden, en vivo en la próxima sincronización |
| Modelo de IA, tono, longitud de respuesta | Cómo suenan la tarjeta de Preguntar y la información diaria |
| Tus propias preguntas de Preguntar | Hasta cinco, de 32 caracteres cada una. Encabezan el menú de Preguntar del reloj; el resto de las ranuras se generan a partir de lo que se activó |
| Límite de gasto mensual | Opcional. Rechaza una Pregunta más allá del límite en lugar de gastar más allá de él |
| Privacidad | Contadores de funciones locales, activados por defecto, con un botón de eliminar |
Uso. TrainBud funciona con tu propia clave de proveedor de IA, por lo que cada pregunta y cada información diaria se te cobra a ti. El panel de control muestra los tokens y el costo por llamada, el mes hasta la fecha y un gráfico de 30 días. Un modelo para el que esta compilación no tiene un precio publicado se registra con su costo marcado como desconocido en lugar de cero — una llamada con precio cero haría que un límite que nunca puede activarse.
Nada en esta página sale de tu máquina. No hay ningún endpoint al que enviarlo.
Widget para reloj Garmin (Connect IQ)
Consulta recuperación, sueño, actividad, estrés y VO2 máx. en tu reloj Garmin mediante un widget Connect IQ en ciq/.
Requiere: trainbud serve en ejecución + túnel HTTPS (misma configuración que la IA web).
- Inicia el servidor y el túnel:
trainbud serve cloudflared tunnel --url http://127.0.0.1:3847 - Compila y carga el widget — consulta ciq/README.md
- En Garmin Connect Mobile → Connect IQ → configuración de TrainBud, establece:
- URL del servidor — tu URL de túnel (p. ej.,
https://abc.trycloudflare.com)
- URL del servidor — tu URL de túnel (p. ej.,
- Abre el widget en tu reloj — muestra un código de emparejamiento. Apruébalo en el panel de control (
/dashboard?token=YOUR_API_KEY) para completar la configuración. El panel de control intercambia ese token por una cookie de sesión y lo elimina de la URL, por lo que la barra de direcciones es segura para capturas de pantalla después.
La vista rápida muestra recuperación y sueño del último resumen en caché, por lo que se renderiza sin
esperar la red. Ábrelo y toca o desliza para recorrer las tarjetas que dejaste activadas en el panel de control. El reloj
llama a GET /api/watch — un resumen JSON compacto, no el protocolo MCP completo.
Conectar a Claude Desktop
Edita claude_desktop_config.json:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"trainbud": {
"command": "node",
"args": ["C:/path/to/trainbud/dist/index.js", "start"],
"env": {
"GARMIN_EMAIL": "your@email.com",
"GARMIN_PASSWORD": "yourpassword"
}
}
}
}
Con trainbud en tu PATH (npm install -g trainbud, o npm link desde un clon),
apunta el cliente al comando en lugar de a una ruta:
{
"mcpServers": {
"trainbud": {
"command": "trainbud",
"args": ["start"]
}
}
}
Reinicia tu cliente MCP y comienza a hacer preguntas.
Herramientas
| Herramienta | Qué responde |
|---|---|
get_latest_activity | Tu entrenamiento más reciente — distancia, ritmo, FC, elevación |
get_activities_range | Actividades entre dos fechas |
get_sleep_data | Duración del sueño, etapas, puntuación, despertares |
get_heart_rate_trends | FC en reposo, máxima y promedio a lo largo del tiempo |
get_recovery_status | Puntuación de recuperación a partir de VFC, sueño, estrés, FC en reposo |
get_body_composition | Tendencias de peso, grasa corporal y masa muscular |
get_stress_levels | Promedios y tendencias de estrés diario |
get_vo2_max_trends | Tendencias de condición física de VO2 máx. a lo largo del tiempo |
get_training_insights | Resumen semanal combinado (actividades, sueño, recuperación, estrés) |
get_findings | Lo que destaca frente a tus propios valores de referencia de 28 días, no un promedio de la población |
get_week_review | Esta semana frente a la anterior, el pronóstico de carga, la deuda de sueño y tu próxima carrera |
compare_workouts | Un entrenamiento frente a tus propios esfuerzos anteriores del mismo tipo y distancia |
remember_context | Registrar un objetivo, una carrera y su fecha, una lesión o una nota |
get_user_context | Lo que está registrado sobre ti, en cualquier fecha |
log_subjective | Cómo se sintió realmente una sesión — RPE, dolor muscular, estado de ánimo |
CLI
trainbud setup # Interactive first-time setup (recommended)
trainbud serve # Remote HTTP MCP for web AI (claude.ai, ChatGPT)
trainbud check # Live diagnostics against all tools
trainbud doctor # What the watch would see: public URL, AI key, history depth
trainbud backfill # Pull Garmin history into the local store (resumable)
trainbud findings # What stands out against your own baselines
trainbud start # Start the MCP server (stdio)
trainbud auth # Force re-authentication
trainbud cache clear # Clear cached data
trainbud devices # List paired watches
trainbud devices revoke <id> # Take one watch's access away
trainbud status # Show session and cache status
trainbud --version # Print version
Cada uno de estos también funciona como npx trainbud <command> sin instalar nada.
Solución de problemas: trainbud: command not found
Usa npx trainbud <command>, o instálalo globalmente con
npm install -g trainbud. ¿Ejecutando desde un clon? Ejecuta npm link una vez desde la
raíz del repositorio, o llama al punto de entrada compilado directamente con node dist/index.js doctor
(después de npm run build).
Configuración
| Variable | Predeterminado | Descripción |
|---|---|---|
GARMIN_EMAIL | — | Correo electrónico de Garmin Connect |
GARMIN_PASSWORD | — | Contraseña de Garmin Connect |
TRAINBUD_SESSION_PATH | .trainbud/session.json | Almacenamiento de tokens de sesión |
TRAINBUD_LOG_PATH | .trainbud/mcp.log | Ruta del archivo de registro |
TRAINBUD_CACHE_PATH | .trainbud/cache.db | Base de datos de caché SQLite |
CACHE_TTL_ACTIVITIES | 1800 | TTL de caché de actividades (segundos) |
CACHE_TTL_SLEEP | 7200 | TTL de caché de sueño (segundos) |
CACHE_TTL_STATS | 3600 | TTL de caché de estadísticas (segundos) |
TRAINBUD_API_KEY | generado automáticamente | Token Bearer para MCP HTTP (trainbud serve) |
TRAINBUD_HOST | 127.0.0.1 | Host de enlace para servidor HTTP |
TRAINBUD_PORT | 3847 | Puerto de enlace para servidor HTTP |
Seguridad y privacidad
- Las credenciales viven solo en tu archivo
.envlocal — nunca se envían a un tercero - Los tokens de sesión en
.trainbud/session.jsonson tan sensibles como una contraseña - Los errores de herramientas se sanitizan antes de llegar al cliente de IA
- Usa el paquete npm no oficial
garmin-connect(no la API OAuth empresarial de Garmin) - MFA no es compatible con la biblioteca subyacente — desactiva MFA o usa una contraseña específica de aplicación
- El servidor se enlaza a
127.0.0.1por defecto. Solo es accesible desde internet si apuntas un túnel hacia él, y cada ruta excepto/healthnecesita la clave API - El panel de control toma la clave una vez, en
/dashboard?token=…, luego la intercambia por una cookie de sesiónHttpOnlyy redirige a una URL limpia — para que la clave no quede en tu barra de direcciones, tu historial o una captura de pantalla - Un reloj emparejado tiene un token limitado a ese reloj, creado en el emparejamiento y almacenado
en el servidor como un hash SHA-256.
trainbud deviceslos lista,trainbud devices revoke <id>takes one away — without logging out the dashboard,/mcp, o tus otros relojes. Un reloj emparejado antes de 0.5.2 tiene la clave API en sí; vuelve a emparejarlo para intercambiarla por un token limitado - Cada respuesta lleva
Content-Security-Policy,X-Content-Type-Options,X-Frame-OptionsyReferrer-Policy, incluidos los 401. HSTS se envía solo en una solicitud que realmente llegó a través de TLS, para que el panel de control de bucle local siga siendo accesible
Lo que TrainBud no es
- No es un servicio alojado. No hay cuenta de TrainBud ni servidor de TrainBud. Tú lo ejecutas, en tu máquina, con tus propias credenciales de Garmin
- No es una integración oficial de Garmin. Impulsa una biblioteca no oficial contra la API web de Connect. Garmin puede cambiar esa API sin previo aviso, y lo hace
- No es compatible con MFA. Si tu cuenta de Connect tiene MFA activado, esto no iniciará sesión
- No es gratis para preguntar. Las funciones de IA funcionan con tu propia clave de Anthropic y se te facturan. El panel de control mide cada llamada y puede rechazar más allá de un límite que establezcas
Solución de problemas
| Problema | Solución |
|---|---|
| Fallo de autenticación | Verifica las credenciales de .env, ejecuta trainbud auth |
| MFA activado en la cuenta | Desactiva MFA o usa una contraseña específica de aplicación |
| Datos desactualizados | Ejecuta trainbud cache clear |
| Límite de velocidad | Espera 60 segundos; se usan respuestas en caché cuando están disponibles |
| El reloj muestra "No es un servidor TrainBud" o error -400 | Tu URL pública está respondiendo con algo que no es el JSON de TrainBud — generalmente un túnel caído. Ejecuta trainbud doctor; dice exactamente qué se recibió |
| El reloj muestra "Reloj no autorizado" | La clave API cambió desde que el reloj se emparejó. Vuelve a emparejarlo desde el panel de control |
| El reloj muestra "IA no configurada" | La IA es con tu propia clave. Pega una clave de Anthropic en el panel de control |
| Sin datos de sueño/FC | Asegúrate de que tu dispositivo Garmin se haya sincronizado con Garmin Connect |
| El servidor no inicia | Verifica que GARMIN_EMAIL y GARMIN_PASSWORD estén establecidos en .env |
Desarrollo
npm install
npm run build
npm test # 573 tests via the Node test runner
npm run lint
npm run dev # Start with auto-reload
Usa .nvmrc con nvm/fnm para Node 22. npm run test:coverage informa la cobertura a través del propio ejecutor de pruebas de Node, y npm run test:watch se vuelve a ejecutar al detectar cambios.
Consulta CONTRIBUTING.md y docs/VAULT.md para notas de arquitectura y diseño (bóveda de Obsidian, fuera de este repositorio).
Hoja de ruta
- Tendencias de VO2 máx
- Niveles de estrés
- Información sobre entrenamiento
- Comparación de entrenamientos
- Imagen de Docker
Licencia
MIT — consulta LICENSE.
Garmin Connect es una marca comercial de Garmin Ltd. Este proyecto no está afiliado con Garmin Ltd.