Nutrition MCP について
Nutrition MCPは、会話を通じて食事を記録し、栄養、水分、身体測定を確認したい人向けのホスト型サーバーです。食事履歴のインポート、食品検索、定番メニュー、目標、履歴の要約を備え、対応クライアントではチャットウィジェットも利用できます。
主な機能
- 01食事と栄養の詳細記録
- 02食品とバーコード商品の検索
- 03CSVによる食事記録のインポート
- 04水分、体重、身体測定の記録
- 05目標設定と傾向の確認
- 06チャットウィジェットと週次サマリーリソース
活用シーン
- 01テキストや料理写真から食事を記録
- 02別のトラッカーから食事履歴を移行
- 03栄養目標と毎日の摂取量を比較
- 04体重と栄養の傾向を長期的に確認
MCP 対応
栄養記録、食品検索、インポート、目標、履歴用のMCPツールと週次サマリーリソースを提供します。https://nutrition-mcp.com/mcp からリモートサーバーに接続できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://nutrition-mcp.com/mcpclaude mcp add --transport http nutrition https://nutrition-mcp.com/mcp{"mcpServers":{"nutrition":{"type":"http","url":"https://nutrition-mcp.com/mcp"}}}Cursor で開く{"servers":{"nutrition":{"type":"http","url":"https://nutrition-mcp.com/mcp"}}}VS Code で開く{"mcpServers":{"nutrition":{"type":"http","url":"https://nutrition-mcp.com/mcp"}}}{"mcpServers":{"nutrition":{"serverUrl":"https://nutrition-mcp.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Nutrition MCP
個人向けの栄養管理を行うリモート MCP サーバーです。会話を通じて、カロリー、マクロ栄養素、食物繊維、糖類(総量および添加糖)、飽和脂肪酸とトランス脂肪酸、ナトリウム(1日の上限を任意で設定可能)、カフェイン(任意で食材ごとに記録可能)を含む食事の記録、USDA FoodData Centralでの一般食品の検索、Open Food Factsでのバーコードによる市販製品の検索、各栄養価の出典の記録、よく食べる食事の保存と名前での再記録、水分、体重、身体測定値の記録、栄養履歴の確認、他のアプリからの既存の食事日記のインポートを行えます。アルコールの記録はオプトイン方式で、デフォルトではオフです。ウェブサイトとチャット内ウィジェットは英語、ドイツ語、スペイン語、フランス語、オランダ語、ポーランド語、イタリア語、ウクライナ語、日本語、トルコ語に対応しています。set_languageでウィジェットの言語を選択できます。
目次
- クイックスタート
- デモ
- 技術スタック
- MCP ツール
- MCP リソース
- セルフホスティング
- 開発
- Claude.ai に接続
- Apple Health の同期
- トラブルシューティング
- API エンドポイント
- デプロイ
- サポートとセキュリティ
- データソース
- ライセンス
クイックスタート
ホスティング済みですぐに利用できます。MCP クライアントに接続するだけです。
https://nutrition-mcp.com/mcp
Claude.ai の場合:Claude ディレクトリの Nutrition MCPを開き、Connectをクリックしてください(下記のClaude.ai に接続を参照)。
初回接続時に、Google でサインインするか、メールアドレスとパスワードを入力してアカウントを作成を選択してください。再接続後もデータは保持されます。接続に問題がある場合は、トラブルシューティングをご覧ください。
接続すると、利用規約に同意したことになります。データの取り扱いについてはプライバシーポリシーをご覧ください。
別のトラッカーから乗り換えますか?栄養管理アプリの代替サービスをご覧ください。MyFitnessPal、Cronometer、Lose It!、MacroFactor、Yazio、Lifesumとの比較を確認できます。これまでの履歴も引き継げます。「食事をインポートして」と伝えるとチャット内でインポーターが開き、以前のアプリからエクスポートした CSV を選択し、列を対応付けて、保存前に追加内容を確認できます。MyFitnessPal、Cronometer、Lose It!、MacroFactor のエクスポートは自動で認識されます。それ以外の CSV も、列を手動で対応付ければインポートできます。チャット内パネルを表示できないクライアントでは、エクスポート内容を貼り付けると AI がインポートします。エクスポートにアルコールの列があり、それも保持したい場合は、インポート前にアルコールの記録をオンにしてください。記録がオフの間、インポーターはその列を読み飛ばすため、後から同じファイルを再インポートしても、その分は補完されません。
デモ
開発の背景はこちらをご覧ください:MyFitnessPalなどのアプリを単一のMCPサーバーに置き換えた方法
技術スタック
- Bun — ランタイムおよびパッケージマネージャー
- Hono — HTTP フレームワーク
- MCP TypeScript SDK v2(
@modelcontextprotocol/server)と Zod 4 スキーマ — Streamable HTTP による Model Context Protocol。2026-07-28と2025-11-25の両方のプロトコル改訂に対応します - Supabase — PostgreSQL データベースとユーザー認証
- OAuth 2.0 — Claude.ai およびその他の MCP クライアント向け認証:クライアントごとの動的クライアント登録(RFC 7591)、リダイレクト URI の完全一致、必須の PKCE(
S256)、トークンエンドポイントでのクライアント認証(none、client_secret_post、client_secret_basic)、発行先クライアントにひも付けられた認可コードとリフレッシュトークン、すべての認可レスポンスに含まれるiss(RFC 9207)、SHA-256 ハッシュとしてのみ保存されるクライアントシークレット、アクセストークン、リフレッシュトークン、認可コード。アクセストークンの有効期間は 24 時間です。リフレッシュトークンの有効期間は最終使用時から 90 日間で、更新のたびにローテーションされます。有効期限切れのトークンと一度も使用されていないクライアント登録は、1 時間ごとに削除されます
MCP ツール
| ツール | 説明 |
|---|---|
log_meal | 説明、種類、カロリー、マクロ栄養素、食物繊維、糖類と添加糖、飽和脂肪とトランス脂肪酸、ナトリウム(mg)、アルコール、カフェイン(mg)、メモを含む食事を記録します。テキストまたは食事の写真から記録でき、各値にはデータの出典が記録されます |
start_meal_import | チャット内のCSVインポーターを開きます。別のアプリからエクスポートしたファイルを選び、列を対応付け、プレビューして確定します |
bulk_import_meals | 1回の呼び出しで最大50件のインポート行を書き込みます。各行は検証され、重複はスキップされるため、タイムゾーンが変わらない限り安全に再送できます |
lookup_barcode | Open Food Factsを使ってバーコードから包装食品の栄養表示を検索します。表示されている場合は添加糖も含みます(写真から読み取るか、手入力できます。データ © OFF contributors、ODbL) |
search_foods | 英語名でUSDA FoodData Centralの一般食品を検索します。100 gあたりのIDとマクロ栄養素を含む候補を最大10件返します |
get_food_macros | USDA FoodData CentralからIDで一般食品1件の値を取得します。100 gあたり、またはamount_gに合わせた値と、記載されている分量を返します |
get_meals_today | 今日記録したすべての食事を、食事ごとにIDを含む簡潔な1行で取得します。detail: "full"を指定するとメモも含まれます |
get_meals_by_date | 指定日の食事(YYYY-MM-DD)を、食事ごとに簡潔な1行で取得します。detail: "full"を指定するとメモも含まれます |
get_meals_by_date_range | 2つの日付の間(両端を含む)の食事を取得します。1回の呼び出しで最大31日分を取得できます。食事ごとに簡潔な1行で返し、detail: "full"を指定するとメモも含まれます |
search_meals | キーワード(食材名を含む)で過去の食事と名前で保存済みの食事を検索し、繰り返し登場するバリエーションごとにまとめて返します(回数、最終記録日、典型的なマクロ栄養素) |
get_nutrition_summary | 指定期間の日ごとの栄養摂取量合計と目標の達成状況を取得します。1回の呼び出しで最大92日分を取得できます |
get_digest | 1期間(昨日、今日の現時点まで、過去7日間または30日間)のダイジェストを取得します。カロリーと栄養素の目標に対する状況、傾向、水分と体重、食事または記録の習慣、ユーザー自身の記録からの注目点を含みます |
update_meal | 既存の食事の任意の項目を更新します |
delete_meal | IDを指定して食事を削除します |
save_meal | 食事を名前付きで保存します。1食分あたりの値と任意の食材を設定でき、後から再度記録できます |
log_saved_meal | 保存済みの食事を分量に応じて記録します。個別の食材は、食べた量に設定するか、除外できます |
get_saved_meals | 保存済みの食事を、値と食材とともに一覧表示します。名前で絞り込むこともできます |
update_saved_meal | 保存済みの食事の名前、値、食材を変更します。そこからすでに記録した食事の内容は保持されます |
delete_saved_meal | 保存済みの食事を削除します。そこからすでに記録した食事の値は保持されます |
set_nutrition_goals | 目指す1日のカロリー、マクロ栄養素、食物繊維、水分の目標値と、上限とする糖類/添加糖/飽和脂肪/アルコール/カフェイン/ナトリウムの値、および任意の目標体重を設定します |
get_nutrition_goals | 現在の1日の目標値と上限値を取得します |
get_goal_progress | 指定日の摂取量と目標値・上限値の比較を取得します(既定値:今日)。最新の体重と目標体重の比較も含まれます |
log_water | 水分摂取をミリリットル単位で記録します |
get_water_today | 今日の水分摂取量の合計と記録を取得します |
get_water_by_date | 指定日の水分摂取量を取得します |
delete_water | IDを指定して水分の記録を削除します |
log_weight | 体重をkgまたはlbで記録します(サーバー側で換算して保存されます) |
get_weight_today | 今日の体重記録を取得します |
get_weight_by_date | 指定日の体重記録を取得します |
get_weight_by_date_range | 2つの日付の間(両端を含む)の体重記録を日ごとにまとめて取得します。1回の呼び出しで最大366日分を取得できます |
get_weight_trends | 体重の傾向を取得します。平滑化した傾向体重、週あたりの変化率、最新値、全期間の変化、最小値/最大値、目標の達成状況を含みます。ウィジェットでは7日、30日、90日、1年、または全履歴にズームできます |
update_weight | 既存の体重記録を更新します |
delete_weight | IDを指定して体重記録を削除します |
set_weight_unit | 使用する体重の単位(kgまたはlb。解除する場合はnull)を設定します |
log_body_measurement | メジャーで測定した部位(ウエスト、ヒップ、首、胸囲、肩幅、上腕、前腕、太もも、ふくらはぎ)をcmまたはinで記録します |
get_body_measurements | 日ごとの身体測定値を一覧表示します。任意で部位を1つ指定できます。既定では直近30日分、1回の呼び出しで最大366日分を取得できます |
update_body_measurement | 測定値、単位、時刻、メモを更新します(部位は変更できません) |
delete_body_measurement | IDを指定して身体測定記録を削除します |
set_length_unit | 使用する長さの単位(cmまたはin。解除する場合はnull)を設定します |
get_trends | 7/14/30日間の平均、標準偏差、連続記録日数、最良/最悪の日を取得します。group_byで週/月/四半期/年ごとに集計すると、各暦期間について、記録した日あたりの平均を、その時点で有効な目標と比較して取得できます |
get_meal_patterns | 集計済みの食行動パターンを取得します(朝食の影響、遅い夕食、週末と平日の比較、外れ値) |
export_all_data | 記録、保存済みの食事と食材、各栄養素の値の出典、目標、プロフィール、アカウント、テレメトリー、アプリ接続、Apple Healthとの同期記録など、保存されているユーザーの全データをCSVとREADMEをまとめたZIPとしてエクスポートします。有効期間60分のリンクを提供します |
get_profile | タイムゾーン(および現地の日付/時刻)、ウィジェットの言語、体重と長さの単位、ウィジェットの表示設定、アルコールの記録設定、Apple Healthとの同期状況を1回の呼び出しで取得します |
set_timezone | ユーザーのIANAタイムゾーンを設定します(例:America/Los_Angeles) |
set_language | チャット内ウィジェット(ダッシュボード、グラフ)のUI言語を設定します。AIの返答言語には影響しません |
get_current_time | ユーザーのタイムゾーンで現在の日付と時刻、およびUTC時刻を取得します。コンテキストに時計がないホスト向けです |
set_widget_display | チャット内のビジュアルウィジェット(ダッシュボード、リング、グラフ)を有効または無効にします。既定では有効です |
set_alcohol_tracking | アルコールの記録をオンまたはオフにし(既定ではオフ)、US標準ドリンクまたはUK単位を選択します。オフにしてもアルコールは削除されず、非表示になります |
delete_account | ユーザーのNutrition MCPアカウントと、保存されているすべてのデータを完全に削除します |
MCP リソース
| URI | 説明 |
|---|---|
nutrition://weekly-summary | 直近7日間の概要(目標に対する平均、最良の日/最も調子の悪かった日)。先回りした取得に利用します |
チャット内ウィジェット
MCP Apps に対応したホストでは、ツールによってチャット内にカードも表示されます。各カードには、テキストの回答と同じ数値が表示されます。
- 栄養サマリー(
get_nutrition_summary)および食事の記録(log_meal、update_meal、log_saved_meal):カロリーの半円ゲージです。1日の場合、弧は食事ごとに分割され、期間の場合は平均値とピーク日の値が表示されます。さらに表示を開くと、栄養素が表示されます。それぞれに独自のミニゲージがあり、展開すると、その栄養素の由来となった食事や食材に加えて、期間の場合は日別の一覧と食事ごとのカロリーも表示されます。この一覧には、ナトリウム、飽和脂肪、トランス脂肪が含まれます。食事の記録カードは、目標が設定されている場合にのみ表示されます。 - 目標の進捗(
get_goal_progress):1日の摂取量と目標・上限を照らし合わせた値、および最新の体重と目標体重です。 - 傾向(
get_trends):7/14/30日を切り替える機能と、棒グラフ上で栄養素を切り替える機能があり、栄養素ごとにカードが表示されます。 - 体重の傾向(
get_weight_trends):7日、30日、90日、1年、または全期間にズームできる、経時的な体重の推移です。 - ダイジェスト(
get_digest):1期間の内容を折りたたみ可能なセクションで表示します。カロリーと栄養素の目標との比較、傾向、水分と体重、食事または記録の習慣、注目点が含まれます。 - インポート(
start_meal_import):CSV インポーターです。ファイルはブラウザー内で読み込まれ、マッピングとプレビューを行ってから保存されます。
カードはホストのライトテーマまたはダークテーマ、および set_language で設定した言語に従います。カードはデフォルトで有効です。set_widget_display で無効にできます。テキストの回答には変更ありません。
セルフホスト
Cloudflare のホスティング方法と、独立した Workers の参考情報については、 Cloudflare のホスティングとメール認証を参照してください。このガイドでは、この Bun/Supabase アプリケーションをコンテナーで実行する方法と、機能を絞って Workers と D1 に適応させる方法を区別して説明しています。
0. コードを取得する
git clone https://github.com/akutishevsky/nutrition-mcp.git
cd nutrition-mcp
bun install
cp .env.example .env # fill in real values as you go through the steps below
Bun 1.x が必要です(Dockerfile の oven/bun:1 ベースイメージと一致します。マイナーバージョンは固定されていません)。
bun run gen:all を実行すると、サーバーを起動せずに公開サイトのページを再生成できます。
自分用に変更する場合: 公開サイトには、メンテナー個人に関する項目(Google Analytics、Microsoft Clarity、Patreon/GitHub/連絡先へのリンク、
nutrition-mcp.comドメイン)が含まれています。bun run gen:allを実行して公開ページを生成した後、bun run depersonalizeを実行すると、個人に関する項目(同意後に読み込まれる分析スニペット、同意バナーとフッターの「Cookie settings」ボタン、分析用 CSP ホスト、サポート/連絡先セクション、ソーシャルリンク、ドメインをyour-domain.comに置き換える処理)をまとめて削除できます。書き込みをせずに変更内容を確認するには、bun run depersonalize --dryを実行します。その後、独自のpublic/og.png、favicon.ico、favicon.svg、apple-touch-icon.png、icon-192.png、icon-512.pngに差し替え、ドメインのプレースホルダーを実際のドメインに置き換え、プライバシーポリシーと利用規約の分析に関する段落(src/copy/legal*.ts)を書き換えてください。これらには、引き続き両サービスの名前が記載されています。生成されたページへの変更はbun run gen:allを実行すると元に戻ります。再生成するには、まず読み込み元のファイルを変更してください(scripts/site-partials.tsのGA_MEASUREMENT_ID/CLARITY_PROJECT_IDを独自の値にするか、ANALYTICS_ENABLEDを false に設定してスニペット、バナー、ボタンをまとめて削除します。analyticsHead()は訪問者が同意バナーで同意した後にのみ読み込みます。また、src/routes.tsのSITEも変更してください)。その後、もう一度実行します。このスクリプトが変更するのは、public/以下の生成ファイル、インポートウィジェットのサポート用メールアドレス、src/index.ts、src/security-txt.tsの security.txt の連絡先のみです(空欄にされるため、独自の連絡先を設定するまで/.well-known/security.txtは 404 を返します)。この README やSECURITY.mdは変更しません。そのため、独自のフォークを公開する場合は、デプロイ環境に合わせてSECURITY.mdを書き換え、このファイル上部付近の Patreon の行とデモ内の Medium リンクも編集または削除してください。
1. Supabase のセットアップ
-
Supabase プロジェクトを作成します。
-
Email Auth を有効にし(Authentication → Providers → Email)、メール確認を無効にします。
-
スキーマを適用します。完全なスキーマは
supabase/migrations/にあります。Supabase CLI を使用する場合:supabase link --project-ref <your-project-ref> supabase db pushこれにより、アプリに必要なすべてのテーブル、インデックス、RLS ポリシー、外部キーが作成されます。ローカルの Postgres は使用しません。マイグレーションはホストされたプロジェクトに対して実行されます。
-
Project Settings → API から service role key をコピーし、
SUPABASE_SECRET_KEYとして使用します。
2. 環境変数
| 変数 | 説明 |
|---|---|
SUPABASE_URL | Supabase プロジェクトの URL |
SUPABASE_SECRET_KEY | Supabase のサービスロールキー(RLS をバイパスします) |
OAUTH_CLIENT_ID | (optional, legacy) 事前登録された静的 OAuth クライアントの ID です。クライアントは現在、POST /register を通じて自身を登録します。レガシークライアントが廃止されるまで、古い接続を維持するためだけに使用されます |
OAUTH_CLIENT_SECRET | (optional, legacy) レガシー静的 OAuth クライアントのシークレットです |
ALLOWED_ORIGINS | (optional) CORS 経由で /mcp の呼び出しを許可する、追加のブラウザーオリジンをカンマ区切りで指定したリストです。ポートを問わず localhost/127.0.0.1 は常に許可されます |
GOOGLE_CLIENT_ID | (optional) 「Google でログイン」用の Google OAuth クライアント ID です |
GOOGLE_CLIENT_SECRET | (optional) Google OAuth クライアントシークレットです |
OFF_USER_AGENT | バーコード検索用の Open Food Facts User-Agent です。形式は AppName (email) です |
USDA_API_KEY | (optional) search_foods と get_food_macros 用の USDA FoodData Central API キーです。設定しない場合、これらのツールは USDA データが設定されていないことを報告します |
PATREON_CLIENT_ID | (optional) ランディングページのサポートセクションに最近の投稿を表示するための Patreon OAuth クライアント ID です |
PATREON_CLIENT_SECRET | (optional) Patreon OAuth クライアントシークレットです |
PATREON_CAMPAIGN_ID | (optional) 投稿の取得元となる Patreon キャンペーン ID です |
PATREON_ACCESS_TOKEN | (optional) Patreon のクライアント管理ページで取得したクリエイターの Access Token です。初回設定時に一度だけ使用するシード値です。以下を参照してください |
PATREON_REFRESH_TOKEN | (optional) 同じページで取得したクリエイターの Refresh Token です。初回設定時に一度だけ使用するシード値です。以下を参照してください |
PUBLIC_BASE_URL | (optional) Apple Health ショートカットの接続先となる公開オリジン(例:https://your-domain.example)です。nutrition-mcp.com 以外にデプロイする場合は設定してください。設定しない場合、そのデプロイでペアリングしたスマートフォンは本番サイトに送信されます |
HEALTH_SYNC_SHORTCUT_URL | (optional, build time) 公開済みの Nutrition MCP Health ショートカットへの https://www.icloud.com/shortcuts/… リンクです。/apple-health にインストールボタンとして表示されます。NOINDEX のような Dockerfile ビルド引数です。設定しない場合、ページにはショートカットが近日公開予定と表示されます |
PORT | サーバーポート(既定値:8080) |
NOINDEX | (optional) 空でない値を設定すると、すべてのレスポンスに X-Robots-Tag: noindex, nofollow が送信されます。また、開発環境またはステージング環境へのデプロイ向けに、生成されるページから Google Analytics、Clarity、同意バナー(フッターの「Cookie settings」ボタンを含む)が除外されます。ページはビルド時に生成されるため、ビルド時にも設定する必要があります |
ADDED_SUGAR_REQUIRED_FROM | (optional) log_meal/update_meal が、added_sugar_g を指定せずに sugar_g が渡された場合に拒否する開始日時を示す ISO-8601 の日時(オフセット付きの日付または日時)です。未設定、空、または解析不能の場合、このルールは無効になります。added_sugar_g を最初に告知したデプロイより十分後の日付を設定してください。ホストはツール一覧を数日間キャッシュするため、古い一覧を使うクライアントはこのフィールドを送信できません |
レガシーのみ — 新規デプロイでは不要です。各クライアントが POST /register を通じて独自の認証情報を登録するためです。レガシーの静的クライアント用に省略可能な OAUTH_CLIENT_* のペアを設定するには: |
bun run generate-oauth-creds
または、手動で設定します:
openssl rand -hex 16 # use as OAUTH_CLIENT_ID
openssl rand -hex 32 # use as OAUTH_CLIENT_SECRET
Patreon の投稿、初回セットアップ:
PATREON_ACCESS_TOKEN/PATREON_REFRESH_TOKENが読み取られるのは、サーバー起動時にpatreon_tokensテーブルがまだ空の場合に初期データを登録するときの一度だけです。その後はサーバーが独自のペアを更新して保存するため、この 2 つを設定したままにしても安全です(以降の起動時には何も行われません)。データベースを手動で操作する必要はありません。
3. Google サインイン(省略可)
メールアドレスとパスワードは、すぐに使用できます。**「Google で続行」**も提供するには、
docs/google-auth-setup.md に従って
Google OAuth クライアントを作成し、Supabase で Google プロバイダーを有効にして、
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET を設定してください。これにより POST /authorize/google
と GET /auth/google/callback のルートが追加されます。API エンドポイントを参照してください。
開発
bun install
cp .env.example .env # fill in your credentials — see Self-hosting above for what to put here
bun run dev # regenerates public/ pages, then starts with hot reload on http://localhost:8080
public/ 以下に生成されるページ(index、tools、privacy、terms、login、/alternatives、ロケール別ミラー、sitemap.xml)はビルド成果物であり、git では管理されません。Docker ビルド時、CI 時、および bun run dev の開始時に毎回生成されます。--watch は保存時に src/index.ts のプロセスを再起動するだけで、生成処理は再実行されません。src/copy/、src/routes.ts、または scripts/site-partials.ts を編集した後は、変更を反映するために bun run gen:all を自分で実行してください。
テストと品質
bun test # run the test suite
bun run format # format with Prettier (4-space indentation)
bun run format:check # verify the tree is prettier-clean
bun run typecheck # typecheck src/
CI はすべての PR で format:check と typecheck を実行します。typecheck の対象は src/ に限定されているため、テストファイルまたは scripts/ 以下の型エラーは検出されません。
チャット内ウィジェット(public/widgets/)を開発する場合は、bun run harness でローカルホストシミュレーターを起動すると、実際の MCP クライアントなしでウィジェットをテストできます。
Claude.ai に接続する
- Claude ディレクトリの Nutrition MCPを開きます
- 接続をクリックします
- プロンプトが表示されたら、サインインまたは登録します
- 完了です。Claude で栄養管理ツールを使用できるようになります
または、カスタマイズ → コネクターで https://nutrition-mcp.com/mcp をカスタムコネクターとして追加します。後で再接続する場合は、データを保持するため、同じメールアドレスとパスワードでサインインしてください。
Apple Health との同期
オプションの iOS ショートカット Nutrition MCP Health を使うと、iPhone の Apple Health に、毎日の合計値(カロリー(食事エネルギー)、タンパク質、炭水化物、総脂質、食物繊維、カフェイン)をコピーできます。接続時にオプトインした場合は、水分量もコピーされます。アルコールは送信されません。また、ナトリウム、飽和脂肪酸、トランス脂肪酸、糖類も送信されません。インストールするアプリも、新しい MCP ツールもありません。ログの記録は引き続き AI アプリが行い、ショートカットは記録が完了した日だけを読み取ります。インストールリンク、接続方法、自動化、日常的な使い方を説明したセットアップガイドは nutrition-mcp.com/apple-health にあります(ショートカットの公開後に、こちらにインストールリンクが表示されます)。ショートカットの仕組みについては docs/apple-health-shortcut.md をご覧ください。
- 接続方法: iPhone でショートカットを実行します。水分量を含めるか、過去7日分も送信するかを尋ねた後、Safari でサインインページが開きます。AI アプリで使っているものと同じアカウントでサインインしてください。ページからショートカットに操作が戻り、接続が完了します。接続リンクは1回限り有効で、有効期限は30分です。接続を完了できるのは、接続を開始した iPhone だけです。
- 送信されるデータ: 記録が完了した日だけが送信されます。お使いのタイムゾーンで翌朝05:00になると、その日の記録が完了したと見なされます。そのため、昨日のデータは今日の05:00以降に表示され、今日のデータが Health に送信されることはありません。各種類につき1日1件、12:00に「Shortcuts」というラベルで記録されます。同期のたびに、過去7日間の記録が完了した日を確認するため、朝の同期を逃しても自動で追いつきます。
- 後から変更した場合: すでに送信済みの日に食事を追加すると、その日が過去7日間の範囲内であれば、小さな追加記録(12:01、12:02、…)として送信されます。Health では値を減らせないため、食事を削除したり量を減らしたりすると、Health の値は以前より高いままになります。その場合、ショートカットに、その日の記録を手動で修正する方法を示す通知が表示されます。
- 実行されるタイミング: Health アプリを開いたとき、アラームを止めたとき、オプションで充電器に接続したときなど、自動化が実行されたときです。または、ショートカットで 今すぐ同期 を選んだときです。
- サーバーに保存されるデータ: 接続情報と、送信したデータを8日間保存します。これにより、各日のデータは1回だけ送信され、その後は不足分だけが追加されます。いずれもデータエクスポートに含まれます(
health_sync.csvと、connections.csv内のhealth_sync行)。同期が90日間行われない場合、または接続から最長365日が経過した場合に接続は終了します。ショートカットの 接続解除 を選ぶか、アカウントを削除すると、すぐに接続が解除されます。Apple Health からデータが削除されることはありません。データは iPhone に保存されます。 - プロフィールのタイムゾーン によって、1日の区切りが決まります。タイムゾーンを設定していない場合は、接続時に iPhone から報告されたタイムゾーンが使われます。
get_profileで、同期が接続されているか、どの日まで送信済みかを確認できます。
データについて
export_all_data は、アカウントに保存されているすべての情報を1つの ZIP ファイルとして返します。ZIP ファイルへのリンクは60分後に期限切れになります。エクスポートのたびに、前回のエクスポートは置き換えられます。ZIP ファイルには次のファイルが含まれます。
meals.csvとmeal_items.csv— すべての食事とその食材、および各栄養素の値の出典。meals.csvはインポート時の列名を使用しているため、再インポートできます。saved_meals.csvとsaved_meal_items.csv— 保存済みの食事とその食材。water.csv、weight.csv、body_measurements.csv— すべての記録。goals.csvとgoals_history.csv— 現在の目標値と上限値、およびそれらの変更履歴。profile.csvとaccount.csv— 設定とアカウントの詳細。telemetry.csv— アカウントに保持されるツール呼び出しのログ。connections.csv— Apple Health の同期リンクを含む、アカウントに接続されているアプリ。health_sync.csv— 過去8日間に Apple Health へ送信された日ごとのデータ。README.txt— タイムスタンプに使用されるタイムゾーン、ミリグラム単位の列、インポート可能なファイルについての説明。
すべてのタイムスタンプには、その隣に timezone 列があります。行がない場合も、各ファイルにはヘッダーが含まれます。
トラブルシューティング
10言語に対応した完全版は nutrition-mcp.com/tools#troubleshooting にあります。概要は次のとおりです。
- 接続できない、またはサインインを何度も求められる場合: コネクターを削除し、正確に
https://nutrition-mcp.com/mcpを指定して追加し直してから、以前と同じメールアドレスとパスワード(または Google アカウント)でサインインしてください。データは接続ではなくアカウントに保存されています。少なくとも90日ごとに使用すれば、接続は維持されます。 - サインインページに
{"error":"session_expired"}と表示される場合: ページの有効期限は10分で、サーバーの再起動時にリセットされます。ページを再読み込みするか、接続をやり直してください。session_mismatchは、ページを開いたブラウザーとは別のブラウザーでサインインを完了したことを意味します。 - サインインできない/パスワードを忘れた場合: 既存のアカウントには Sign in を使用してください。メールアドレスまたはパスワードが間違っていると「Wrong email or password」と表示され、新しいアカウントが作成されることはありません。初めて利用する場合のみ Create account を使用してください。Google で登録した場合は、Continue with Google を使用してください。セルフサービスでのパスワードリセットにはまだ対応していません。アカウントに登録したアドレスから [email protected] にメールしてください。
- 再接続後に履歴が消えた場合: メールアドレスごとに別のアカウントになります。最初に使用したアドレスでサインインしてください。
- AI が回答するのに記録されない場合: 会話でコネクターが有効になっていることを確認し、明示的に依頼して、ツールの権限を求めるプロンプトを承認してください。
- 食事が間違った日に記録される場合: 日付はタイムゾーンに従います(設定するまでは UTC です)。
set_timezoneで設定してください。過去の記録は再振り分けされますが、タイムゾーンが間違っていたときに特定の時刻を指定して記録した項目は、その時刻のままです。update_mealで修正してください。履歴をインポートする前にタイムゾーンを設定してください。タイムゾーンを変更した後で別のアプリのファイルを再インポートすると、行が再度追加されます(Nutrition MCP のエクスポートは認識され、重複しません)。 - グラフやカードが表示されない場合: ウィジェットを使用するには、MCP Apps に対応したホストが必要です。
set_widget_displayの実行後、新しい会話を開始してください。食事記録カードは、目標を設定した後にのみ表示されます。 - インポーターが開かない、または保存できない場合:
bulk_import_mealsを使ってファイル自体をインポートするよう AI に依頼してください(重複はスキップされるため、その間にタイムゾーンが変更されていなければ再送しても安全です。最初のインポート前にタイムゾーンを設定してください)。インポーターパネルを使い、アルコールの列を保持したい場合は、先にアルコールの追跡を有効にしてください。追跡がオフの場合、パネルはその列をスキップします。 - 「Rate limit exceeded」/「Too many failed authentication attempts」と表示される場合: アカウントごとに毎分60件、サインインページではネットワークごとに毎分30件のリクエストが可能です。接続試行が連続して20回拒否されると、ネットワークは5分間一時停止され、最大1時間まで延長されます。通常は古いコネクターが再試行しています。削除して追加し直してください。
- バーコードが見つからない、または情報が間違っている場合: データは Open Food Facts から取得されます(8~14桁。カフェインのデータはありません。添加糖は製品に記載されている場合のみ取得され、Open Food Facts が原材料から推定した場合はその旨が示されます)。製品が見つからない場合は、名前またはラベルの写真から数値を入力できます。
- 時刻を指定するまで USDA のデータが利用できない場合: USDA FoodData Central の検索(
search_foods、get_food_macros)では、全ユーザーで共有する1時間あたりの上限があります。USDA の上限に達した場合、またはキーの1時間あたりの許容量をほぼ使い切った場合、検索は60分間一時停止されます。各ユーザーにも1時間あたり30回の上限があります。過去30日以内に検索した食品は、一時停止中も引き続き利用できます。USDA の食品名は英語なので、英語の食品名で検索してください。 - Apple Health に昨日のデータがまだない場合: その日のデータは、タイムゾーンの翌朝05:00に日付が確定してから送信されます。その後の同期(Health を開く、アラームを停止する、または Sync now)で反映されます。同期のたびに過去7日分が対象になります。
- Apple Health の数値がチャットより多い場合: Health では、すでに登録されている値を小さくできません。ショートカットの Health → Browse → Nutrition → (種類) → Show All Data から、その日の記録を削除し、正しい合計を手動で入力してください。「Delete All Data from Shortcuts」は絶対に使用しないでください。他のショートカットが記録したデータも削除されます。すべての日の数値が二重になっている場合は、別のアプリが同じ種類のデータを書き込んでいます。Health → Sharing → Apps で、いずれかをオフにしてください。
- Apple Health の同期が停止した場合: Nutrition MCP Health を手動で実行し、原因を確認してください。再接続を求められた場合(同期せずに90日が経過した、接続から365日が経過した、または Disconnect の後)、開いたページで30分以内にサインインしてください。手動でしか同期されない場合は、自動化がオンになっていて、Run Immediately に設定されていることを確認してください。ある日のデータが Health に届かなかったという通知が表示された場合は、Health → Sharing → Apps → Shortcuts ですべての栄養素の書き込みを許可してください。
- エクスポートリンクが機能しない場合: リンクの有効期限は60分で、エクスポートのたびに前のリンクが置き換わります。新しいリンクをリクエストしてください。履歴があるはずなのにエクスポートの食事数が0と報告される場合は、別のメールアドレスでサインインした可能性があります。
- アカウントを削除する場合:
delete_accountを実行すると、確認後にすべてのデータが完全に削除されます。コピーが必要な場合は、先にエクスポートしてください。 - 問題を報告する場合: バグは GitHub Issues で報告してください(パスワードは絶対に記載しないでください)。セキュリティ上の問題は、SECURITY.md の説明に従って非公開で報告してください。
API エンドポイント
| エンドポイント | 説明 |
|---|---|
GET /health | ヘルスチェック |
GET /.well-known/oauth-authorization-server | OAuth メタデータの検出(ルートおよび /mcp スコープのバリアント) |
GET /.well-known/oauth-protected-resource | OAuth 保護リソースメタデータの検出(ルートおよび /mcp スコープのバリアント) |
POST /register | 動的クライアント登録(RFC 7591)— クライアントごとに登録し、リダイレクト URI を適用 |
GET /authorize | OAuth 認証(ログインページを表示) |
POST /authorize/google | ログインページのフォーム。Google の同意画面にリダイレクトします |
GET /auth/google/callback | Google OAuth コールバック — コードを交換し、サインインを完了します |
POST /approve | ログイン/登録ハンドラー |
POST /token | トークン交換 — クライアント認証が必要で、redirect_uri と PKCE 検証子を必須とします |
GET /.well-known/security.txt | セキュリティ連絡先(RFC 9116)。Expires は毎日更新されます |
GET /security.txt | /.well-known/security.txt への 301 リダイレクト |
GET /favicon.ico | サーバーアイコン |
GET /favicon.svg | サイトアイコン(SVG) |
GET /api/stats | ランディングページの合計値(食事、カロリー、マクロ栄養素、タイムゾーン)。集計データのみ |
GET /api/patreon-posts | ランディングページのサポートセクションに表示する最近の Patreon 投稿 |
GET /api/github-stars | サイトの GitHub ボタンに表示する、キャッシュ済みの GitHub スター数 |
POST /api/v1/health-sync/start | Apple Health 同期:ショートカットから接続を開始します(接続リンクを返します) |
GET /health-sync/connect/:id | Apple Health 同期:接続リクエスト用の通常のサインインページを開きます |
GET /health-sync/callback | Apple Health 同期:サインインコールバック。クレームコードをショートカットに返します |
POST /api/v1/health-sync/claim | Apple Health 同期:クレームコードとデバイスシークレットを同期トークンに交換します |
GET /api/v1/health-sync/pending | Apple Health 同期:記録する締め日済みの合計値(Bearer nmhs_… トークン) |
POST /api/v1/health-sync/ack | Apple Health 同期:ショートカットが記録した内容を記録します(Bearer トークン) |
POST /api/v1/health-sync/revoke | Apple Health 同期:接続を解除します(Bearer トークン) |
ALL /mcp | MCP エンドポイント(認証済み) |
デプロイ
このプロジェクトには、コンテナベースのデプロイ用に Dockerfile が含まれています。
- リポジトリをホスティングプロバイダー(例:DigitalOcean App Platform)にプッシュします
- 上記の環境変数を設定します
- アプリが
Dockerfileを自動検出し、ポート8080でデプロイされます - デプロイされた URL にドメインを向けます
サポートとセキュリティ
- ヘルプ、バグ、機能リクエスト: GitHub issueを作成するか、[email protected] までメールでお問い合わせください。
- セキュリティの脆弱性: 公開 issue は作成しないでください。GitHub の非公開の脆弱性報告から非公開で報告するか、[email protected] までメールでご連絡ください。詳しくはSECURITY.mdをご覧ください。機械可読な連絡先:https://nutrition-mcp.com/.well-known/security.txt
- アカウントの削除/データについて:
delete_accountおよびexport_all_dataツールを利用するか、上記のメールアドレスまでご連絡ください。プライバシーポリシーをご覧ください。
食品データソース
栄養成分の数値は3つのデータソースに由来し、各栄養素の値には、どのデータソースに由来するか(ユーザー、ラベルまたはバーコードの記録、USDA、推定値)が記録されます。チャット内ウィジェットでは、食事ごと、食材ごとに各数値の横にタグでデータソースが表示され、エクスポートには nutrient_sources として含まれます。値に USDA または Open Food Facts のタグが付くのは、記録した量に対してその記録の値と一致する場合のみです。サーバーがこれを確認するため、実際には一致しないデータソースを値に付けることはできません。
USDA FoodData Central(search_foods、get_food_macros)は、Foundation、SR Legacy、Survey(FNDDS)のデータタイプに含まれる、一般的なブランド名のない食品を対象としています。100 g あたりの値を、食べたグラム数と USDA が記載する分量に合わせて換算します。データは英語のみのため、食品名は英語で検索してください。USDA がその食品について記録していない栄養素は、未記録として報告され、ゼロとして表示されることはありません。リクエストでは、検索語(整形済みで最大200文字)または FoodData Central ID を、このサーバーのキーとともに USDA の API に送信し、ユーザー識別子は送信しません。
fdc.nal.usda.gov に基づく FoodData Central の推奨引用形式:
U.S. Department of Agriculture, Agricultural Research Service, Beltsville Human Nutrition Research Center. FoodData Central. [Internet]. [cited 2026-10-10]. Available from https://fdc.nal.usda.gov/.
Nutrition MCP は U.S. Department of Agriculture の承認を受けていません。
Open Food Facts(lookup_barcode)は、バーコードで検索した包装食品について、Open Food Facts の製品データを使用します。製品データ © Open Food Facts contributors。Open Database License (ODbL) に基づいて利用できます。検索結果にはすべて Open Food Facts とライセンスが明記されます。
記録がない値は推定値、またはユーザーが共有したラベルの値です。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
