Skip to main content
Glama
a1dancole

MyFitnessPal MCP

by a1dancole

MyFitnessPal MCP — данные о питании для вашего тренера по тренировкам Claude

Удалённый MCP сервер, развёрнутый на Cloudflare Workers, который открывает ваш дневник MyFitnessPal — каждый продукт с порцией и временем, итоги по приёмам пищи и за день по энергии, макро- и микронутриентам, воде, зарегистрированным тренировкам, шагам и весу — для Claude. Добавьте его один раз как пользовательский коннектор, и он будет работать в Claude в вебе, на десктопе и на мобильных устройствах. Сочетается с коннекторами Strava, Google Health и Renpho, так что ваш тренер видит тренировочную нагрузку, восстановление, композицию тела и питание.

Как он взаимодействует с MFP: У MyFitnessPal нет публичного API (партнёрская программа закрыта). Этот сервер использует собственный OAuth-процесс входа мобильного приложения и тот же API api.myfitnesspal.com/v2, которым пользуется приложение, — тот самый, что описан в архивированной партнёрской документации на myfitnesspalapi.com. Никакого браузера, куки, скрейпинга и капчи. Авторство процесса входа: seonixx/myfitnesspal и jnelle/MyFitnesspal-API-Golang. Неофициально; MFP может изменить это в любой момент.

Инструменты

Инструмент

Что показывает

get_daily_nutrition

«Что я ел сегодня?» — итоги по приёмам пищи и за день (энергия, белок, углеводы, чистые углеводы, клетчатка, сахар, подтипы жиров, холестерин, натрий, калий, микронутриенты в % от суточной нормы), каждый продукт с порцией и временем, вода, тренировки, шаги, записи веса

get_food_log

Отдельные записи о продуктах за период, фильтруемые по приёму пищи или текстовому поиску — что было съедено вокруг тренировок, повторяющиеся продукты

get_nutrition_trend

Итоги за день за выбранный период со средними по зарегистрированным дням, мин/макс энергии, распределение энергии по белкам/углеводам/жирам, недельные средние, вода/тренировки/шаги

get_exercise_log

Зарегистрированные в MFP тренировки (длительность, калории, дистанция, ЧСС) и шаги за день

get_weight_log

Записи веса, внесённые в MFP

get_profile

Имя, пол, дата рождения/возраст, рост, локаль + статус токена

run_diagnostics

Сквозная проверка: обновление токена, профиль, какие типы/поля дневника принимает аккаунт (с сырыми примерами), измерения, возможные конечные точки целей

query_endpoint

Запасной выход: вызвать любую конечную точку api.myfitnesspal.com или identity-эндпоинт с применением авторизации коннектора

refresh_data

Сбросить кэшированные дни и запомненную форму запроса, обновить токен

delete_my_data

Удалить все кэшированные данные вашего аккаунта

Устранение неполадок: если инструмент выдаёт ошибку или данные выглядят неполными, сначала запустите run_diagnostics. Он сообщит точную комбинацию types/fields[], которую MFP принимает для вашего аккаунта, и сырой пример для каждого типа элементов.


Related MCP server: MyFitnessPal MCP Server

Как это работает

Claude (web/desktop/mobile)
  └─ custom connector → /mcp
       └─ workers-oauth-provider  (this Worker IS Claude's OAuth server)
            └─ AuthHandler        (MFP sign-in page: one-time credential → token exchange)
                 └─ MyFitnessPalMCP (Durable Object) → MfpClient → api.myfitnesspal.com/v2

Вход (один раз, на странице /authorize коннектора)

  1. POST identity-api.myfitnesspal.com/oauth/token — токен client-credentials для OAuth-клиента мобильного приложения.

  2. GET identity-api…/clientKeys — ключ подписи HS512, который MFP использует для входов по паролю.

  3. POST identity-api…/oauth/authorize с credentials=<JWT{username, password}> — возвращает перенаправление на mfp://identity/callback?code=….

  4. POST …/oauth/token (authorization_code) — токены access, refresh и id.

  5. GET identity-api…/users/{sub} — доменный идентификатор пользователя MFP (заголовок mfp-user-id) и профиль.

Сохраняется только refresh-токен (и первый access-токен), зашифрованный в свойствах OAuth-гранта; пароль никогда не хранится. После этого Worker молча обновляет токен; последний ротированный refresh-токен хранится запечатанным в KV.

Чтение дневника

GET api.myfitnesspal.com/v2/diary?entry_date=YYYY-MM-DD&types=…&fields[]=… с заголовками Authorization: Bearer, mfp-user-id, mfp-client-id и заголовками приложения api-version/user-agent. Типы элементов: food_entry, diary_meal, exercise_entry, water, steps_aggregate. Пагинация выполняется по заголовку Link: rel=next.

Точные types/fields[], которые принимает мобильный токен, не документированы, поэтому клиент сам выясняет их: он пробует самый полный запрос, затем меньший набор полей, затем без полей, затем по одному типу за раз — и запоминает выигрышную комбинацию на день. Всё, что было отклонено, отображается в результате инструмента. Завершённые дни неизменяемы и кэшируются (запечатанными) на 30 дней; сегодняшний день всегда берётся в реальном времени. Каждый день — это один запрос к upstream, поэтому окна ограничены 92 днями.

Сопоставление полей

nutritional_contents → ключи с суффиксами единиц измерения: energy_kcal (кДж пересчитаны), protein_g, carbohydrates_g, net_carbs_g, fiber_g, sugar_g, fat_g, saturated_fat_g, monounsaturated_fat_g, polyunsaturated_fat_g, trans_fat_g, cholesterol_mg, sodium_mg, potassium_mg и calcium/iron/vitamin_a/vitamin_c/vitamin_d_pct_dv (MFP хранит их как процент от суточной нормы). Неизвестные нутриенты сохраняются в extra.

Итоги за день берутся из собственных сводок MFP diary_meal, когда они есть (totals_source: "diary_meal"), в противном случае — суммированием строк food_entry.

Кэширование и шифрование

Всё, что записывается в пространство имён KV MFP_CACHE, — токены, выясненная форма запроса, дни дневника — запечатывается AES-256-GCM ключом, полученным из SESSION_ENCRYPTION_KEY, отдельно для каждого пользователя. Без секрета кэширование отключено. Сбои кэша никогда не нарушают запрос.


Откуда берутся учётные данные клиента

Процесс входа требует OAuth-идентификатор клиента и секрет, встроенные в Android-приложение MyFitnessPal. Здесь они не воспроизводятся; упомянутый выше Go-клиент поставляет их в своём .env.sample. Задайте их как секреты Worker MFP_CLIENT_ID и MFP_CLIENT_SECRET. Если MFP их сменит, вход перестанет работать, пока они не будут обновлены.

Развёртывание

Вариант A — GitHub Actions

.github/workflows/deploy.yml запускает развёртывание при каждом push в master. Секреты живут в Cloudflare; GitHub хранит только CLOUDFLARE_API_TOKEN и CLOUDFLARE_ACCOUNT_ID.

  1. Создайте два пространства имён KV (MFP_OAUTH_KV, MFP_CACHE) и укажите их идентификаторы в wrangler.jsonc.

  2. Добавьте два секрета GitHub и запушьте.

  3. В Cloudflare (Workers & Pages → myfitnesspal-mcp → Настройки → Переменные и секреты) добавьте секреты SESSION_ENCRYPTION_KEY (любая длинная случайная строка), MFP_CLIENT_ID, MFP_CLIENT_SECRET. При желании установите переменную ALLOWED_EMAILS на вашу MFP-почту, чтобы никто другой не мог подключиться к вашему развёртыванию.

Вариант B — локальный wrangler

npm install
npx wrangler kv namespace create MFP_OAUTH_KV   # paste the id into wrangler.jsonc
npx wrangler kv namespace create MFP_CACHE      # paste the id into wrangler.jsonc
npx wrangler secret put SESSION_ENCRYPTION_KEY
npx wrangler secret put MFP_CLIENT_ID
npx wrangler secret put MFP_CLIENT_SECRET
npx wrangler deploy

Подключение в Claude

  1. Настройки → Коннекторы → Добавить пользовательский коннектор.

  2. URL: https://myfitnesspal-mcp.<subdomain>.workers.dev/mcp

  3. Нажмите Подключить → войдите с помощью email/имени пользователя и пароля MyFitnessPal → готово.

Затем: «Выполни диагностику MyFitnessPal, а затем покажи мне вчерашнее питание».

Иконка коннектора

Worker указывает PUBLIC_URL/icon.png в своих MCP serverInfo.icons (и websiteUrl), поэтому клиенты, отображающие брендинг сервера, показывают его в списке коннекторов. По умолчанию это сгенерированная иконка «тарелка и столовые приборы» (npm run icon). Чтобы вместо неё использовать официальную иконку приложения MyFitnessPal, сохраните PNG из описания в App Store / Play Store и встройте его:

npm run icon:embed -- ~/Downloads/myfitnesspal-icon.png   # writes src/icon.ts + assets/icon.png
npm run deploy

(Официальный знак — товарный знак MyFitnessPal; он допустим для личного развёртывания, но не для распространения, поэтому его нет в этом репозитории.)

Локальная разработка

cp .dev.vars.example .dev.vars   # set the secrets
npm run dev                      # http://localhost:8787
npm test                         # vitest (fake identity + API backend)
npm run typecheck
npm run icon

Примечания и ограничения

  • Неофициально. Приватный клиент приложения используется с вашими собственными учётными данными для личного использования; MFP может сменить клиент или изменить API.

  • Health Connect уже синхронизирует сводки приёмов пищи MFP в Google Health; этот сервер добавляет журнал по каждому продукту с временными метками, микронутриенты, воду, тренировки MFP и вес.

  • У целей по нутриентам пока нет подтверждённой конечной точки — run_diagnostics перебирает возможные варианты, а query_endpoint позволяет исследовать.

  • Лимиты подзапросов. Каждый день дневника — это один запрос к upstream; на бесплатном тарифе Workers (50 подзапросов на запрос) держите некэшированные окна короткими. Кэшированные дни дёшевы.

  • Смена пароля делает refresh-токен недействительным — отключите и снова подключите коннектор.

Конфиденциальность

  • Ваш пароль обменивается на токены один раз и никогда не хранится; refresh-токен хранится зашифрованным внутри OAuth-гранта.

  • Данные дневника кэшируются только в вашем собственном пространстве имён KV, запечатаны и могут быть удалены с помощью delete_my_data; ничего не отправляется третьим лицам.

Лицензия

MIT

Related MCP Connectors

Related MCP Servers