foodvisor-mcp
foodvisor-mcp
Foodvisorの栄養APIをLLMエージェント(Claude、Cursorなど)に公開するリモートModel Context Protocolサーバーです。アシスタントから直接、食品の検索、食事の記録、進捗やマクロ栄養素の取得が可能です。
免責事項 本プロジェクトは非公式です。FoodvisorのプライベートモバイルAPIをリバースエンジニアリングして利用しており、Foodvisorによって承認されたものではありません。自己責任でご利用ください。エンドポイントは予告なく変更される可能性があります。
機能
🥗 カタログ検索: カロリー、マクロ栄養素、ブランド、画像、Nutriscoreに対応。
📒 食事の記録: 朝食/昼食/夕食/間食/カスタム*の各スロットに、分量やサービング倍率を指定して記録。
📊 日次サマリー: カロリーとマクロ栄養素の目標値に対するサーバーサイドでの集計。
📈 進捗: 日々のカロリー、体重、評価の履歴(約90日間)。
🔥 ストリーク: 現在の連続記録日数と利用可能なフリーズ回数。
💧 水分摂取記録。
👤 プロフィールと栄養目標: 曜日ごとのカロリー/マクロ栄養素の目標設定。
🔐 OAuth 2.1 + PKCE: 動的クライアント登録に対応し、Claudeのワンクリックコネクタとして動作。
🔄 ステートレスなマルチユーザー対応: トークンは自己完結型(データベース不要)。Foodvisorのリフレッシュトークンは、OAuth発行のJWT内で暗号化(AES-256-GCM)されます。
♻️ 自動アクセストークン更新: インメモリキャッシュとスタンピード保護機能を備えています。
Related MCP server: Nutrition and Training Tracker MCP
利用可能なMCPツール
ツール | 説明 |
| フリーテキストクエリでFoodvisorカタログを検索します。 |
| 1つ以上の |
| 指定した日付の食事スロットに食品を追加します。 |
| 指定した期間の食事記録を取得します。 |
| 目標値に対するその日の総カロリー/マクロ栄養素を取得します。 |
| 約90日間の日次カロリー、体重、Foodvisor評価を取得します。 |
| 直近7/30/90日間のA/B/C/D評価の割合を取得します。 |
| 現在の連続記録日数とフリーズ回数を取得します。 |
| 指定した期間の毎日の水分摂取量を取得します。 |
| プロフィールと栄養目標を取得します。 |
Dockerでのクイックスタート
git clone https://github.com/cldt-fr/foodvisor-mcp.git
cd foodvisor-mcp
docker compose up -dサーバーは http://localhost:3000/mcp でリッスンを開始します。ヘルスチェックは /health で行えます。
パブリックドメイン上のリバースプロキシ(Caddy、Traefik、nginxなど)の背後で実行する場合は、ポート3000の手前でTLSを終端してください。
認証
foodvisor-mcp は、どちらも基盤となる同じ認証情報(Foodvisorのリフレッシュトークン)を使用する2つの認証方法をサポートしています。
OAuth 2.1(推奨): サーバーは、動的クライアント登録とPKCEを備えた完全なOAuth認可サーバーとして機能します。対応するMCPクライアント(Claude、Cursorなど)はフローを自動的に処理します。クライアントは認証エンドポイントを検出し、自身を登録し、ログインページを開きます。そこでFoodvisorのリフレッシュトークンを一度入力すると、サーバーはリフレッシュトークンをAES-256-GCMで暗号化した独自のJWTを発行します。
ダイレクトBearer(パワーユーザー向け): FoodvisorのリフレッシュJWTを直接
Authorization: Bearer …として渡します。スクリプトやクイックテストに便利です。サーバーはトークンの形式を検出し、従来通りプロキシします。
いずれの場合も、サーバー上にユーザーごとの状態は保存されません。OAuth発行のJWTは自己完結型であり、レガシーモードは純粋なパススルーです。
Foodvisorリフレッシュトークンの取得方法
FoodvisorはiOSでのAppleサインイン経由でのみ認証を行うため、公開されているOAuthやパスワードのエンドポイントはありません。HTTPSの中間者攻撃(MITM)として設定したCharles Proxy(またはProxyman、mitmproxyなど)を使用して、実際のiPhoneで POST /user/auth/ レスポンスをキャプチャします。
iPhoneにCharlesのルート証明書をインストールし、完全な信頼を有効にします。
Foodvisorアプリを強制終了して再起動し、サインインします。
POST https://api.foodvisor.io/api/6.0/ios/FR/fr_FR/user/auth/リクエストを探します。JSONレスポンスに含まれるtokens.refreshが、長期有効な認証情報(約6ヶ月間)です。
リフレッシュトークンは栄養履歴への完全なアクセス権を与えます。パスワードと同様に扱ってください。
MCPクライアントの設定
Claude (Web / デスクトップ / Code) — OAuth
パブリックな /mcp URL(例: https://foodvisor-mcp.example.com/mcp)を使用して、サーバーをコネクタとして追加します。Claudeは以下の処理を行います。
/.well-known/oauth-protected-resourceおよび/.well-known/oauth-authorization-serverでOAuthメタデータを検出します。POST /registerを介して自身を登録します。ブラウザで
/authorizeページを開きます。フォームにFoodvisorのリフレッシュトークンを貼り付けて送信します。返されたコードを長期有効なアクセストークン(デフォルト30日間)と交換します。
その後、Claudeから直接ツールを使用できます。アクセストークンの有効期限が切れると、Claudeはフローを再実行します。
ダイレクトBearer(Streamable HTTPに対応したMCPクライアント)
{
"mcpServers": {
"foodvisor": {
"url": "https://foodvisor-mcp.example.com/mcp",
"headers": {
"Authorization": "Bearer <YOUR_FOODVISOR_REFRESH_TOKEN>"
}
}
}
}ローカル開発
Node ≥ 22が必要です。
npm install
npm run dev # tsx watch on $PORT (default 3000)
npm run typecheck
npm run build && npm startプロジェクト構成
src/
├── index.ts # Node http server + per-request MCP transport + OAuth routes
├── env.ts # zod-validated env vars
├── auth/
│ ├── extract.ts # Bearer parsing — accepts OAuth JWT and legacy Foodvisor refresh
│ └── token-cache.ts # Foodvisor access-token cache + refresh
├── oauth/
│ ├── jwt.ts # HS256 sign/verify + AES-256-GCM encrypt/decrypt
│ ├── store.ts # in-memory clients + auth codes (TTL)
│ ├── login.ts # HTML login page (paste refresh token)
│ ├── handlers.ts # /register, /authorize, /token handlers
│ └── metadata.ts # /.well-known/* metadata builders
├── foodvisor/
│ ├── client.ts # fetch wrapper with 401 retry
│ ├── endpoints.ts # typed endpoint helpers
│ └── types.ts # response shapes
└── mcp/
├── server.ts # createMcpServer(ctx)
└── tools/ # one file per tool group
├── food.ts
├── meal.ts
├── progress.ts
├── trackers.ts
└── profile.tsHTTPサーバーは意図的に最小限(Express/Honoなし)に抑えられています。各 POST /mcp は、呼び出し元の userId/refreshToken とステートレスな StreamableHTTPServerTransport にバインドされた新しい McpServer を起動します。
環境変数
変数 | デフォルト | 用途 | |||
|
| HTTPリッスンポート | |||
|
|
|
|
|
|
| 自動導出 | パブリックオリジン(例: | |||
| ランダム | OAuth発行トークンの署名に使用するHMACシークレット。最小32文字。本番環境では明示的に設定してください。設定しない場合、再起動のたびにトークンが無効になります。 | |||
|
| OAuthアクセストークンの有効期間(秒単位、デフォルト30日間)。 | |||
|
| テスト時のみ上書きしてください。 | |||
|
| アップストリームで使用されるロケールパスのプレフィックス。 |
以下のコマンドで安定したシークレットを生成できます:
openssl rand -base64 48セキュリティ上の注意
このサーバーはFoodvisorへの信頼されたプロキシです。有効なFoodvisorリフレッシュトークンを持つ者は誰でも、それを使用してユーザーの栄養データを読み取り、書き込むことができます。本番環境では
/mcpエンドポイントの前にHTTPSを配置し、公開する場合はIPホワイトリストの検討を推奨します。トークンはプロセス内のメモリのみに保持されます。ディスクには一切保存されません。
トークンキャッシュはJWTの
user_idをキーとしているため、同じユーザーからの同時リクエストは単一のアクセストークンを共有します。同時更新試行はインフライトマップを介して統合されます。
ロードマップ
アップロードエンドポイントのリバースエンジニアリングが完了次第、写真ベースの食事認識(Foodvisorのキラー機能)を実装予定。
アクティビティログ、体重測定、カスタムレシピ、お気に入り機能。
再起動時の回復力を高めるためのオプションの永続トークンストア。
コントリビューション
IssueやPRは https://github.com/cldt-fr/foodvisor-mcp までお寄せください。Foodvisorエンドポイントのリバースエンジニアリングに関するヘルプを求めるIssueは作成しないでください。ご自身でCharles/Proxymanを使用してキャプチャし、型定義されたラッパーとして貢献してください。
ライセンス
MIT — LICENSE を参照してください。
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Unlock the power of food transparency with our Open Food Facts MCP server. Easily look up any food
MCP server for AI dialogue using various LLM models via AceDataCloud
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceMCP server for MealMastery AI meal planning that enables users to manage meal plans, recipes, and grocery lists through natural language conversation with AI agents like Claude.41 npmMIT
- FlicenseNot gradedqualityCmaintenanceMCP server for tracking nutrition meals and workouts, integrating with claude.ai to manage food logs, macros, exercise catalogs, and generate daily/weekly summaries.-
- AlicenseNot gradedqualityDmaintenanceAn MCP server that lets you log meals through Claude (and soon ChatGPT) in plain language, using India's official food composition data (IFCT 2017) plus USDA, enabling accurate calorie and macro tracking for Indian dishes with household units and photo logging.54 npm2AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server for nutritionists to manage patients, prescriptions, anthropometry, and meal plans, integrating with Claude, Cursor, and other AI agents.MIT