Skip to main content
Glama

목차

개요 ·  설치 ·  구성 ·  도구 ·  인증 ·  주요 발견 사항 ·  제한 사항 ·  아키텍처 ·  법적 고지

Related MCP server: WHOOP MCP Server

개요

mcp-fitbod는 Fitbod 계정을 단일 stdio MCP 서버 뒤에 배치하므로 모든 MCP 클라이언트가 트레이닝 데이터를 직접 다룰 수 있습니다. 단일 엔드포인트가 아닌 10개의 백엔드 서비스에 걸쳐 있습니다:

서비스

보유 내용

도구

nautilus

루틴, 체육관, 장비, 생성기 구성, 프로필, 운동 기록

36

metros

체성분 시계열, 근력 점수, 연속 기록, 백분위

11

pyserve

운동 생성기(LLM 기반 변형 포함)

4

coach

지속적 메모리를 갖춘 AI 코칭 세션

5

gympulse

공개 체육관 디렉터리 및 Places 검색

3

prism

AI 채팅 백엔드

1

blimp · partnerio · billing

인앱 메시지, Strava, 구독 상태

4

gate-keeper

로그인 및 서비스별 토큰 발급

인증 계층

가장 유용한 부분은 pyserve입니다. 대부분의 통합은 앱 과 함께 루틴을 작성합니다. 이 서버는 생성기 자체를 호출하여 운동 선택, 세트, 반복, 중량 및 휴식 시간이 포함된 완전한 세션을 돌려받은 다음, 실제로 보유한 장비를 기준으로 결과를 필터링하고 수행할 수 없는 항목은 대체를 요청합니다.

주요 기능

  • 모든 쓰기 도구는 기본적으로 dry_run=True이며 계정에 영향을 주지 않고 보낼 정확한 페이로드를 반환합니다.

  • 약 1,400개 운동으로 구성된 오프라인 코퍼스 덕분에 카탈로그 조회, 체육관 필터링, 근육 매핑에 네트워크 호출이 필요 없습니다.

  • build_routine은 쓰기 전에 모든 동작을 체육관 기준으로 검증하고, 부분 실패 시 루틴을 삭제하여 절반만 생성된 상태를 남기지 않습니다.

  • 분석(토너지, 근육별 볼륨, 추정 1RM, 정체된 운동)은 네트워크 의존성이 없는 순수 함수로 구현되며 픽스처를 대상으로 단위 테스트됩니다.

  • 토큰 발급, 401 시 갱신, 속도 제한, 페이지네이션, 일시적 챌린지 재시도는 모두 클라이언트 내부에서 처리됩니다.

설치

Python 3.10 이상이 필요합니다.

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

한 번 인증하세요. 리프레시 토큰은 약 1년간 유효하며, 해당 토큰만 저장됩니다.

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

자신의 Fitbod 설치에서 오프라인 운동 코퍼스를 구축하세요. APK를 추출한 다음 빌더가 해당 res/raw 디렉터리를 가리키게 하세요.

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

도구가 수행 가능한 운동으로 필터링할 수 있도록 체육관을 설명하세요.

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

검증한 다음 실행하세요.

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

구성

stdio를 통해 모든 MCP 클라이언트에 서버를 등록하세요:

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

변수

용도

FITBOD_EMAIL

python -m fitbod.auth에서만 사용되며 저장되지 않습니다

FITBOD_PASSWORD

python -m fitbod.auth에서만 사용되며 저장되지 않습니다

FITBOD_REFRESH_TOKEN

자격 증명 파일 대신 리프레시 토큰을 직접 제공합니다

자격 증명은 .fitbod-credentials.json에 저장되며 소유자만 읽을 수 있고 gitignore 처리됩니다. 이 파일에는 리프레시 토큰만 들어 있습니다. 비밀번호는 디스크에 기록되거나 로그에 남지 않습니다. 액세스를 취소하려면 비밀번호를 변경하세요.

data/gym-profile.json은 보유한 장비를 Fitbod의 78개 장비 유형에 매핑하며, 사용 가능한 정확한 덤벨 및 플레이트 증분을 포함하므로 처방된 중량을 실제로 조립할 수 있습니다. data/gym-profile.example.json에서 시작하고 preview_inventory_mapping으로 이름이 올바르게 해석되는지 확인하세요.

도구

12개 모듈에 걸친 97개 도구. 모든 쓰기 도구는 dry_run을 지원합니다.

도구

설명

list_workouts

기록된 운동, 최신순

get_workout

단일 운동의 전체 세부 정보, 모든 세트 확장

exercise_history

단일 동작에 대해 기록된 모든 세트, 추정 1RM 포함

volume_by_muscle

근육 그룹별 작업 세트 및 토너지

stalled_lifts

최고 추정 1RM이 개선되지 않은 동작

training_summary

한 번의 호출로 총계, 근육별 볼륨, 정체된 동작

workout_totals

서버 자체 집계를 통한 총 운동 횟수

body_metrics

프로필의 신체 지표

log_workout

완료된 운동을 기록에 추가

update_logged_workout

이미 기록된 운동 편집

추정 1RM은 Epley 공식을 사용합니다. 워밍업 세트는 작업 세트 수와 토너지에서 제외됩니다. 빈 기간은 단순한 0 대신 설명적인 note를 반환합니다.

도구

설명

generate_workout

Fitbod 자체 엔진에 세션 생성을 요청

replace_exercises

생성 후 지정된 운동을 교체

workout_insights

생성된 운동에 대한 자유 텍스트 질문

generator_reference

생성기 표면과 알려진 제약 조건

foundational_model, algo_direct_client, algo_llamabod의 세 가지 엔진을 선택할 수 있습니다. 결과는 체육관 기준으로 사후 필터링되며, 불가능한 항목은 exercise_replacement를 통해 자동 교체됩니다.

도구

설명

list_gyms

계정의 체육관 및 장비 수

get_gym_equipment

체육관에 현재 연결된 장비

preview_inventory_mapping

인벤토리가 Fitbod 장비 ID에 매핑되는 방식

create_gym_from_inventory

인벤토리로 구성된 체육관 생성

add_gym_equipment · remove_gym_equipment

장비 유형 하나 연결 또는 해제

set_available_weights

한 유형에 존재하는 특정 중량 선언

apply_inventory_weights

기록된 덤벨 및 플레이트 증분 적용

delete_gym

체육관 삭제

도구

설명

get_workout_config · update_workout_config

목표, 분할, 경험, 주당 운동일, 슈퍼세트, 워밍업, 시간

get_blocks · create_block

트레이닝 블록 및 집중 운동

set_exercise_priority · list_exercise_priorities

선택에 편향을 주는 운동별 계수

도구

설명

build_routine

롤백 지원과 함께 한 번의 호출로 완전한 루틴 생성

list_routines · get_routine

저장된 템플릿 읽기

create_routine · update_routine · delete_routine

템플릿 수명 주기

add_set_to_routine

처방된 운동 추가

create_superset

운동 그룹 컨테이너 생성

create_custom_exercise

Fitbod가 모델링하지 않는 동작 정의

도구

설명

body_composition

지표별 전체 기록이 포함된 현재 체성분

lean_mass_trend

시간에 따른 제지방량과 체중, 변화량 포함

muscle_strength · muscle_strength_detail

전체 사용자 대비 근육별 점수

population_percentiles

특정 운동이 다른 모든 사람 대비 어느 위치에 있는지

training_streak · set_goal_progress

연속 기록, 주간 횟수, 볼륨 목표

list_metric_types · metric_details

지표 카탈로그 및 숫자 ID

record_body_metric · delete_body_metric

측정값 기록 및 삭제

체중, 제지방량, 체지방량, 체지방률, BMI, BMR 및 7개 둘레 측정값에 대한 전체 시계열을 사용할 수 있으며, Apple Health 또는 Health Connect에서 가져옵니다.

카탈로그: 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

프로필: 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_ask coach_sessions coach_new_session coach_memories coach_session_stats chat

분석: exercise_analytics exercise_benchmarks workout_achievements

기타 서비스: service_health subscription_status list_blimps dismiss_blimp strava_connection list_public_gyms public_gym_equipment search_places

영양: nutrition_targets todays_targets recalculate_targets cut_progress

탈출구: raw_getmetros_raw_get, 둘 다 경로 검증이 있는 읽기 전용 입니다.

인증

세 단계로, 모든 마이크로서비스가 하나의 장수명 리프레시 토큰에서 자체 단기 토큰을 발급합니다:

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

클라이언트는 액세스 토큰을 23시간 동안 캐시하고 401이 오면 투명하게 재발급합니다. 서비스별 불일치에 유의하세요: nautilus는 본문에 refresh_token을 요구하는 반면, prism, blimp, metros는 헤더로도 받아들입니다.

브라우저 형태의 User-Agent가 필요합니다. curl/* 같은 알려진 봇 에이전트는 요청이 오리진에 도달하기 전에 엣지에서 거부되기 때문입니다.

주요 발견 사항

파악하는 데 실제 시간이 걸리는 동작을 문서화하여 다시 발견하지 않아도 되게 했습니다.

두 가지 직렬화 체계가 공존합니다. JSON:API 속성은 snake_case이지만, 임베디드 문서는 명시적 어노테이션이 덮어쓰지 않는 한 소스 속성 이름을 그대로 사용합니다. individual_sets 내부에서 isWarmuprestTime은 camelCase를 유지하는 반면 _id, _created_at, is_amrap은 오버라이드가 적용됩니다. 둘을 혼동하면 모든 필드가 조용히 누락됩니다.

일부 매핑은 추측이 불가능합니다. workoutConfigIddefault_workout_config_id로, circuitsEnabledsupersets_enabled로, algorithmCoefficientalgorithm_coeffecient로 직렬화되는데, 이는 와이어 상에서 철자가 틀린 것입니다.

기록된 세트는 리소스 id를 사용하지 않습니다. 운동을 exercise_external_resource_id로 참조하는데, 이는 다른 번호입니다. 레그 프레스는 id=291이지만 external_resource_id=218입니다.

POST와 PUT은 id에 대해 의견이 다릅니다. POST workout_data는 어떤 id도 거부하는 반면(data.attributes.id should be type integer_id), PUT workout_data/{id}data.id가 경로와 일치해야 합니다.

관계 대 속성. gym_idequipment_id는 읽을 수 있지만 쓸 수는 없습니다. gym_equipment 행을 만들려면 속성이 아닌 JSON:API 관계가 필요합니다.

Enum 값은 고정되어 있으며 순서가 중요합니다.

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)

생성기 특이사항. algo_versions는 필수지만 내부의 모든 필드는 null일 수 있습니다. 빈 user_equipment 또는 muscle_usages_from_client는 500을 반환합니다. exercise_replacement는 운동을 current_workout으로 그대로 다시 보내야 하며, exercise_ids_to_replace의 모든 id가 그 안에 있어야 합니다. 생성기는 user_equipment를 엄격히 따르지 않으므로 항상 사후 필터링하세요.

버스트는 챌린지됩니다. HTML 본문이 있는 403은 일시적이며 약 10~30초 안에 해소됩니다. 클라이언트는 이를 인증 오류로 표시하지 않고 재시도합니다. 언뜻 보기에는 인증 오류처럼 보이지만 말이죠.

지속 시간은 초 단위입니다. 기록된 운동의 duration은 분이 아닙니다. 65분 세션이 3908로 표시되기 전까지 놓치기 쉽습니다.

알려진 제한 사항

구독 계정으로 모든 페이로드 형태를 시도해 확인했습니다:

엔드포인트

동작

POST set_breakdown_templates

모든 형태에서 403이 발생하며 GET은 작동합니다. 세트별 리터럴 중량과 반복 횟수는 지정할 수 없습니다. 대신 theoretical_max를 통해 부하를 조절하세요.

POST circuit_templates

403, 동일한 패턴입니다. 슈퍼세트는 API를 통해 만들 수 없습니다.

POST workout_datarpe

null을 포함한 모든 값에서 400이 발생합니다. 읽을 수만 있고 쓸 수는 없습니다.

코치 세션

삭제할 수 없으므로(405) 테스트는 이를 생성하지 않습니다.

영양 API는 전혀 없습니다. 영양 도구는 목표를 로컬에 저장하고 실시간 체성분에서 이를 도출합니다.

아키텍처

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

요청은 클라이언트 측에서 초당 6회, 버스트 10회로 제한됩니다. 이는 발견된 상한이 아니라 예의상의 예산입니다. 50개의 동시 요청은 429 없이 초당 약 32회를 유지했고 어떤 응답에도 rate limit 헤더가 없었습니다. 처리량이 필요하다면 여유가 있습니다.

운동 코퍼스는 이중 인덱스로 키가 지정됩니다. 기록된 세트와 카탈로그 항목이 서로 다른 id 공간을 사용하기 때문입니다. 이러한 이유로 reference.by_id()reference.by_external_id()가 모두 존재합니다.

문서

파일

내용

docs/API-MAP.md

전체 표면: 12개 인터페이스에 걸친 145개 엔드포인트 선언과 전이적으로 해석된 365개 요청·응답 모델

docs/SCHEMAS.md

정확한 와이어 이름, 타입, 필수 플래그를 포함한 필드 수준 스키마

docs/GAPS.md

아직 해결되지 않은 사항과 그 이유

운동 카탈로그

build_reference.py는 추출된 Fitbod APK의 res/raw 디렉토리에서 data/exercise-reference.json을 빌드합니다: 약 1,400개의 운동(서면 지침 포함), 78개 장비 유형, 근육 그룹 매핑, 장비 중량 테이블이 포함됩니다. 해당 콘텐츠는 Fitbod 소유이므로 여기에 배포되지 않습니다. 직접 설치본에서 빌드하세요.

법적 고지

이 프로젝트는 문서화되지 않은 API를 사용하며, 자신의 계정만 건드리고 결제를 우회하지 않더라도 Fitbod의 서비스 약관을 위반할 가능성이 매우 높습니다. 이는 자신의 훈련 데이터와의 개인적 상호운용성을 위해 존재합니다. 자신의 계정에서 자신의 책임 하에 사용하고, 다른 사람의 계정에는 사용하지 마세요.

배너의 육각형 마크는 Fitbod의 시각적 정체성에서 영감을 받은 독창적인 그림이며 그들의 상표가 아닙니다. 이 프로젝트는 Fitbod와 어떤 방식으로도 제휴, 보증, 연결되어 있지 않습니다.

라이선스

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