foodvisor-mcp
foodvisor-mcp
Un servidor remoto del Model Context Protocol que expone la API de nutrición de Foodvisor a agentes LLM (Claude, Cursor, …). Busca alimentos, registra comidas, obtén el progreso y los macros, todo desde tu asistente.
Aviso legal. Este proyecto es no oficial. Utiliza la API móvil privada de Foodvisor mediante ingeniería inversa de sus peticiones y no cuenta con el respaldo de Foodvisor. Úsalo bajo tu propia responsabilidad; los endpoints pueden cambiar sin previo aviso.
Características
🥗 Búsqueda en el catálogo con calorías, macros, marca, imagen y Nutriscore.
📒 Registro de comidas (desayuno/almuerzo/cena/snack/personalizado_*) con cantidades y multiplicadores de porción.
📊 Resumen diario — agregación en el servidor de calorías y macros frente a tus objetivos.
📈 Progreso — historial diario de calorías, peso y calificación (≈90 días).
🔥 Racha — días consecutivos de registro actuales y congelaciones disponibles.
💧 Registro de hidratación.
👤 Perfil y objetivos nutricionales — objetivos de calorías/macros por día de la semana.
🔐 OAuth 2.1 + PKCE con registro dinámico de clientes — funciona como un conector de un solo clic para Claude.
🔄 Multiusuario sin estado: los tokens son autónomos (sin base de datos). Los tokens de actualización de Foodvisor están cifrados (AES-256-GCM) dentro del JWT emitido por OAuth.
♻️ Actualización automática del token de acceso con caché en memoria y protección contra avalanchas de peticiones.
Related MCP server: Nutrition and Training Tracker MCP
Herramientas MCP disponibles
Herramienta | Descripción |
| Busca en el catálogo de Foodvisor mediante consulta de texto libre. |
| Información nutricional completa (macros, vitaminas, unidades) para uno o más |
| Añade alimentos a una franja horaria de comida en una fecha determinada. |
| Comidas registradas en un rango de fechas. |
| Total de calorías/macros de un día frente a tus objetivos. |
| Calorías diarias, peso y calificación de Foodvisor durante ~90 días. |
| Porcentaje de comidas A/B/C/D en ventanas móviles de 7/30/90 días. |
| Racha de registro actual y congelaciones. |
| Ingesta diaria de agua en un rango de fechas. |
| Perfil y objetivos nutricionales. |
Inicio rápido con Docker
git clone https://github.com/cldt-fr/foodvisor-mcp.git
cd foodvisor-mcp
docker compose up -dEl servidor ahora escucha en http://localhost:3000/mcp. Sonda de salud en /health.
Para ejecutarlo detrás de un proxy inverso (Caddy, Traefik, nginx) en un dominio público, simplemente termina el TLS frente al puerto 3000.
Autenticación
foodvisor-mcp admite dos formas de autenticarse, ambas respaldadas por la misma credencial subyacente: tu token de actualización de Foodvisor:
OAuth 2.1 (recomendado) — el servidor es un servidor de autorización OAuth completo con registro dinámico de clientes y PKCE. Los clientes MCP compatibles (Claude, Cursor, …) gestionan el flujo automáticamente: descubren los endpoints de autenticación, se registran y abren una página de inicio de sesión donde pegas tu token de actualización de Foodvisor una vez. El servidor emite entonces su propio JWT con tu token de actualización cifrado con AES-256-GCM en su interior.
Bearer directo (usuario avanzado) — pasa tu JWT de actualización de Foodvisor directamente como
Authorization: Bearer …. Útil para scripts o pruebas rápidas. El servidor detecta el formato del token y actúa como proxy como antes.
De cualquier manera, no se almacena estado por usuario en el servidor: el JWT emitido por OAuth es autónomo y el modo heredado es puramente de paso.
Obtención de tu token de actualización de Foodvisor
Foodvisor solo se autentica mediante Apple Sign-In en iOS; no hay un endpoint público de OAuth o contraseña. Captura la respuesta POST /user/auth/ en un iPhone real con Charles Proxy (o Proxyman, mitmproxy, …) configurado como un intermediario HTTPS:
Instala el certificado raíz de Charles en tu iPhone y habilita la confianza total.
Cierra forzosamente y vuelve a abrir la aplicación Foodvisor, luego inicia sesión.
Busca una petición
POST https://api.foodvisor.io/api/6.0/ios/FR/fr_FR/user/auth/. La respuesta JSON contienetokens.refresh: esa es tu credencial de larga duración (≈ 6 meses).
Los tokens de actualización dan acceso total a tu historial nutricional. Trátalos como contraseñas.
Configuración de un cliente MCP
Claude (web / Escritorio / Código) — OAuth
Añade el servidor como un conector con su URL pública /mcp (p. ej., https://foodvisor-mcp.example.com/mcp). Claude hará lo siguiente:
Descubrirá los metadatos de OAuth en
/.well-known/oauth-protected-resourcey/.well-known/oauth-authorization-server.Se registrará a través de
POST /register.Abrirá la página
/authorizeen tu navegador. Pega tu token de actualización de Foodvisor en el formulario y envíalo.Intercambiará el código devuelto por un token de acceso de larga duración (30 días por defecto).
Después de eso, puedes usar las herramientas directamente desde Claude. Cuando el token de acceso caduque, Claude volverá a ejecutar el flujo.
Bearer directo (cualquier cliente MCP que admita HTTP transmitible)
{
"mcpServers": {
"foodvisor": {
"url": "https://foodvisor-mcp.example.com/mcp",
"headers": {
"Authorization": "Bearer <YOUR_FOODVISOR_REFRESH_TOKEN>"
}
}
}
}Desarrollo local
Requiere Node ≥ 22.
npm install
npm run dev # tsx watch on $PORT (default 3000)
npm run typecheck
npm run build && npm startEstructura del proyecto
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.tsEl servidor HTTP es intencionalmente mínimo (sin Express/Hono): cada POST /mcp inicia un nuevo McpServer vinculado al userId/refreshToken del llamante y a un StreamableHTTPServerTransport sin estado.
Variables de entorno
Var | Por defecto | Propósito | |||
|
| Puerto de escucha HTTP | |||
|
|
|
|
|
|
| derivado | Origen público (p. ej., | |||
| aleatorio | Secreto HMAC usado para firmar tokens emitidos por OAuth. Mín. 32 caracteres. Establécelo explícitamente en producción; de lo contrario, los tokens se invalidan en cada reinicio. | |||
|
| Tiempo de vida de los tokens de acceso OAuth, en segundos (30 días por defecto). | |||
|
| Solo para pruebas | |||
|
| Prefijo de ruta de configuración regional usado por el upstream |
Genera un secreto estable con:
openssl rand -base64 48Notas de seguridad
El servidor es un proxy de confianza para Foodvisor: cualquiera que posea un token de actualización de Foodvisor válido puede usarlo para leer y escribir los datos nutricionales de ese usuario. Protege el endpoint
/mcpcon HTTPS en producción y considera listas blancas de IP si se expone públicamente.Los tokens se mantienen solo en la memoria del proceso. Nunca se guardan en el disco.
La caché de tokens se indexa por el
user_iddel JWT, por lo que las peticiones concurrentes del mismo usuario comparten un único token de acceso; los intentos de actualización concurrentes se fusionan mediante un mapa de peticiones en curso.
Hoja de ruta
Reconocimiento de comidas basado en fotos (la función estrella de Foodvisor) una vez que se realice la ingeniería inversa del endpoint de carga.
Registro de actividades, pesajes, recetas personalizadas y favoritos.
Almacén de tokens persistente opcional para mayor resiliencia ante reinicios.
Contribución
Las incidencias y PR son bienvenidas en https://github.com/cldt-fr/foodvisor-mcp. Por favor, no abras incidencias pidiendo ayuda para realizar ingeniería inversa de los endpoints de Foodvisor; captúralos tú mismo con Charles/Proxyman y contribuye con un envoltorio tipado.
Licencia
MIT — ver 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