foodvisor-mcp
foodvisor-mcp
Удаленный сервер Model Context Protocol, который предоставляет API питания Foodvisor для LLM-агентов (Claude, Cursor и др.). Ищите продукты, регистрируйте приемы пищи, получайте данные о прогрессе и макронутриентах — и все это через вашего помощника.
Отказ от ответственности. Этот проект является неофициальным. Он использует закрытый мобильный API Foodvisor путем обратной разработки его запросов и не поддерживается Foodvisor. Используйте на свой страх и риск; конечные точки могут измениться без уведомления.
Возможности
🥗 Поиск по каталогу с указанием калорий, макронутриентов, бренда, изображения и Nutriscore.
📒 Регистрация приемов пищи (завтрак/обед/ужин/перекус/пользовательский_*) с указанием количества и множителей порций.
📊 Ежедневная сводка — агрегация калорий и макронутриентов на стороне сервера в сравнении с вашими целями.
📈 Прогресс — история ежедневных калорий, веса и оценок (≈90 дней).
🔥 Серия (Streak) — текущее количество дней подряд с регистрацией и доступные «заморозки».
💧 Журнал гидратации.
👤 Профиль и цели по питанию — цели по калориям/макронутриентам на каждый день недели.
🔐 OAuth 2.1 + PKCE с динамической регистрацией клиентов — работает как коннектор для Claude в один клик.
🔄 Stateless (без сохранения состояния) для нескольких пользователей: токены являются самодостаточными (база данных не требуется). Токены обновления (refresh tokens) Foodvisor шифруются (AES-256-GCM) внутри JWT, выданного OAuth.
♻️ Автоматическое обновление токенов доступа с кэшированием в памяти и защитой от перегрузок.
Доступные инструменты MCP
Инструмент | Описание |
| Поиск в каталоге Foodvisor по текстовому запросу. |
| Полная информация о питательной ценности (макронутриенты, витамины, единицы измерения) для одного или нескольких |
| Добавление продуктов в прием пищи на указанную дату. |
| Зарегистрированные приемы пищи за диапазон дат. |
| Общее количество калорий/макронутриентов за день в сравнении с вашими целями. |
| Ежедневные калории, вес и оценка Foodvisor за ~90 дней. |
| Доля приемов пищи с оценками A/B/C/D за скользящие окна 7/30/90 дней. |
| Текущая серия регистрации и «заморозки». |
| Ежедневное потребление воды за диапазон дат. |
| Профиль и цели по питанию. |
Быстрый старт с 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) на публичном домене просто завершите TLS перед портом 3000.
Аутентификация
foodvisor-mcp поддерживает два способа аутентификации, оба из которых опираются на одни и те же базовые учетные данные — ваш refresh token Foodvisor:
OAuth 2.1 (рекомендуется) — сервер является полноценным сервером авторизации OAuth с динамической регистрацией клиентов и PKCE. Совместимые MCP-клиенты (Claude, Cursor и др.) обрабатывают процесс автоматически: они обнаруживают конечные точки авторизации, регистрируются и открывают страницу входа, где вы один раз вставляете свой refresh token Foodvisor. Затем сервер выдает собственный JWT с вашим refresh token, зашифрованным с помощью AES-256-GCM.
Direct Bearer (для опытных пользователей) — передавайте ваш JWT обновления Foodvisor напрямую как
Authorization: Bearer …. Полезно для скриптов или быстрых тестов. Сервер определяет формат токена и работает как прокси, как и раньше.
В любом случае, состояние пользователя на сервере не сохраняется: JWT, выданный OAuth, является самодостаточным, а устаревший режим работает исключительно как проброс.
Получение вашего refresh token Foodvisor
Foodvisor аутентифицируется только через Apple Sign-In на iOS — публичного OAuth или конечной точки с паролем не существует. Перехватите ответ POST /user/auth/ на реальном iPhone с помощью Charles Proxy (или Proxyman, mitmproxy и т.д.), настроенного как HTTPS man-in-the-middle:
Установите корневой сертификат Charles на ваш iPhone и включите полное доверие.
Принудительно закройте и снова откройте приложение Foodvisor, затем войдите в систему.
Найдите запрос
POST https://api.foodvisor.io/api/6.0/ios/FR/fr_FR/user/auth/. JSON-ответ содержитtokens.refresh— это ваши долгоживущие учетные данные (≈ 6 месяцев).
Refresh tokens предоставляют полный доступ к вашей истории питания. Относитесь к ним как к паролям.
Настройка MCP-клиента
Claude (веб / Desktop / Code) — OAuth
Добавьте сервер как коннектор с его публичным URL /mcp (например, https://foodvisor-mcp.example.com/mcp). Claude выполнит следующее:
Обнаружит метаданные OAuth по адресам
/.well-known/oauth-protected-resourceи/.well-known/oauth-authorization-server.Зарегистрируется через
POST /register.Откроет страницу
/authorizeв вашем браузере. Вставьте ваш refresh token Foodvisor в форму и отправьте ее.Обменяет полученный код на долгоживущий токен доступа (по умолчанию 30 дней).
После этого вы сможете использовать инструменты напрямую из Claude. Когда срок действия токена доступа истечет, Claude повторит процесс.
Direct Bearer (любой MCP-клиент, поддерживающий Streamable HTTP)
{
"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 запускает новый McpServer, привязанный к userId/refreshToken вызывающего абонента и stateless-транспорту StreamableHTTPServerTransport.
Переменные окружения
Переменная | По умолчанию | Назначение | |||
|
| Порт прослушивания HTTP | |||
|
|
|
|
|
|
| вычисляется | Публичный origin (например, | |||
| случайно | HMAC-секрет, используемый для подписи токенов OAuth. Мин. 32 символа. Установите явно в продакшене — иначе токены будут аннулироваться при каждом перезапуске. | |||
|
| Время жизни токенов доступа OAuth в секундах (по умолчанию 30 дней). | |||
|
| Переопределять только для тестирования | |||
|
| Префикс пути локали, используемый вышестоящим API |
Сгенерируйте стабильный секрет с помощью:
openssl rand -base64 48Заметки по безопасности
Сервер является доверенным прокси для Foodvisor: любой, у кого есть действительный refresh token Foodvisor, может использовать его для чтения и записи данных о питании пользователя. В продакшене используйте HTTPS перед конечной точкой
/mcpи рассмотрите возможность использования списков разрешенных IP-адресов, если сервер открыт публично.Токены хранятся только в оперативной памяти процесса. Они никогда не сохраняются на диск.
Кэш токенов индексируется по
user_idиз JWT, поэтому одновременные запросы от одного и того же пользователя используют один и тот же токен доступа; одновременные попытки обновления объединяются через карту выполняемых запросов.
Дорожная карта
Распознавание приемов пищи по фото (главная фишка Foodvisor), как только будет проведена обратная разработка конечной точки загрузки.
Журнал активности, взвешивания, пользовательские рецепты и избранное.
Опциональное хранилище токенов для устойчивости при перезапусках.
Участие в разработке
Проблемы и PR приветствуются на https://github.com/cldt-fr/foodvisor-mcp. Пожалуйста, не открывайте тикеты с просьбой помочь в обратной разработке конечных точек Foodvisor; перехватите их самостоятельно с помощью Charles/Proxyman и предложите типизированную обертку.
Лицензия
MIT — см. LICENSE.
This server cannot be installed
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