Skip to main content
Glama
nibu147
by nibu147

fitdays-mcp (Cloudflare Worker)

Удалённый MCP-сервер для неофициального API FitDays / iComon, размещённый на вашем Cloudflare Worker, с входом через OAuth 2.1 (никаких статических API-ключей, которые нужно вставлять в Worker: каждый подключающийся пользователь входит со своими email/password FitDays через страницу /authorize).

Основан на roquerodrigo/fitdays-mcp-server (который работает только в stdio/локально) и адаптирован для Cloudflare Workers по тому же шаблону, что и chrisdoc/hevy-mcp.

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

  • src/index.ts — объединяет @cloudflare/workers-oauth-provider (управляет PKCE, динамической регистрацией клиентов, токенами, OAuth discovery) с:

    • src/authorize.ts — страница /authorize: показывает форму email/password/region, проверяет учётные данные реальным входом в FitDays, затем сохраняет { fitdaysEmail, fitdaysPassword, fitdaysRegion } как grant props (зашифрованные в состоянии покоя библиотекой Cloudflare).

    • src/mcp-handler.ts — обработчик /mcp: автоматически защищён провайдером (требует действительный OAuth bearer token), читает учётные данные из grant и обслуживает протокол MCP через WebStandardStreamableHTTPServerTransport (из той же версии @modelcontextprotocol/sdk, что используется в оригинальном репозитории).

  • src/server.ts — те же 5 инструментов, что и в оригинале: list_users, list_devices, get_weight_history, get_latest_weight, refresh_sync.

  • src/fitdays-session.ts — клиент FitDays с кэшем в памяти для каждого изолята (5 минут), чтобы избежать входа и полной повторной синхронизации при каждом вызове, когда изолят Worker "тёплый".

Никакие учётные данные никогда не передаются стороннему серверу: вход происходит в вашем Worker, данные FitDays остаются между Worker и API FitDays.

Related MCP server: Garmin MCP Server

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

Требуется Node.js ≥ 22 и бесплатный аккаунт Cloudflare.

npm ci
npx wrangler login

# Crea il namespace KV che l'OAuth provider usa per grant e token
npx wrangler kv namespace create OAUTH_KV
# copia l'"id" restituito in wrangler.jsonc -> kv_namespaces[0].id

npm run worker:dry-run   # opzionale: verifica il bundle localmente
npm run worker:deploy    # pubblica su https://fitdays-mcp.<tuo-subdomain>.workers.dev

Подключение Claude (или другого MCP-клиента)

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

  2. URL: https://fitdays-mcp.<ваш-поддомен>.workers.dev/mcp

  3. Нажмите "Connect": откроется страница /authorize вашего Worker → введите email, пароль и регион FitDays → авторизуйтесь

С этого момента Claude может вызывать 5 инструментов FitDays, никогда не видя ваш пароль (он остаётся в зашифрованном OAuth grant внутри вашего KV namespace).

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

npm run dev

wrangler dev запускает Worker локально с имитацией локального KV namespace — полезно для тестирования формы входа и инструментов без развёртывания.

Примечания

  • Всегда используйте npm ci, никогда npm install. npm ci устанавливает точно версии из package-lock.json и проверяет каждый пакет по его SHA-512 хешу: если опубликованное в npm содержимое изменится, установка завершится с EINTEGRITY вместо тихой установки другого кода. npm install может обновить зависимости. Всегда коммитьте package-lock.json.

  • Все зависимости времени выполнения закреплены на точные версии (без ^), поэтому нет дрейфа даже при повторной установке через месяцы.

  • Развёрнутый Worker самодостаточен: wrangler deploy собирает весь код в момент развёртывания. Во время выполнения он ничего не загружает с npm или GitHub, и последующие изменения, сделанные авторами вышестоящих проектов, не затрагивают уже опубликованный Worker.

  • nodejs_compat требуется в wrangler.jsonc, потому что fitdays-api использует node:crypto (MD5 для входа) и randomUUID().

  • Учётные данные FitDays — это email+пароль (не один API-ключ, как у Hevy): поэтому форма /authorize делает реальную попытку входа перед завершением авторизации, так что неверные учётные данные отклоняются сразу, а не молча проваливаются при первом вызове инструмента.

Куда попадает пароль

Только два места:

  1. Серверы FitDays (online-{us,eu}.fitdays.cn) — неизбежно, это единственный способ аутентификации. Отправляется как MD5(MD5(password+salt)), но salt — публичная константа, поэтому это эквивалентно паролю в открытом виде: не используйте пароль FitDays где-либо ещё.

  2. Ваш KV namespace на Cloudflare, внутри grant props (зашифрованных в состоянии покоя библиотекой OAuth Cloudflare).

Никакой другой третьей стороны. fitdays-api имеет ноль зависимостей времени выполнения и только одну сетевую точку во всём коде; нет телеметрии, аналитики или отчётов об ошибках ни в одном из двух вышестоящих репозиториев, ни в этом Worker.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects to Garmin Connect and exposes fitness and health data (activities, steps, heart rate, sleep, body composition) to MCP-compatible clients like Claude.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that connects Claude to Withings health data using OAuth 2.0. Provides 11 read-only tools to access body measurements, activity, sleep, heart rate, and device information from Withings devices.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A personal MCP server on Cloudflare Workers that connects Claude to Google Health API v4, enabling reading of health data like activity, sleep, heart rate, SpO₂, HRV, and nutrition.
    MIT