Skip to main content
Glama
a1dancole

MyFitnessPal MCP

by a1dancole

MyFitnessPal MCP — あなたのClaudeトレーニングコーチのための栄養データ

リモートのMCPサーバー。Cloudflare Workersにデプロイされ、あなたのMyFitnessPalダイアリー(すべての食品と量・時刻、食事ごと・1日のエネルギー、マクロ栄養素、微量栄養素、水分、記録された運動、歩数、体重)をClaudeに公開します。一度カスタムコネクタとして追加すれば、Claude Web、デスクトップ、モバイルで動作します。Strava、Google Health、Renphoのコネクタと組み合わせることで、コーチはトレーニング負荷、回復度、体組成 および 栄養補給を把握できます。

MFPとの通信方法: MyFitnessPalには公開APIがありません(パートナープログラムは閉鎖されています)。このサーバーは、モバイルアプリ独自のOAuth IDフローと、アプリが使用するのと同じ api.myfitnesspal.com/v2 APIを使用します。これは、アーカイブされたパートナードキュメント(myfitnesspalapi.com)に記載されているものです。ブラウザもクッキーも不要、スクレイピングもキャプチャもありません。IDフローのクレジット:seonixx/myfitnesspal および jnelle/MyFitnesspal-API-Golang。非公式です。MFPはいつでもこれを変更する可能性があります。

ツール

ツール

回答内容

get_daily_nutrition

「今日何を食べたか?」— 食事ごと・1日の合計(エネルギー、タンパク質、炭水化物、正味炭水化物、食物繊維、糖質、脂肪のサブタイプ、コレステロール、ナトリウム、カリウム、%DV微量栄養素)、すべての食品(量とタイムスタンプ付き)、水分、運動、歩数、体重記録

get_food_log

期間内の個別の食品エントリ。食事またはテキスト検索でフィルタリング可能 — セッション前後に食べたもの、頻出する食品

get_nutrition_trend

期間内の1日ごとの合計。記録日数の平均、エネルギー最小/最大、タンパク質/炭水化物/脂質のエネルギー比率、週平均、水分/運動/歩数

get_exercise_log

MFPに記録された運動(時間、カロリー、距離、心拍数)と1日の歩数

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クライアント用のクライアントクレデンシャルトークン。

  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)— アクセストークン + リフレッシュトークン + IDトークン。

  5. GET identity-api…/users/{sub} — MFPドメインのユーザーID(mfp-user-id ヘッダー)とプロフィール。

保存されるのは リフレッシュトークン(および最初のアクセストークン)だけで、OAuthグラントのプロパティ内に暗号化されて格納されます。パスワードが保存されることはありません。以後、Workerはサイレントに更新を行い、最新のローテーションされたリフレッシュトークンは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[] は文書化されていないため、クライアントはそれらを発見します。最もリッチなリクエスト、次に小さいフィールドセット、次にフィールドなし、そして一度に1つのタイプを試し、成功した組み合わせを1日記憶します。拒否されたものはツールの結果に報告されます。完了した日は不変であり、30日間キャッシュ(シール)されます。今日は常にライブです。各日は1回のアップストリーム呼び出しとなるため、ウィンドウは92日間に制限されています。

フィールドマッピング

nutritional_contents → 単位接尾辞付きキー:energy_kcal(kJ換算)、protein_g、carbohydrates_g、net_carbs_g、fiber_g、sugar_g、fat_g、satrated_fat_g、monounsatrated_fat_g、polyunsatrated_fat_g、trans_fat_g、cholesterol_mg、sodium_mg、potassium_mg、calcium/iron/vitamin_a/vitamin_c/vitamin_d_pct_dv(MFPはこれらを1日あたりの摂取基準値に対するパーセントで保存します)。不明な栄養素は extra に保持されます。

日次合計は、存在する場合はMFP自身の diary_meal サマリー(totals_source: "diary_meal")から取得され、それ以外の場合は food_entry 行の合計から取得されます。

キャッシュと暗号化

MFP_CACHE KV名前空間に書き込まれるすべてのもの(トークン、発見されたリクエスト形状、ダイアリーの日次データ)は、SESSION_ENCRYPTION_KEY から導出され、ユーザーごとにキーイングされたキーで AES-256-GCM シール されます。シークレットがない場合、キャッシュは無効になります。キャッシュの失敗がリクエストを壊すことはありません。


クライアントクレデンシャルの入手元

IDフローには、MyFitnessPal Androidアプリに埋め込まれているOAuthクライアントID/シークレットが必要です。それらはここには再掲されていません。上記でリンクしたGoクライアントが .env.sample に同梱しています。Workerのシークレット MFP_CLIENT_ID と MFP_CLIENT_SECRET として設定してください。MFPがそれらをローテーションすると、更新されるまでサインインは機能しなくなります。

デプロイ

オプションA — GitHub Actions

.github/workflows/deploy.yml は、master へのプッシュごとにデプロイを実行します。シークレットはCloudflareに格納されます。GitHubには CLOUDFLARE_API_TOKEN と CLOUDFLARE_ACCOUNT_ID のみが保持されます。

  1. 2つのKV名前空間(MFP_OAUTH_KV、MFP_CACHE)を作成し、そのIDを wrangler.jsonc に記入します。

  2. 2つのGitHubシークレットを追加してプッシュします。

  3. Cloudflare(Workers & Pages → myfitnesspal-mcp → 設定 → 変数とシークレット)で、シークレット SESSION_ENCRYPTION_KE Y(任意の長いランダム文字列)、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. 設定 → コネクタ → カスタムコネクタを追加。

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

  3. 接続 をクリック → 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グラント内に暗号化されて保存されます。

  • ダイアリーデータは、自分専用のKV名前空間にのみシールされてキャッシュされ、delete_my_data で削除できます。第三者に送信されることは一切ありません。

ライセンス

MIT

Related MCP Connectors

Related MCP Servers