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

foodvisor-mcp

Ein Remote-Model Context Protocol-Server, der die Foodvisor-Ernährungs-API für LLM-Agenten (Claude, Cursor, …) bereitstellt. Suchen Sie nach Lebensmitteln, protokollieren Sie Mahlzeiten, rufen Sie Fortschritte und Makros ab — alles direkt von Ihrem Assistenten aus.

Haftungsausschluss. Dieses Projekt ist inoffiziell. Es verwendet die private mobile API von Foodvisor durch Reverse Engineering der Anfragen und wird nicht von Foodvisor unterstützt. Die Nutzung erfolgt auf eigene Gefahr; Endpunkte können sich ohne Vorankündigung ändern.

Funktionen

  • 🥗 Katalogsuche mit Kalorien, Makros, Marke, Bild, Nutriscore.

  • 📒 Mahlzeiten protokollieren (Frühstück/Mittagessen/Abendessen/Snack/benutzerdefiniert_*) mit Mengen und Portionsmultiplikatoren.

  • 📊 Tägliche Zusammenfassung — serverseitige Aggregation von Kalorien und Makros im Vergleich zu Ihren Zielen.

  • 📈 Fortschritt — Verlauf von täglichen Kalorien, Gewicht und Bewertung (≈90 Tage).

  • 🔥 Serie (Streak) — aktuelle aufeinanderfolgende Protokollierungstage und verfügbare Pausen.

  • 💧 Wasserprotokoll.

  • 👤 Profil & Ernährungsziele — wochentagsbezogene Kalorien-/Makroziele.

  • 🔐 OAuth 2.1 + PKCE mit dynamischer Client-Registrierung — funktioniert als One-Click-Claude-Connector.

  • 🔄 Zustandslos für mehrere Benutzer: Tokens sind in sich geschlossen (keine Datenbank). Foodvisor-Refresh-Tokens werden innerhalb des OAuth-ausgestellten JWT verschlüsselt (AES-256-GCM).

  • ♻️ Automatischer Access-Token-Refresh mit In-Memory-Caching und Schutz vor Anfragen-Überlastung.

Verfügbare MCP-Tools

Tool

Beschreibung

search_food

Durchsucht den Foodvisor-Katalog per Freitextabfrage.

get_food_details

Vollständige Nährwertinformationen (Makros, Vitamine, Einheiten) für eine oder mehrere food_ids.

log_meal

Fügt Lebensmittel zu einem Mahlzeiten-Slot an einem bestimmten Datum hinzu.

list_meals

Protokollierte Mahlzeiten in einem Datumsbereich.

get_daily_summary

Gesamtkalorien/-makros für einen Tag im Vergleich zu Ihren Zielen.

get_progress

Tägliche Kalorien, Gewicht und Foodvisor-Bewertung für ca. 90 Tage.

get_fv_grade_distribution

Anteil der A/B/C/D-Mahlzeiten über rollierende 7/30/90-Tage-Fenster.

get_streak

Aktuelle Protokollierungsserie und Pausen.

get_water_log

Tägliche Wasseraufnahme in einem Datumsbereich.

get_profile

Profil und Ernährungsziele.

Schnellstart mit Docker

git clone https://github.com/cldt-fr/foodvisor-mcp.git
cd foodvisor-mcp
docker compose up -d

Der Server lauscht nun auf http://localhost:3000/mcp. Health-Check unter /health.

Um den Server hinter einem Reverse Proxy (Caddy, Traefik, nginx) auf einer öffentlichen Domain zu betreiben, beenden Sie einfach TLS vor Port 3000.

Authentifizierung

foodvisor-mcp unterstützt zwei Authentifizierungsmethoden, die beide auf demselben zugrunde liegenden Anmeldeinformation basieren — Ihrem Foodvisor Refresh Token:

  1. OAuth 2.1 (empfohlen) — der Server ist ein vollständiger OAuth-Autorisierungsserver mit dynamischer Client-Registrierung und PKCE. Kompatible MCP-Clients (Claude, Cursor, …) handhaben den Ablauf automatisch: Sie entdecken die Auth-Endpunkte, registrieren sich selbst und öffnen eine Login-Seite, auf der Sie Ihr Foodvisor-Refresh-Token einmalig einfügen. Der Server stellt dann sein eigenes JWT aus, in dem Ihr Refresh-Token AES-256-GCM-verschlüsselt enthalten ist.

  2. Direct Bearer (für Power-User) — übergeben Sie Ihr Foodvisor-Refresh-JWT direkt als Authorization: Bearer …. Nützlich für Skripte oder schnelle Tests. Der Server erkennt das Token-Format und leitet es wie zuvor weiter.

In beiden Fällen werden keine benutzerspezifischen Zustände auf dem Server gespeichert: Das OAuth-ausgestellte JWT ist in sich geschlossen und der Legacy-Modus ist reines Passthrough.

Abrufen Ihres Foodvisor-Refresh-Tokens

Foodvisor authentifiziert sich nur über Apple Sign-In auf iOS — es gibt keinen öffentlichen OAuth- oder Passwort-Endpunkt. Erfassen Sie die POST /user/auth/-Antwort auf einem echten iPhone mit Charles Proxy (oder Proxyman, mitmproxy, …), das als HTTPS-Man-in-the-Middle konfiguriert ist:

  1. Installieren Sie das Root-Zertifikat von Charles auf Ihrem iPhone und aktivieren Sie das volle Vertrauen.

  2. Beenden Sie die Foodvisor-App vollständig und öffnen Sie sie erneut, melden Sie sich dann an.

  3. Suchen Sie nach einer POST https://api.foodvisor.io/api/6.0/ios/FR/fr_FR/user/auth/-Anfrage. Die JSON-Antwort enthält tokens.refresh — das ist Ihr langlebiges Anmeldeinformation (≈ 6 Monate).

Refresh-Tokens bieten vollen Zugriff auf Ihre Ernährungshistorie. Behandeln Sie diese wie Passwörter.

Konfiguration eines MCP-Clients

Claude (Web / Desktop / Code) — OAuth

Fügen Sie den Server als Connector mit seiner öffentlichen /mcp-URL hinzu (z. B. https://foodvisor-mcp.example.com/mcp). Claude wird:

  1. Die OAuth-Metadaten unter /.well-known/oauth-protected-resource und /.well-known/oauth-authorization-server entdecken.

  2. Sich selbst über POST /register registrieren.

  3. Die /authorize-Seite in Ihrem Browser öffnen. Fügen Sie Ihr Foodvisor-Refresh-Token in das Formular ein und senden Sie es ab.

  4. Den zurückgegebenen Code gegen ein langlebiges Access-Token (Standard 30 Tage) austauschen.

Danach können Sie die Tools direkt aus Claude heraus verwenden. Wenn das Access-Token abläuft, führt Claude den Ablauf erneut aus.

Direct Bearer (jeder MCP-Client, der Streamable HTTP unterstützt)

{
  "mcpServers": {
    "foodvisor": {
      "url": "https://foodvisor-mcp.example.com/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_FOODVISOR_REFRESH_TOKEN>"
      }
    }
  }
}

Lokale Entwicklung

Erfordert Node ≥ 22.

npm install
npm run dev      # tsx watch on $PORT (default 3000)
npm run typecheck
npm run build && npm start

Projektstruktur

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

Der HTTP-Server ist bewusst minimal gehalten (kein Express/Hono) — jeder POST /mcp-Aufruf startet einen neuen McpServer, der an die userId/refreshToken des Aufrufers und einen zustandslosen StreamableHTTPServerTransport gebunden ist.

Umgebungsvariablen

Variable

Standard

Zweck

PORT

3000

HTTP-Listen-Port

LOG_LEVEL

info

debug

info

warn

error

MCP_PUBLIC_URL

abgeleitet

Öffentlicher Ursprung (z. B. https://foodvisor-mcp.example.com). Wird in OAuth-Metadaten verwendet. Wenn nicht gesetzt, wird es pro Anfrage aus Host + X-Forwarded-Proto abgeleitet.

MCP_JWT_SECRET

zufällig

HMAC-Geheimnis zum Signieren von OAuth-ausgestellten Tokens. Min. 32 Zeichen. In der Produktion explizit setzen — andernfalls werden Tokens bei jedem Neustart ungültig.

MCP_ACCESS_TOKEN_TTL

2592000

Lebensdauer von OAuth-Access-Tokens in Sekunden (Standard 30 Tage).

FOODVISOR_BASE_URL

https://api.foodvisor.io

Nur zum Testen überschreiben

FOODVISOR_LOCALE_PATH

/api/6.0/ios/FR/fr_FR

Vom Upstream verwendeter Locale-Pfad-Präfix

Generieren Sie ein stabiles Geheimnis mit:

openssl rand -base64 48

Sicherheitshinweise

  • Der Server ist ein vertrauenswürdiger Proxy für Foodvisor: Jeder, der ein gültiges Foodvisor-Refresh-Token besitzt, kann es verwenden, um die Ernährungsdaten dieses Benutzers zu lesen und zu schreiben. Schützen Sie den /mcp-Endpunkt in der Produktion mit HTTPS und ziehen Sie IP-Allowlists in Betracht, falls er öffentlich zugänglich ist.

  • Tokens werden nur im Prozessspeicher gehalten. Sie werden niemals auf die Festplatte geschrieben.

  • Der Token-Cache wird über die user_id des JWT indiziert, sodass gleichzeitige Anfragen desselben Benutzers sich ein Access-Token teilen; gleichzeitige Refresh-Versuche werden über eine In-Flight-Map zusammengeführt.

Roadmap

  • Foto-basierte Mahlzeitenerkennung (Foodvisors Killer-Feature), sobald der Upload-Endpunkt per Reverse Engineering entschlüsselt wurde.

  • Aktivitätenprotokoll, Gewichtsmessungen, benutzerdefinierte Rezepte & Favoriten.

  • Optionaler persistenter Token-Speicher für Ausfallsicherheit bei Neustarts.

Mitwirken

Issues und PRs sind willkommen unter https://github.com/cldt-fr/foodvisor-mcp. Bitte eröffnen Sie keine Issues mit der Bitte um Hilfe beim Reverse Engineering von Foodvisor-Endpunkten; erfassen Sie diese selbst mit Charles/Proxyman und steuern Sie einen typisierten Wrapper bei.

Lizenz

MIT — siehe 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