Skip to main content
Glama
a1dancole

MyFitnessPal MCP

by a1dancole

MyFitnessPal MCP — Claude 트레이닝 코치를 위한 영양 데이터

Cloudflare Workers에 배포된 원격 MCP 서버로, 당신의 MyFitnessPal 다이어리 — 모든 음식의 1회 제공량과 시간, 끼니별 및 일일 에너지·매크로·마이크로 영양소 합계, 수분, 기록된 운동, 걸음 수, 체중 — 를 Claude에 노출합니다. 커스텀 커넥터로 한 번 추가하면 Claude 웹, 데스크톱, 모바일에서 모두 작동합니다. Strava, Google Health, Renpho 커넥터와 함께 사용하면 코치가 훈련 부하, 회복, 체성분 그리고 영양 공급을 모두 볼 수 있습니다.

MFP와 통신하는 방식: MyFitnessPal에는 공개 API가 없습니다(파트너 프로그램은 폐쇄됨). 이 서버는 모바일 앱 자체 OAuth ID 흐름과 앱이 사용하는 동일한 api.myfitnesspal.com/v2 API를 사용합니다 — myfitnesspalapi.com에 보관된 파트너 문서가 설명하는 그 API입니다. 브라우저, 쿠키, 스크래핑, 캡차가 없습니다. ID 흐름에 대한 크레딧: seonixx/myfitnesspal 및 jnelle/MyFitnesspal-API-Golang. 비공식이며 MFP는 언제든 변경할 수 있습니다.

도구

도구

답변 내용

get_daily_nutrition

"오늘 무엇을 먹었나?" — 끼니별 및 일일 합계(에너지, 단백질, 탄수화물, 순탄수화물, 식이섬유, 당, 지방 하위 유형, 콜레스테롤, 나트륨, 칼륨, %DV 미량 영양소), 모든 음식의 1회 제공량 및 타임스탬프, 수분, 운동, 걸음 수, 체중 기록

get_food_log

기간에 따른 개별 음식 기록, 끼니 또는 텍스트 검색으로 필터 가능 — 운동 세션 전후에 먹은 음식, 반복적으로 나타나는 음식

get_nutrition_trend

기간에 따른 일일 합계, 기록된 날짜 기준 평균, 최소/최대 에너지, 단백질·탄수화물·지방 에너지 비율, 주간 평균, 수분/운동/걸음 수

get_exercise_log

MFP에 기록된 운동(시간, 칼로리, 거리, 심박수) 및 일일 걸음 수

get_weight_log

MFP에 기록된 체중 항목

get_profile

이름, 성별, 생년월일/나이, 키, 로케일 + 토큰 상태

run_diagnostics

종단 간 점검: 토큰 갱신, 프로필, 계정이 허용하는 다이어리 types/fields 조합(원본 샘플 포함), 측정 항목, 후보 목표 엔드포인트

query_endpoint

탈출구: 커넥터의 인증을 적용하여 모든 api.myfitnesspal.com / ID 엔드포인트 호출

refresh_data

캐시된 날짜와 기억된 요청 형태 삭제, 토큰 갱신

delete_my_data

계정에 캐시된 모든 데이터 삭제

문제 해결: 도구에서 오류가 발생하거나 데이터가 누락된 것처럼 보이면 먼저 run_diagnostics를 실행하세요. 계정에 대해 MFP가 수용하는 정확한 types/fields[] 조합과 항목 유형별 원본 샘플을 보고합니다.


Related MCP server: MyFitnessPal MCP Server

작동 방식

Claude (web/desktop/mobile)
  └─ custom connector → /mcp
       └─ workers-oauth-provider  (this Worker IS Claude's OAuth server)
            └─ AuthHandler        (MFP sign-in page: one-time credential → token exchange)
                 └─ MyFitnessPalMCP (Durable Object) → MfpClient → api.myfitnesspal.com/v2

로그인 (커넥터의 /authorize 페이지에서 한 번)

  1. POST identity-api.myfitnesspal.com/oauth/token — 모바일 앱의 OAuth 클라이언트에 대한 client-credentials 토큰.

  2. GET identity-api…/clientKeys — MFP가 비밀번호 로그인에 사용하는 HS512 서명 키.

  3. POST identity-api…/oauth/authorize에 credentials=<JWT{username, password}> 포함 — mfp://identity/callback?code=…로의 리디렉션 반환.

  4. POST …/oauth/token(authorization_code) — access + refresh + id 토큰.

  5. GET identity-api…/users/{sub} — MFP 도메인 사용자 ID(mfp-user-id 헤더) 및 프로필.

refresh token(및 첫 번째 access token)만 OAuth grant의 props 안에 암호화되어 보관되며 비밀번호는 저장되지 않습니다. 이후 Worker가 자동으로 갱신하며, 가장 최근에 교체된 refresh token은 KV에 봉인된 채 보관됩니다.

다이어리 읽기

GET api.myfitnesspal.com/v2/diary?entry_date=YYYY-MM-DD&types=…&fields[]=…에 Authorization: Bearer, mfp-user-id, mfp-client-id, 앱의 api-version/user-agent 헤더를 사용합니다. 항목 유형: food_entry, diary_meal, exercise_entry, water, steps_aggregate. 페이지네이션은 Link: rel=next 헤더를 따릅니다.

모바일 토큰이 허용하는 정확한 types/fields[]는 문서화되어 있지 않으므로 클라이언트가 이를 발견합니다: 가장 풍부한 요청을 시도한 다음 더 작은 필드 세트, 필드 없음, 유형별 하나씩 시도하며 — 하루 동안 승리한 조합을 기억합니다. 거부된 것은 도구 결과에 보고됩니다. 완료된 날짜는 변경할 수 없으며 30일 동안 캐시(봉인)됩니다. 오늘은 항상 실시간입니다. 각 날짜는 업스트림 호출 1회이므로 기간은 92일로 제한됩니다.

필드 매핑

nutritional_contents → 단위 접미사 키: energy_kcal(kJ 변환), protein_g, carbohydrates_g, net_carbs_g, fiber_g, sugar_g, fat_g, saturated_fat_g, monounsaturated_fat_g, polyunsaturated_fat_g, trans_fat_g, cholesterol_mg, sodium_mg, potassium_mg, 그리고 calcium/iron/vitamin_a/vitamin_c/vitamin_d_pct_dv(MFP는 이 값을 일일 권장량의 백분율로 저장). 알 수 없는 영양소는 extra 아래 유지됩니다.

일일 합계는 MFP 자체 diary_meal 요약이 있을 때 그 값을 사용하고(totals_source: "diary_meal"), 그렇지 않으면 food_entry 행을 합산합니다.

캐싱 및 암호화

MFP_CACHE KV 네임스페이스에 기록되는 모든 것(토큰, 발견된 요청 형태, 다이어리 날짜)은 SESSION_ENCRYPTION_KEY에서 파생된 키로 AES-256-GCM 봉인되며 사용자별로 키가 지정됩니다. 비밀 키가 없으면 캐싱이 비활성화됩니다. 캐시 실패는 요청을 중단시키지 않습니다.


클라이언트 자격 증명의 출처

ID 흐름에는 MyFitnessPal Android 앱에 내장된 OAuth 클라이언트 id/secret이 필요합니다. 이 저장소에는 포함되어 있지 않으며, 위에 링크된 Go 클라이언트가 .env.sample에 포함하고 있습니다. Worker 비밀 값 MFP_CLIENT_ID와 MFP_CLIENT_SECRET으로 설정하세요. MFP가 이를 교체하면 업데이트할 때까지 로그인이 작동하지 않습니다.

배포

옵션 A — GitHub Actions

.github/workflows/deploy.yml은 master로 push할 때마다 배포합니다. 비밀 값은 Cloudflare에 있으며 GitHub에는 CLOUDFLARE_API_TOKEN과 CLOUDFLARE_ACCOUNT_ID만 보관됩니다.

  1. 두 개의 KV 네임스페이스(MFP_OAUTH_KV, MFP_CACHE)를 만들고 그 id를 wrangler.jsonc에 넣으세요.

  2. 두 개의 GitHub 비밀 값을 추가하고 push하세요.

  3. Cloudflare에서 (Workers & Pages → myfitnesspal-mcp → Settings → Variables and Secrets) 비밀 값 SESSION_ENCRYPTION_KEY(아무 긴 랜덤 문자열), MFP_CLIENT_ID, MFP_CLIENT_SECRET을 추가하세요. 선택적으로 ALLOWED_EMAILS 변수를 자신의 MFP 이메일로 설정하면 다른 사람이 배포에 연결할 수 없습니다.

옵션 B — 로컬 wrangler

npm install
npx wrangler kv namespace create MFP_OAUTH_KV   # paste the id into wrangler.jsonc
npx wrangler kv namespace create MFP_CACHE      # paste the id into wrangler.jsonc
npx wrangler secret put SESSION_ENCRYPTION_KEY
npx wrangler secret put MFP_CLIENT_ID
npx wrangler secret put MFP_CLIENT_SECRET
npx wrangler deploy

Claude에서 연결하기

  1. Settings → Connectors → Add custom connector.

  2. URL: https://myfitnesspal-mcp.<subdomain>.workers.dev/mcp

  3. Connect를 클릭 → MyFitnessPal 이메일/사용자 이름과 비밀번호로 로그인 → 완료.

그런 다음: "MyFitnessPal에서 진단을 실행한 다음 어제의 영양 정보를 보여줘."

커넥터 아이콘

Worker는 MCP serverInfo.icons(및 websiteUrl)에서 PUBLIC_URL/icon.png를 광고하므로, 서버 브랜딩을 렌더링하는 클라이언트는 커넥터 목록에 이 아이콘을 표시합니다. 기본값은 생성된 접시와 식기 아이콘(npm run icon)입니다. 대신 공식 MyFitnessPal 앱 아이콘을 사용하려면 App Store / Play Store 목록에서 PNG를 저장하여 다음과 같이 포함하세요:

npm run icon:embed -- ~/Downloads/myfitnesspal-icon.png   # writes src/icon.ts + assets/icon.png
npm run deploy

(공식 마크는 MyFitnessPal의 상표입니다 — 개인 배포에는 괜찮지만 재배포에는 적합하지 않으며, 그래서 이 저장소에 포함되어 있지 않습니다.)

로컬 개발

cp .dev.vars.example .dev.vars   # set the secrets
npm run dev                      # http://localhost:8787
npm test                         # vitest (fake identity + API backend)
npm run typecheck
npm run icon

참고 사항 및 제한

  • 비공식. 앱의 비공개 클라이언트가 개인 사용 목적으로 자신의 자격 증명과 함께 사용됩니다. MFP는 클라이언트를 교체하거나 API를 변경할 수 있습니다.

  • Health Connect는 이미 MFP 식사 요약을 Google Health에 동기화합니다. 이 서버가 추가하는 것은 타임스탬프, 미량 영양소, 수분, MFP 운동 및 체중이 포함된 음식별 기록입니다.

  • 영양소 목표에 대한 확인된 엔드포인트는 아직 없습니다 — run_diagnostics가 후보를 탐색하고 query_endpoint로 조사할 수 있습니다.

  • 하위 요청 제한. 모든 다이어리 날짜는 업스트림 호출 1회입니다. Workers 무료 요금제(요청당 하위 요청 50회)에서는 캐시되지 않은 기간을 짧게 유지하세요. 캐시된 날짜는 비용이 저렴합니다.

  • 비밀번호 변경은 갱신 토큰을 무효화합니다 — 커넥터를 연결 해제한 후 다시 연결하세요.

개인정보 보호

  • 비밀번호는 토큰과 한 번 교환되며 저장되지 않습니다. 갱신 토큰은 OAuth grant 내부에 암호화된 채로 보관됩니다.

  • 다이어리 데이터는 자신의 KV 네임스페이스에만 캐시되며 봉인되어 있고 delete_my_data로 삭제할 수 있습니다. 어떤 제3자에게도 전송되지 않습니다.

라이선스

MIT

Related MCP Connectors

Related MCP Servers