fitdays-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fitdays-mcpShow my latest weight and sync my FitDays data."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fitdays-mcp (Cloudflare Worker)
Remote MCP server for the unofficial FitDays / iComon API, hosted on your
own Cloudflare Worker, with OAuth 2.1 login (no static API key to paste
into the Worker: every connecting user logs in with their own FitDays
email/password via an /authorize page).
Based on roquerodrigo/fitdays-mcp-server
(which only runs in stdio/local) and adapted for Cloudflare Workers following
the same pattern used by chrisdoc/hevy-mcp.
How it works
src/index.ts— composes@cloudflare/workers-oauth-provider(handles PKCE, dynamic client registration, tokens, OAuth discovery) with:src/authorize.ts— the/authorizepage: shows an email/password/region form, verifies the credentials with a real login on FitDays, then saves{ fitdaysEmail, fitdaysPassword, fitdaysRegion }as grant props (encrypted at rest by Cloudflare's library).src/mcp-handler.ts— the/mcphandler: automatically protected by the provider (requires a valid OAuth bearer token), reads the credentials from the grant and serves the MCP protocol viaWebStandardStreamableHTTPServerTransport(from the same version of@modelcontextprotocol/sdkused by the original repo).
src/server.ts— the same 5 tools as the original:list_users,list_devices,get_weight_history,get_latest_weight,refresh_sync.src/fitdays-session.ts— FitDays client with per-isolate in-memory cache (5 minutes), to avoid login + full resync on every call when the Worker isolate is "warm".
No credentials ever travel through a third-party server: the login happens in your Worker, and FitDays data stays between the Worker and the FitDays API.
Related MCP server: Garmin MCP Server
Deploy
Requires Node.js ≥ 22 and a free Cloudflare account.
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.devConnecting Claude (or another MCP client)
Claude.ai → Settings → Connectors → Add custom connector
URL:
https://fitdays-mcp.<your-subdomain>.workers.dev/mcpClick "Connect": your Worker's
/authorizepage opens → enter email, password, and FitDays region → authorize
From that point on, Claude can call the 5 FitDays tools without ever seeing your password (it stays in the encrypted OAuth grant inside your KV namespace).
Local development
npm run devwrangler dev starts the Worker locally with a simulated local KV namespace —
useful for testing the login form and the tools without deploying.
Notes
Always use
npm ci, nevernpm install.npm ciinstalls exactly the versions frompackage-lock.jsonand verifies each package against its SHA-512 hash: if the content published on npm changes, the installation fails withEINTEGRITYinstead of silently installing different code.npm installcan instead update dependencies. Always commit thepackage-lock.json.All runtime dependencies are pinned to exact versions (no
^), so there's no drift even if you re-run the install months later.The deployed Worker is self-contained:
wrangler deploybundles all the code at deploy time. At runtime it downloads nothing from npm or GitHub, and later changes made by upstream authors don't touch the already-published Worker.nodejs_compatis required inwrangler.jsoncbecausefitdays-apiusesnode:crypto(MD5 for login) andrandomUUID().FitDays credentials are email+password (not a single API key like Hevy): that's why the
/authorizeform performs a real login attempt before completing authorization, so wrong credentials are rejected immediately instead of failing silently on the first tool call.
Where the password ends up
Only two destinations:
The FitDays servers (
online-{us,eu}.fitdays.cn) — unavoidable, it's the only way to authenticate. Sent as MD5(MD5(password+salt)), but the salt is a public constant, so it should be considered equivalent to a plaintext password: don't reuse your FitDays password elsewhere.Your KV namespace on Cloudflare, inside the grant props (encrypted at rest by Cloudflare's OAuth library).
No other third party. fitdays-api has zero runtime dependencies and only one
network endpoint in the entire codebase; there's no telemetry, analytics, or error
reporting in either upstream repo or in this Worker.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Pace is a remote MCP server that exposes wearable and fitness data to Claude via the Model Context Protocol. It connects to Garmin, Oura, Whoop, Polar, Fitbit and 20+ devices and provides 15 tools for querying sleep, activity, recovery, and training data. Hosted on Google Cloud Run, OAuth 2.1 authentication, Streamable HTTP transport. Instructions: First you need to create an account at: https://pacetraining.co and connect your wearables. After that you can connect the remote Server via Custom Connector in Claude and OAuth 2.1 Flow startet.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Hosted remote MCP server for YNAB on Cloudflare Workers with OAuth
Related MCP Servers
- AlicenseBqualityAmaintenanceConnects to Garmin Connect and exposes your fitness and health data (activities, sleep, heart rate, steps, body composition) to Claude and other MCP-compatible clients.1481,162MIT
- AlicenseNot gradedqualityDmaintenanceConnects to Garmin Connect and exposes fitness and health data (activities, steps, heart rate, sleep, body composition) to MCP-compatible clients like Claude.MIT
- AlicenseNot gradedqualityDmaintenanceAn 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
- AlicenseNot gradedqualityCmaintenanceA 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