mcp-fitbod
Contenido
Descripción general · Instalación · Configuración · Herramientas · Autenticación · Hallazgos notables · Limitaciones · Arquitectura · Legal
Related MCP server: WHOOP MCP Server
Descripción general
mcp-fitbod sitúa una cuenta de Fitbod detrás de un único servidor MCP stdio, de modo que cualquier cliente MCP pueda trabajar directamente con tus datos de entrenamiento. Abarca diez servicios backend en lugar de un único endpoint:
Servicio | Qué contiene | Herramientas |
| rutinas, gimnasios, equipamiento, configuración del generador, perfil, historial de entrenamientos | 36 |
| series temporales de composición corporal, puntuación de fuerza, rachas, percentiles | 11 |
| el generador de entrenamientos, incluida una variante basada en LLM | 4 |
| sesiones de coaching con IA con memorias persistentes | 5 |
| directorio público de gimnasios y búsqueda de Places | 3 |
| backend de chat con IA | 1 |
| mensajes dentro de la aplicación, Strava, estado de la suscripción | 4 |
| inicio de sesión y acuñación de tokens por servicio | capa de autenticación |
La pieza más útil es pyserve. La mayoría de las integraciones escriben rutinas junto a la aplicación; esta llama al propio generador y recibe una sesión completa con selección de ejercicios, series, repeticiones, cargas y tiempos de descanso, y luego filtra el resultado según el equipamiento que realmente tienes y solicita reemplazos para cualquier cosa que no puedas realizar.
Aspectos destacados
Toda herramienta de escritura usa
dry_run=Truepor defecto y devuelve la carga útil exacta que enviaría, sin tocar la cuenta.Un corpus offline de aproximadamente 1.400 ejercicios hace que las búsquedas en el catálogo, el filtrado por gimnasio y el mapeo muscular no requieran llamadas de red.
build_routinevalida cada movimiento contra tu gimnasio antes de escribir, y elimina la rutina si falla parcialmente para que nada quede a medio crear.El análisis (tonelaje, volumen por músculo, 1RM estimado, levantamientos estancados) vive en funciones puras sin dependencia de red, probadas unitariamente con datos de prueba.
La acuñación de tokens, la renovación en
401, la limitación de velocidad, la paginación y los reintentos ante desafíos transitorios se manejan dentro del cliente.
Instalación
Requiere Python 3.10 o superior.
git clone https://github.com/Muno459/mcp-fitbod
cd mcp-fitbod
pip install -e ".[dev]"Autentícate una vez. El token de actualización dura aproximadamente un año, y solo ese token se persiste.
FITBOD_EMAIL='you@example.com' FITBOD_PASSWORD='...' python -m fitbod.authConstruye el corpus de ejercicios offline desde tu propia instalación de Fitbod. Extrae el APK y apunta el constructor a su directorio res/raw.
python build_reference.py --apk-res /path/to/fitbod/res/rawDescribe tu gimnasio para que las herramientas puedan filtrar los ejercicios realizables.
cp data/gym-profile.example.json data/gym-profile.json
$EDITOR data/gym-profile.jsonVerifica y luego ejecuta.
python -m pytest tests/ -q # offline: parsing and analysis
python smoke_test.py # live: every tool, writes are dry-run
python server.pyConfiguración
Registra el servidor con cualquier cliente MCP a través de stdio:
{
"mcpServers": {
"fitbod": {
"command": "python",
"args": ["/absolute/path/to/mcp-fitbod/server.py"]
}
}
}Variable | Propósito |
| Usado solo por |
| Usado solo por |
| Proporciona el token de actualización directamente en lugar del archivo de credenciales |
Las credenciales viven en .fitbod-credentials.json, legible por el propietario e ignorado por git. El archivo contiene el token de actualización y nada más. Tu contraseña nunca se escribe en disco ni se registra. Para revocar el acceso, cambia tu contraseña.
data/gym-profile.json mapea el equipamiento que tienes sobre los 78 tipos de equipamiento de Fitbod, incluidos los incrementos exactos de mancuernas y discos disponibles para ti, de modo que las cargas prescritas sean las que realmente puedes montar. Comienza con data/gym-profile.example.json y comprueba que tus nombres se resuelven con preview_inventory_mapping.
Herramientas
97 herramientas repartidas en doce módulos. Toda herramienta de escritura acepta dry_run.
Herramienta | Descripción |
| Entrenamientos registrados, primero los más recientes |
| Detalle completo de un entrenamiento, cada serie expandida |
| Cada serie registrada para un movimiento, con 1RM estimado |
| Series de trabajo y tonelaje por grupo muscular |
| Movimientos cuyo mejor 1RM estimado no ha mejorado |
| Totales, volumen por músculo y movimientos estancados en una sola llamada |
| Recuento total de entrenamientos mediante la agregación propia del servidor |
| Métricas corporales del perfil |
| Registra un entrenamiento completado en el historial |
| Edita un entrenamiento ya registrado en el historial |
El 1RM estimado usa la fórmula de Epley. Las series de calentamiento se excluyen de los recuentos de series de trabajo y del tonelaje. Una ventana vacía devuelve una note explicativa en lugar de un cero escueto.
Herramienta | Descripción |
| Pide al propio motor de Fitbod que genere una sesión |
| Genera y luego intercambia los ejercicios especificados |
| Pregunta de texto libre sobre un entrenamiento generado |
| La superficie del generador y sus restricciones conocidas |
Se pueden seleccionar tres motores: foundational_model, algo_direct_client y algo_llamabod. Los resultados se filtran posteriormente contra tu gimnasio, y cualquier cosa imposible se intercambia automáticamente mediante exercise_replacement.
Herramienta | Descripción |
| Gimnasios en la cuenta con recuentos de equipamiento |
| Equipamiento actualmente asociado a un gimnasio |
| Cómo se mapea tu inventario sobre los ids de equipamiento de Fitbod |
| Crea un gimnasio configurado desde tu inventario |
| Asocia o desasocia un tipo de equipamiento |
| Declara qué pesos específicos existen para un tipo |
| Aplica los incrementos registrados de mancuernas y discos |
| Elimina un gimnasio |
Herramienta | Descripción |
| Objetivo, división, experiencia, días por semana, superseries, calentamientos, duración |
| Bloques de entrenamiento y sus ejercicios de enfoque |
| Coeficientes por ejercicio que sesgan la selección |
Herramienta | Descripción |
| Crea una rutina completa en una sola llamada, con reversión |
| Lee plantillas guardadas |
| Ciclo de vida de la plantilla |
| Añade un ejercicio prescrito |
| Crea un contenedor de grupo de ejercicios |
| Define un movimiento que Fitbod no modela |
Herramienta | Descripción |
| Composición actual con historial completo por métrica |
| Masa magra y peso a lo largo del tiempo, con deltas |
| Puntuación por músculo frente a la población |
| Dónde se clasifica un levantamiento frente a los demás |
| Rachas, recuentos semanales, objetivos de volumen |
| El catálogo de métricas y sus ids numéricos |
| Escribe y elimina mediciones |
Hay una serie temporal completa disponible para peso, masa magra, masa grasa, grasa corporal, IMC, TMB y siete circunferencias, con datos de Apple Health o Health Connect.
Catálogo: find_exercises exercise_detail search_exercises_live
exercise_details_live list_equipment muscle_groups warm_start_lookup
onboarding_one_rep_maxes seed_one_rep_max api_surface gym_profile
Perfil: get_profile update_profile add_injury list_injuries
delete_injury rate_exercise list_exercise_ratings registered_devices
app_config selected_cardio add_selected_cardio remove_selected_cardio
selected_resistance_bands
Coach y chat: coach_ask coach_sessions coach_new_session
coach_memories coach_session_stats chat
Analíticas: exercise_analytics exercise_benchmarks workout_achievements
Otros servicios: service_health subscription_status list_blimps
dismiss_blimp strava_connection list_public_gyms public_gym_equipment
search_places
Nutrición: nutrition_targets todays_targets recalculate_targets
cut_progress
Vías de escape: raw_get y metros_raw_get, ambas de solo lectura con
validación de ruta.
Autenticación
Tres pasos, con cada microservicio acuñando su propio token de corta duración a partir de un único token de actualización de larga duración:
POST gate-keeper.fitbod.me/users/login {"user":{"email","password"}}
-> 201, refresh JWT in the Authorization RESPONSE header, exp about 1 year
POST <service>.fitbod.me/access_token {"refresh_token":"<raw jwt>"}
-> 201 {"access_token": ...}, aud=<service>.prod.fitbod.me, about 24h
Authorization: Bearer <access_token> -> https://<service>.fitbod.me/...El cliente almacena en caché los tokens de acceso durante 23 horas y los vuelve
a acuñar de forma transparente ante un 401. Nótese la inconsistencia entre
servicios: nautilus exige refresh_token en el cuerpo, mientras que prism,
blimp y metros también lo aceptan como cabecera.
Se requiere un User-Agent con forma de navegador, ya que los agentes bot
conocidos, como curl/*, son rechazados en el borde antes de que la solicitud
llegue al origen.
Hallazgos notables
Comportamiento que cuesta tiempo de verdad averiguar, documentado para que no haya que redescubrirlo.
Conviven dos regímenes de serialización. Los atributos JSON:API están en
snake_case, pero los documentos incrustados usan el nombre de la propiedad de
origen tal cual, salvo que una anotación explícita lo sobrescriba. Dentro de
individual_sets, isWarmup y restTime permanecen en camelCase, mientras que
_id, _created_at e is_amrap llevan sobrescrituras. Confundir ambos hace
que se pierdan silenciosamente todos los campos.
Algunos mapeos son imposibles de adivinar. workoutConfigId se serializa
como default_workout_config_id, circuitsEnabled como supersets_enabled, y
algorithmCoefficient como algorithm_coeffecient, mal escrito en el cable.
Las series registradas no usan el id del recurso. Hacen referencia a los
ejercicios mediante exercise_external_resource_id, que es un número distinto.
Leg Press es id=291 pero external_resource_id=218.
POST y PUT discrepan sobre los ids. POST workout_data rechaza cualquier
id (data.attributes.id should be type integer_id), mientras que
PUT workout_data/{id} exige que data.id coincida con la ruta.
Relaciones frente a atributos. gym_id y equipment_id son legibles pero
no escribibles. Crear una fila de gym_equipment requiere relaciones JSON:API,
no atributos.
Los valores de los enums son fijos y el orden importa.
FitnessGoal 0 GENERAL_FITNESS 1 STRENGTH_TRAINING 2 MUSCLE_TONE
3 BODYBUILDING 4 POWERLIFTING 5 OLYMPICWEIGHTLIFTING
MuscleSplit 0 FRESH_MUSCLE_GROUPS 1 UPPER_LOWER 2 FULL_BODY 3 PPL
ExperienceLevel 0 BEGINNER 1 INTERMEDIATE 2 EXPERT
WorkoutVariability 1 MORE_CONSISTENCY 3 SUGGESTED 5 MORE_VARIABILITY
StrengthAggregate push, pull, lower (there is no upper and no core)
ExerciseRating like, dislike, exclude (lowercase; uppercase returns 500)Peculiaridades del generador. algo_versions es obligatorio, pero todos sus
campos internos pueden ser null. Un user_equipment o
muscle_usages_from_client vacío devuelve un 500. exercise_replacement
necesita que se le devuelva el entrenamiento como current_workout, y todos los
ids de exercise_ids_to_replace deben aparecer en él. El generador no respeta
estrictamente user_equipment, así que aplica siempre un post-filtrado.
Las ráfagas se rechazan. Un 403 con cuerpo HTML es transitorio y se
resuelve en aproximadamente 10 a 30 segundos. El cliente lo reintenta en lugar
de mostrarlo como un error de autenticación, que es lo que parece a primera
vista.
Las duraciones se expresan en segundos. duration en un entrenamiento
registrado no está en minutos, algo fácil de pasar por alto hasta que una sesión
de 65 minutos se lee como 3908.
Limitaciones conocidas
Confirmado contra una cuenta suscrita con todas las formas de payload probadas:
Endpoint | Comportamiento |
|
|
|
|
|
|
Sesiones de coach | No se pueden eliminar ( |
No hay ninguna API de nutrición. Las herramientas de nutrición almacenan los objetivos localmente y los derivan de la composición corporal en vivo.
Arquitectura
server.py thin entrypoint, registers tool modules
fitbod/
client.py auth chain, rate limiting, retry, pagination
auth.py python -m fitbod.auth
schemas.py dataclass parsers for both serialisation regimes
analysis.py volume, stalled lifts, 1RM. Pure, network free
reference.py offline corpus, dual id index, gym filtering
tools/ read, catalogue, gym, config, program, profile,
metrics, generate, services, coach, extras, nutrition
tests/ offline tests over recorded fixtures
docs/
API-MAP.md 145 endpoints, 365 request and response models
SCHEMAS.md field level schemas with exact wire names
build_reference.py builds the offline corpus from an extracted APK
smoke_test.py exercises all 97 tools live, writes dry-run by defaultLas solicitudes se limitan en el cliente a 6 por segundo con una ráfaga de 10.
Eso es un presupuesto de cortesía, no un límite descubierto: 50 solicitudes
concurrentes sostuvieron unas 32 por segundo sin ningún 429 y sin cabeceras de
límite de tasa en ninguna respuesta. Hay margen si necesitas rendimiento.
El corpus de ejercicios se indexa mediante un índice dual, porque las series
registradas y las entradas del catálogo usan espacios de ids distintos.
reference.by_id() y reference.by_external_id() existen por esa razón.
Documentación
Archivo | Contenidos |
| La superficie completa: 145 declaraciones de endpoints en 12 interfaces, con 365 modelos de solicitud y respuesta resueltos transitivamente |
| Esquemas a nivel de campo con nombres exactos en el cable, tipos y banderas de obligatoriedad |
| Lo que sigue sin resolver, y por qué |
El catálogo de ejercicios
build_reference.py construye data/exercise-reference.json a partir del
directorio res/raw de un APK de Fitbod extraído: aproximadamente 1.400
ejercicios con instrucciones escritas, 78 tipos de equipamiento, asignaciones de
grupos musculares y tablas de peso del equipamiento. Ese contenido pertenece a
Fitbod, por lo que no se distribuye aquí. Constrúyelo desde tu propia
instalación.
Aspectos legales
Esto utiliza una API no documentada y muy probablemente infringe los términos de servicio de Fitbod, aunque solo toca tu propia cuenta y no elude el pago. Existe para la interoperabilidad personal con tus propios datos de entrenamiento. Úsalo en tu propia cuenta, bajo tu propio riesgo, y no lo dirijas a la de nadie más.
La marca hexagonal del banner es un dibujo original inspirado en la identidad visual de Fitbod, no su marca registrada, y este proyecto no está afiliado, respaldado ni conectado con Fitbod de ninguna manera.
Licencia
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables interaction with the Hevy fitness tracking platform through their API. Supports managing workouts, routines, exercise templates, and webhook subscriptions for comprehensive fitness data management.9ISC
- AlicenseBqualityDmaintenanceEnables access to WHOOP fitness and health data through all WHOOP v2 API endpoints. Supports OAuth 2.0 authentication and provides comprehensive access to user profiles, physiological cycles, recovery metrics, sleep analysis, and workout data.1616314MIT
- AlicenseAqualityDmaintenanceProvides read-only access to Nolio training data including planned workouts, completed sessions, metrics, records, and notes.83MIT
- AlicenseNot gradedqualityCmaintenanceEnables triathlon coaches and athletes to interact with Garmin Connect, including retrieving health/activity data, building and uploading structured workouts (cycling, running, swimming, brick), and accessing coaching analytics like readiness, load, and performance trends.MIT
Related MCP Connectors
List, fetch, create, edit (replace), delete and schedule structured workouts on Garmin Connect (runn
Create Hevy routines and analyze your training from chat. Unofficial; BYO Hevy PRO API key.
Manage clients, plans, sessions, habits, and billing on Trainzilla via one-click OAuth.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Muno459/mcp-fitbod'
If you have feedback or need assistance with the MCP directory API, please join our Discord server