Skip to main content
Glama
cldt-fr
by cldt-fr

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)されます。

  • ♻️ 自動アクセストークン更新: インメモリキャッシュとスタンピード保護機能を備えています。

利用可能なMCPツール

ツール

説明

search_food

フリーテキストクエリでFoodvisorカタログを検索します。

get_food_details

1つ以上の food_id に対する詳細な栄養情報(マクロ栄養素、ビタミン、単位)を取得します。

log_meal

指定した日付の食事スロットに食品を追加します。

list_meals

指定した期間の食事記録を取得します。

get_daily_summary

目標値に対するその日の総カロリー/マクロ栄養素を取得します。

get_progress

約90日間の日次カロリー、体重、Foodvisor評価を取得します。

get_fv_grade_distribution

直近7/30/90日間のA/B/C/D評価の割合を取得します。

get_streak

現在の連続記録日数とフリーズ回数を取得します。

get_water_log

指定した期間の毎日の水分摂取量を取得します。

get_profile

プロフィールと栄養目標を取得します。

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つの認証方法をサポートしています。

  1. OAuth 2.1(推奨): サーバーは、動的クライアント登録とPKCEを備えた完全なOAuth認可サーバーとして機能します。対応するMCPクライアント(Claude、Cursorなど)はフローを自動的に処理します。クライアントは認証エンドポイントを検出し、自身を登録し、ログインページを開きます。そこでFoodvisorのリフレッシュトークンを一度入力すると、サーバーはリフレッシュトークンをAES-256-GCMで暗号化した独自のJWTを発行します。

  2. ダイレクトBearer(パワーユーザー向け): FoodvisorのリフレッシュJWTを直接 Authorization: Bearer … として渡します。スクリプトやクイックテストに便利です。サーバーはトークンの形式を検出し、従来通りプロキシします。

いずれの場合も、サーバー上にユーザーごとの状態は保存されません。OAuth発行のJWTは自己完結型であり、レガシーモードは純粋なパススルーです。

Foodvisorリフレッシュトークンの取得方法

FoodvisorはiOSでのAppleサインイン経由でのみ認証を行うため、公開されているOAuthやパスワードのエンドポイントはありません。HTTPSの中間者攻撃(MITM)として設定したCharles Proxy(またはProxyman、mitmproxyなど)を使用して、実際のiPhoneで POST /user/auth/ レスポンスをキャプチャします。

  1. iPhoneにCharlesのルート証明書をインストールし、完全な信頼を有効にします。

  2. Foodvisorアプリを強制終了して再起動し、サインインします。

  3. 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は以下の処理を行います。

  1. /.well-known/oauth-protected-resource および /.well-known/oauth-authorization-server でOAuthメタデータを検出します。

  2. POST /register を介して自身を登録します。

  3. ブラウザで /authorize ページを開きます。フォームにFoodvisorのリフレッシュトークンを貼り付けて送信します。

  4. 返されたコードを長期有効なアクセストークン(デフォルト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.ts

HTTPサーバーは意図的に最小限(Express/Honoなし)に抑えられています。各 POST /mcp は、呼び出し元の userId/refreshToken とステートレスな StreamableHTTPServerTransport にバインドされた新しい McpServer を起動します。

環境変数

変数

デフォルト

用途

PORT

3000

HTTPリッスンポート

LOG_LEVEL

info

debug

info

warn

error

MCP_PUBLIC_URL

自動導出

パブリックオリジン(例: https://foodvisor-mcp.example.com)。OAuthメタデータで使用。未設定の場合、Host + X-Forwarded-Proto からリクエストごとに導出されます。

MCP_JWT_SECRET

ランダム

OAuth発行トークンの署名に使用するHMACシークレット。最小32文字。本番環境では明示的に設定してください。設定しない場合、再起動のたびにトークンが無効になります。

MCP_ACCESS_TOKEN_TTL

2592000

OAuthアクセストークンの有効期間(秒単位、デフォルト30日間)。

FOODVISOR_BASE_URL

https://api.foodvisor.io

テスト時のみ上書きしてください。

FOODVISOR_LOCALE_PATH

/api/6.0/ios/FR/fr_FR

アップストリームで使用されるロケールパスのプレフィックス。

以下のコマンドで安定したシークレットを生成できます:

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 を参照してください。

A
license - permissive license
-
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

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/cldt-fr/foodvisor-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server