fitdays-mcp
Click on "Install 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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceConnects to Garmin Connect and exposes your fitness and health data (activities, sleep, heart rate, steps, body composition) to Claude and other MCP-compatible clients.965MIT
- 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
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Hosted remote MCP server for YNAB on Cloudflare Workers with OAuth
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/nibu147/fitdays-mcp-worker'
If you have feedback or need assistance with the MCP directory API, please join our Discord server