Skip to main content
Glama

Inhalt

Überblick  ·  Installation  ·  Konfiguration  ·  Tools  ·  Authentifizierung  ·  Bemerkenswerte Erkenntnisse  ·  Einschränkungen  ·  Architektur  ·  Rechtliches

Related MCP server: WHOOP MCP Server

Überblick

mcp-fitbod stellt ein Fitbod-Konto hinter einen einzigen stdio-MCP-Server, sodass jeder MCP- Client direkt mit deinen Trainingsdaten arbeiten kann. Es umfasst zehn Backend-Dienste statt eines einzelnen Endpunkts:

Service

Inhalt

Tools

nautilus

Routinen, Fitnessstudios, Ausrüstung, Generator-Konfiguration, Profil, Trainingsverlauf

36

metros

Zeitreihen zur Körperzusammensetzung, Kraftbewertung, Serien, Perzentile

11

pyserve

den Workout-Generator, einschließlich einer LLM-gestützten Variante

4

coach

KI-Coaching-Sitzungen mit dauerhaften Erinnerungen

5

gympulse

öffentliches Fitnessstudio-Verzeichnis und Places-Suche

3

prism

KI-Chat-Backend

1

blimp · partnerio · billing

In-App-Nachrichten, Strava, Abonnementstatus

4

gate-keeper

Login und dienstspezifisches Token-Minting

Auth-Ebene

Das nützlichste Stück ist pyserve. Die meisten Integrationen schreiben Routinen neben der App; dieses ruft den Generator selbst auf und erhält eine vollständige Sitzung mit Übungsauswahl, Sätzen, Wiederholungen, Gewichten und Pausenzeiten zurück, filtert das Ergebnis gegen die Ausrüstung, die du tatsächlich besitzt, und fordert Ersatz für alles an, was du nicht ausführen kannst.

Highlights

  • Jedes Schreib-Tool verwendet standardmäßig dry_run=True und gibt das genaue Payload zurück, das es senden würde, ohne das Konto zu verändern.

  • Ein Offline-Korpus von rund 1.400 Übungen bedeutet, dass Katalogabfragen, Fitnessstudio- Filterung und Muskelzuordnung keine Netzwerkaufrufe kosten.

  • build_routine validiert jede Bewegung vor dem Schreiben gegen dein Fitnessstudio und löscht die Routine bei teilweisem Fehlschlag, sodass nichts halb erstellt zurückbleibt.

  • Analysen (Tonnage, Volumen pro Muskel, geschätztes 1RM, stagnierende Übungen) leben in reinen Funktionen ohne Netzwerkabhängigkeit und werden mit Fixtures unit-getestet.

  • Token-Minting, Aktualisierung bei 401, Rate-Limiting, Paginierung und erneute Versuche bei vorübergehenden Herausforderungen werden alle innerhalb des Clients behandelt.

Installation

Erfordert Python 3.10 oder neuer.

git clone https://github.com/Muno459/mcp-fitbod
cd mcp-fitbod
pip install -e ".[dev]"

Authentifiziere dich einmal. Das Refresh-Token hält etwa ein Jahr, und nur dieses Token wird gespeichert.

FITBOD_EMAIL='you@example.com' FITBOD_PASSWORD='...' python -m fitbod.auth

Erstelle den Offline-Übungskorpus aus deiner eigenen Fitbod-Installation. Extrahiere die APK und richte dann den Builder auf deren res/raw-Verzeichnis.

python build_reference.py --apk-res /path/to/fitbod/res/raw

Beschreibe dein Fitnessstudio, damit Tools auf ausführbare Übungen filtern können.

cp data/gym-profile.example.json data/gym-profile.json
$EDITOR data/gym-profile.json

Überprüfe und führe dann aus.

python -m pytest tests/ -q     # offline: parsing and analysis
python smoke_test.py           # live: every tool, writes are dry-run
python server.py

Konfiguration

Registriere den Server bei einem beliebigen MCP-Client über stdio:

{
  "mcpServers": {
    "fitbod": {
      "command": "python",
      "args": ["/absolute/path/to/mcp-fitbod/server.py"]
    }
  }
}

Variable

Zweck

FITBOD_EMAIL

Wird nur von python -m fitbod.auth verwendet, nie gespeichert

FITBOD_PASSWORD

Wird nur von python -m fitbod.auth verwendet, nie gespeichert

FITBOD_REFRESH_TOKEN

Stellt das Refresh-Token direkt bereit, anstelle der Credentials-Datei

Die Credentials liegen in .fitbod-credentials.json, nur für den Besitzer lesbar und gitignored. Die Datei enthält das Refresh-Token und sonst nichts. Dein Passwort wird nie auf die Festplatte geschrieben und nie protokolliert. Um den Zugriff zu widerrufen, ändere dein Passwort.

data/gym-profile.json bildet die Ausrüstung, die du besitzt, auf die 78 Ausrüstungstypen von Fitbod ab, einschließlich der genauen Kurzhantel- und Scheibenabstufungen, die dir zur Verfügung stehen, sodass vorgegebene Lasten solche sind, die du tatsächlich zusammenstellen kannst. Beginne mit data/gym-profile.example.json und prüfe, ob deine Namen mit preview_inventory_mapping aufgelöst werden.

Tools

97 Tools in zwölf Modulen. Jedes Schreib-Tool akzeptiert dry_run.

Tool

Beschreibung

list_workouts

Protokollierte Workouts, neueste zuerst

get_workout

Vollständige Details zu einem Workout, jeder Satz erweitert

exercise_history

Jeder Satz, der für eine Bewegung protokolliert wurde, mit geschätztem 1RM

volume_by_muscle

Arbeitssätze und Tonnage pro Muskelgruppe

stalled_lifts

Bewegungen, deren bestes geschätztes 1RM sich nicht verbessert hat

training_summary

Summen, Volumen pro Muskel und stagnierende Bewegungen in einem Aufruf

workout_totals

Gesamtzahl der Workouts über die eigene Aggregation des Servers

body_metrics

Körpermetriken aus dem Profil

log_workout

Ein abgeschlossenes Workout in den Verlauf eintragen

update_logged_workout

Ein bereits im Verlauf befindliches Workout bearbeiten

Geschätztes 1RM verwendet Epley. Aufwärmsätze sind von den Arbeitssatz-Zählungen und der Tonnage ausgeschlossen. Ein leeres Zeitfenster gibt einen erklärenden note zurück, statt einer bloßen Null.

Tool

Beschreibung

generate_workout

Die eigene Engine von Fitbod bitten, eine Sitzung zu generieren

replace_exercises

Generieren und dann angegebene Übungen austauschen

workout_insights

Freitextfrage zu einem generierten Workout

generator_reference

Die Generator-Oberfläche und ihre bekannten Einschränkungen

Drei Engines sind wählbar: foundational_model, algo_direct_client und algo_llamabod. Die Ergebnisse werden gegen dein Fitnessstudio nachgefiltert, und alles Unmögliche wird automatisch über exercise_replacement ausgetauscht.

Tool

Beschreibung

list_gyms

Fitnessstudios auf dem Konto mit Ausrüstungsanzahl

get_gym_equipment

Ausrüstung, die aktuell einem Fitnessstudio zugeordnet ist

preview_inventory_mapping

Wie dein Inventar auf Fitbod-Ausrüstungs-IDs abgebildet wird

create_gym_from_inventory

Ein Fitnessstudio erstellen, das aus deinem Inventar konfiguriert ist

add_gym_equipment · remove_gym_equipment

Einen Ausrüstungstyp hinzufügen oder entfernen

set_available_weights

Angeben, welche spezifischen Gewichte für einen Typ vorhanden sind

apply_inventory_weights

Aufgezeichnete Kurzhantel- und Scheibenabstufungen anwenden

delete_gym

Ein Fitnessstudio löschen

Tool

Beschreibung

get_workout_config · update_workout_config

Ziel, Split, Erfahrung, Tage pro Woche, Supersätze, Aufwärmen, Dauer

get_blocks · create_block

Trainingsblöcke und deren Fokusübungen

set_exercise_priority · list_exercise_priorities

Übungsspezifische Koeffizienten, die die Auswahl beeinflussen

Tool

Beschreibung

build_routine

Eine vollständige Routine in einem Aufruf erstellen, mit Rollback

list_routines · get_routine

Gespeicherte Vorlagen lesen

create_routine · update_routine · delete_routine

Lebenszyklus von Vorlagen

add_set_to_routine

Eine vorgeschriebene Übung hinzufügen

create_superset

Einen Container für Übungsgruppen erstellen

create_custom_exercise

Eine Bewegung definieren, die Fitbod nicht modelliert

Tool

Beschreibung

body_composition

Aktuelle Zusammensetzung mit vollständigem Verlauf pro Metrik

lean_mass_trend

Magermasse und Gewicht im Zeitverlauf, mit Deltas

muscle_strength · muscle_strength_detail

Bewertung pro Muskel im Vergleich zur Bevölkerung

population_percentiles

Wo eine Übung im Vergleich zu allen anderen rangiert

training_streak · set_goal_progress

Serien, wöchentliche Zählungen, Volumenziele

list_metric_types · metric_details

Der Metrik-Katalog und seine numerischen IDs

record_body_metric · delete_body_metric

Messwerte schreiben und entfernen

Eine vollständige Zeitreihe ist verfügbar für Gewicht, Magermasse, Fettmasse, Körperfett, BMI, BMR und sieben Umfänge, bezogen aus Apple Health oder Health Connect.

Katalog: 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

Profil: 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 und Chat: coach_ask coach_sessions coach_new_session coach_memories coach_session_stats chat

Analysen: exercise_analytics exercise_benchmarks workout_achievements

Weitere Dienste: service_health subscription_status list_blimps dismiss_blimp strava_connection list_public_gyms public_gym_equipment search_places

Ernährung: nutrition_targets todays_targets recalculate_targets cut_progress

Notausstiege: raw_get und metros_raw_get, beide schreibgeschützt mit Pfadvalidierung.

Authentifizierung

Drei Schritte, wobei jeder Microservice sein eigenes kurzlebiges Token aus einem langlebigen Refresh-Token prägt:

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/...

Der Client cached Zugriffstokens für 23 Stunden und prägt sie bei einem 401 transparent neu. Beachte die Inkonsistenz zwischen den Diensten: nautilus verlangt refresh_token im Body, während prism, blimp und metros es auch als Header akzeptieren.

Ein browserähnlicher User-Agent ist erforderlich, da bekannte Bot-Agenten wie curl/* am Edge abgewiesen werden, bevor die Anfrage den Origin erreicht.

Bemerkenswerte Erkenntnisse

Verhalten, dessen Ermittlung echte Zeit kostet, hier dokumentiert, damit es nicht erneut entdeckt werden muss.

Zwei Serialisierungsregime koexistieren. JSON:API-Attribute sind snake_case, aber eingebettete Dokumente verwenden den Quell-Eigenschaftsnamen wörtlich, sofern keine explizite Annotation ihn überschreibt. Innerhalb von individual_sets bleiben isWarmup und restTime camelCase, während _id, _created_at und is_amrap Überschreibungen tragen. Wer die beiden verwechselt, verliert stillschweigend jedes Feld.

Manche Zuordnungen sind nicht zu erraten. workoutConfigId serialisiert als default_workout_config_id, circuitsEnabled als supersets_enabled, und algorithmCoefficient als algorithm_coeffecient – auf dem Draht falsch geschrieben.

Protokollierte Sätze verwenden nicht die Ressourcen-ID. Sie referenzieren Übungen über exercise_external_resource_id, was eine andere Nummer ist. Leg Press hat id=291, aber external_resource_id=218.

POST und PUT sind sich bei IDs uneinig. POST workout_data lehnt jede id ab (data.attributes.id should be type integer_id), während PUT workout_data/{id} verlangt, dass data.id mit dem Pfad übereinstimmt.

Beziehungen versus Attribute. gym_id und equipment_id sind lesbar, aber nicht schreibbar. Das Erstellen einer gym_equipment-Zeile erfordert JSON:API-Beziehungen, keine Attribute.

Enum-Werte sind festgelegt und die Reihenfolge ist entscheidend.

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)

Generator-Eigenheiten. algo_versions ist erforderlich, aber jedes Feld darin darf null sein. Ein leeres user_equipment oder muscle_usages_from_client liefert eine 500. exercise_replacement benötigt das Training als current_workout zurückgespiegelt, und jede ID in exercise_ids_to_replace muss darin vorkommen. Der Generator beachtet user_equipment nicht strikt, also filtere immer nach.

Bursts werden mit einer Challenge beantwortet. Ein 403 mit einem HTML-Body ist vorübergehend und verschwindet in etwa 10 bis 30 Sekunden. Der Client wiederholt die Anfrage, anstatt sie als Auth-Fehler anzuzeigen, was sie auf den ersten Blick zu sein scheint.

Dauern sind Sekunden. duration bei einem protokollierten Training ist nicht in Minuten, was leicht zu übersehen ist, bis eine 65-minütige Einheit als 3908 angezeigt wird.

Bekannte Einschränkungen

Bestätigt gegen ein abonniertes Konto, wobei jede Payload-Form ausprobiert wurde:

Endpoint

Behaviour

POST set_breakdown_templates

403 bei jeder Form, während GET funktioniert. Konkrete Gewichts- und Wiederholungsangaben pro Satz können nicht vorgeschrieben werden. Steuere die Last stattdessen über theoretical_max.

POST circuit_templates

403, gleiches Muster. Supersätze können nicht über die API erstellt werden.

rpe bei POST workout_data

400 für jeden Wert, einschließlich null. Lesbar, nie schreibbar.

Coach-Sitzungen

Können nicht gelöscht werden (405), daher erstellen Tests sie nie.

Es gibt überhaupt keine Ernährungs-API. Die Ernährungstools speichern Ziele lokal und leiten sie aus der aktuellen Körperzusammensetzung ab.

Architektur

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 default

Anfragen werden clientseitig auf 6 pro Sekunde mit einem Burst von 10 begrenzt. Das ist ein Höflichkeitsbudget und keine entdeckte Obergrenze: 50 gleichzeitige Anfragen erreichten etwa 32 pro Sekunde, ohne 429s und ohne Rate-Limit-Header in irgendeiner Antwort. Es gibt Spielraum, falls du Durchsatz benötigst.

Der Übungskorpus wird über einen dualen Index erschlossen, da protokollierte Sätze und Katalogeinträge unterschiedliche ID-Räume verwenden. reference.by_id() und reference.by_external_id() existieren beide aus diesem Grund.

Dokumentation

Datei

Inhalt

docs/API-MAP.md

Die vollständige API-Oberfläche: 145 Endpunkt-Deklarationen über 12 Schnittstellen, mit 365 transitiv aufgelösten Anfrage- und Antwortmodellen

docs/SCHEMAS.md

Feldgenaue Schemas mit exakten Wire-Namen, Typen und Pflichtkennzeichnungen

docs/GAPS.md

Was ungelöst bleibt, und warum

Der Übungskatalog

build_reference.py erstellt data/exercise-reference.json aus dem Verzeichnis res/raw einer extrahierten Fitbod-APK: ungefähr 1.400 Übungen mit schriftlichen Anleitungen, 78 Gerätetypen, Muskelgruppen-Zuordnungen und Gerätegewicht-Tabellen. Dieser Inhalt gehört Fitbod und wird daher hier nicht verteilt. Erstelle ihn aus deiner eigenen Installation.

Rechtliches

Dieses Projekt verwendet eine undokumentierte API und verstößt sehr wahrscheinlich gegen Fitbods Nutzungsbedingungen, auch wenn es nur dein eigenes Konto betrifft und keine Zahlungen umgeht. Es dient der persönlichen Interoperabilität mit deinen eigenen Trainingsdaten. Verwende es auf deinem eigenen Konto, auf eigenes Risiko, und richte es nicht auf die Konten anderer.

Das Sechseck-Symbol im Banner ist eine originelle Zeichnung, inspiriert von Fitbods visueller Identität, nicht deren Markenzeichen. Dieses Projekt ist in keiner Weise mit Fitbod verbunden, wird von Fitbod nicht unterstützt und steht in keiner Verbindung zu Fitbod.

Lizenz

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables interaction with the Hevy fitness tracking platform through their API. Supports managing workouts, routines, exercise templates, and webhook subscriptions for comprehensive fitness data management.
    9
    ISC
  • A
    license
    B
    quality
    D
    maintenance
    Enables 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.
    16
    163
    14
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Muno459/mcp-fitbod'

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