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

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

Инструмент

Описание

search_food

Поиск в каталоге Foodvisor по текстовому запросу.

get_food_details

Полная информация о питательной ценности (макронутриенты, витамины, единицы измерения) для одного или нескольких food_id.

log_meal

Добавление продуктов в прием пищи на указанную дату.

list_meals

Зарегистрированные приемы пищи за диапазон дат.

get_daily_summary

Общее количество калорий/макронутриентов за день в сравнении с вашими целями.

get_progress

Ежедневные калории, вес и оценка Foodvisor за ~90 дней.

get_fv_grade_distribution

Доля приемов пищи с оценками A/B/C/D за скользящие окна 7/30/90 дней.

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) на публичном домене просто завершите TLS перед портом 3000.

Аутентификация

foodvisor-mcp поддерживает два способа аутентификации, оба из которых опираются на одни и те же базовые учетные данные — ваш refresh token Foodvisor:

  1. OAuth 2.1 (рекомендуется) — сервер является полноценным сервером авторизации OAuth с динамической регистрацией клиентов и PKCE. Совместимые MCP-клиенты (Claude, Cursor и др.) обрабатывают процесс автоматически: они обнаруживают конечные точки авторизации, регистрируются и открывают страницу входа, где вы один раз вставляете свой refresh token Foodvisor. Затем сервер выдает собственный JWT с вашим refresh token, зашифрованным с помощью AES-256-GCM.

  2. 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:

  1. Установите корневой сертификат Charles на ваш iPhone и включите полное доверие.

  2. Принудительно закройте и снова откройте приложение Foodvisor, затем войдите в систему.

  3. Найдите запрос 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 выполнит следующее:

  1. Обнаружит метаданные OAuth по адресам /.well-known/oauth-protected-resource и /.well-known/oauth-authorization-server.

  2. Зарегистрируется через POST /register.

  3. Откроет страницу /authorize в вашем браузере. Вставьте ваш refresh token Foodvisor в форму и отправьте ее.

  4. Обменяет полученный код на долгоживущий токен доступа (по умолчанию 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.ts

HTTP-сервер намеренно сделан минималистичным (без Express/Hono) — каждый POST /mcp запускает новый McpServer, привязанный к userId/refreshToken вызывающего абонента и stateless-транспорту StreamableHTTPServerTransport.

Переменные окружения

Переменная

По умолчанию

Назначение

PORT

3000

Порт прослушивания HTTP

LOG_LEVEL

info

debug

info

warn

error

MCP_PUBLIC_URL

вычисляется

Публичный origin (например, https://foodvisor-mcp.example.com). Используется в метаданных OAuth. Если не задано, вычисляется для каждого запроса из Host + X-Forwarded-Proto.

MCP_JWT_SECRET

случайно

HMAC-секрет, используемый для подписи токенов OAuth. Мин. 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

Префикс пути локали, используемый вышестоящим 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.

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