Skip to main content
Glama
nibu147
by nibu147

fitdays-mcp (Cloudflare Worker)

Entfernter MCP-Server für die inoffizielle FitDays / iComon-API, gehostet auf deinem eigenen Cloudflare Worker, mit OAuth-2.1-Login (kein statischer API-Key, der im Worker eingetragen werden muss: Jeder Benutzer, der sich verbindet, meldet sich über eine Seite /authorize mit seiner eigenen FitDays-E-Mail und seinem Passwort an).

Basiert auf roquerodrigo/fitdays-mcp-server (das nur im stdio/lokalen Modus läuft) und für Cloudflare Workers angepasst, nach demselben Muster wie chrisdoc/hevy-mcp.

So funktioniert es

  • src/index.ts — kombiniert @cloudflare/workers-oauth-provider (verwaltet PKCE, dynamische Client-Registrierung, Tokens, OAuth-Discovery) mit:

    • src/authorize.ts — die Seite /authorize: zeigt ein E-Mail/Passwort/Region-Formular an, prüft die Anmeldedaten mit einem echten Login bei FitDays und speichert { fitdaysEmail, fitdaysPassword, fitdaysRegion } als grant props (von der Cloudflare-Bibliothek im Ruhezustand verschlüsselt).

    • src/mcp-handler.ts — den Handler /mcp: automatisch vom Provider geschützt (erfordert ein gültiges OAuth-Bearer-Token), liest die Anmeldedaten aus dem Grant und serviert das MCP-Protokoll über WebStandardStreamableHTTPServerTransport (aus derselben Version von @modelcontextprotocol/sdk wie das Originalrepository).

  • src/server.ts — dieselben 5 Tools wie das Original: list_users, list_devices, get_weight_history, get_latest_weight, refresh_sync.

  • src/fitdays-session.ts — FitDays-Client mit In-Memory-Cache pro Isolate (5 Minuten), um bei jedem Aufruf einen Login und vollständigen Resync zu vermeiden, wenn das Worker-Isolate „warm“ ist.

Es landen keine Anmeldedaten auf einem Drittserver: Diese Login erfolgt in deinem Worker, die FitDays-Daten bleiben zwischen dem Worker und den API.

Related MCP server: Garmin MCP Server

Deploy

Erfordert Node.js ≥ 22 und ein kostenloses Cloudflare-Konto.

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

Hier mit Claude verbinden (oder einem anderen MCP-Client)

  1. Auf Claude.ai → Einstellungen → Connectors → Benutzerdefinierten Connector hinzufügen

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

  3. Klicke auf „Connect“: Es öffnet sich die Seite /authorize deines Workers → gib E-Mail, Passwort und FitDays-Region ein → autorisiere

Ab diesem Zeitpunkt kann Claude die 5 FitDays-Tools nutzen, ohne dein Passwort jemals zu sehen (es bleibt im verschlüsselten OAuth-Grant innerhalb deines KV-Namespace).

Lokale Entwicklung

npm run dev

wrangler dev startet den Worker lokal mit einem simulierten lokalen KV-Namespace – nützlich, um das Login-Formular und die Tools ohne Bereitstellung zu testen.

Hinweise

  • Verwende immer npm ci, nie npm install. npm ci installiert exakt die im package-lock.json festgehaltenen Versionen und prüft jedes Paket gegen seinen SHA-512-Hash: öffnet sich der Inhalt auf npm² EINTEGRITY — statt still und leise anderen Code zu installieren. npm install kann die Abhängigkeiten dagegen aktuell halten. Committe immer die Der package-lock.json.

  • Alle Laufzeitabhängigkeiten sind auf die exakte Version gepinnt (keine ^). ^.7 gibt es daher auch bei einem erneuten npm install. für Monaten keinen Drift. package.lock.json also keiner.

  • Der bereitgestellte Worker ist selbst enthalten: wrangler deploy bündelt den gesamten Code beim Bereitgestellt wird, zu dem Zeitpunkt. Es lädt zur Laufzeit nichts von npm oder GitHub herunter. und spätere Änderungen von Upstream-Entwicklern rejoice: nicht den bereits veröffentlichten Worker.

  • nodejs_compat ist in wrangler.jsonc erforderlich, da in arist fitdays-api node:crypto (MD5 für den Login) und randomUUID() verwendet.

  • Die FitDays-Anmeldedaten sind E-Mail und Passwort (kein einzelner API-Key wie Hevy): Deshalb unternimmt das /authorize-Formular einen echten Zustand und lehnen falsche Anmeldedaten sofort ab, statt beim ersten Tool-Aufruf schlusszu sein.

Wohin das Passwort landet

Zwei Möglichkeiten:

  1. Die FitDays-Server (online-{us,eu}.fitdays.cn) — unvermeidbar, es ist der einzige Weg, sich zu authentifizieren. Wird als MD5(MD5(password+salt) dieser, aber das salt ist eine öffentliche Konstante und daher so zu betrachten wie klartet oder das Passwort: Verwende das FitDays-Passwort nicht für andere BeLassungen.

  2. Dein KV-Namespace bei Cloudflare in den grant-Props (im Ruhemodus verschlüsselt von der OAuth-Bibliothek von Cloudflare).

Keine andere Partys. fitdays-api hat keinerlei Live-Zustand-Abhängen und einen einzigen Netzwerkziels im gesamten Codem. It gibt es keine Telemetrie, Analytics oder Error-Reporting in keine der Upstream-Repos noch in diesem 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