Skip to main content
Glama
nibu147
by nibu147

fitdays-mcp (Cloudflare Worker)

非公式FitDays / iComon API用のリモートMCPサーバー。あなた自身のCloudflare Worker上でホストされ、OAuth 2.1ログインを備えています(Workerに静的なAPIキーを貼り付ける必要はありません。接続する各ユーザーは/authorizeページを介して自分のFitDaysメールアドレス/パスワードでログインします)。

roquerodrigo/fitdays-mcp-server(stdio/ローカルのみで動作)に基づき、chrisdoc/hevy-mcpで使用されているのと同じパターンに従ってCloudflare Workers用に再適合させました。

仕組み

  • src/index.ts — @cloudflare/workers-oauth-provider(PKCE、動的クライアント登録、トークン、OAuthディスカバリーを処理)を以下と組み合わせます:

    • src/authorize.ts — /authorizeページ:メールアドレス/パスワード/リージョンのフォームを表示し、FitDaysへの実際のログインで資格情報を検証し、{ fitdaysEmail, fitdaysPassword, fitdaysRegion }をgrant propsとして保存します(Cloudflareのライブラリによって保存時に暗号化されます)。

    • src/mcp-handler.ts — /mcpハンドラー:プロバイダーによって自動的に保護され(有効なOAuthベアラートークンが必要)、grantから資格情報を読み取り、WebStandardStreamableHTTPServerTransportを介してMCPプロトコルを提供します(元のリポジトリで使用されているのと同じバージョンの@modelcontextprotocol/sdkから)。

  • src/server.ts — オリジナルと同じ5つのツール:list_users、list_devices、get_weight_history、get_latest_weight、refresh_sync。

  • src/fitdays-session.ts — アイソレートごとのインメモリキャッシュ(5分)を備えたFitDaysクライアント。Workerアイソレートが「ウォーム」な場合に、呼び出しのたびにログインと完全な再同期を回避します。

資格情報がサードパーティのサーバーを経由することはありません。ログインはあなたのWorker内で行われ、FitDaysデータはWorkerとFitDays APIの間だけを移動します。

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. 「接続」をクリック:Workerの/authorizeページが開きます → メールアドレス、パスワード、FitDaysリージョンを入力 → 承認します

これ以降、Claudeはあなたのパスワードを見ることなく5つのFitDaysツールを呼び出すことができます(パスワードはKV名前空間内の暗号化されたOAuth grantに残ります)。

ローカル開発

npm run dev

wrangler devは、ローカルのKV名前空間をシミュレートしてWorkerをローカルで起動します。デプロイせずにログインフォームとツールをテストするのに便利です。

注意事項

  • 常に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の資格情報はメールアドレス+パスワードです(Hevyのような単一のAPIキーではありません)。そのため、/authorizeフォームは承認を完了する前に実際のログイン試行を行い、間違った資格情報が最初のツール呼び出しで静かに失敗するのではなく、すぐに拒否されるようにします。

パスワードの行き先

2つの宛先のみ:

  1. FitDaysサーバー(online-{us,eu}.fitdays.cn)— 避けられません。認証する唯一の方法です。MD5(MD5(password+salt))として送信されますが、saltは公開された定数であるため、平文パスワードと同等と見なす必要があります。FitDaysのパスワードを他の場所で再利用しないでください。

  2. Cloudflare上のあなたのKV名前空間、grant props内(CloudflareのOAuthライブラリによって保存時に暗号化されます)。

他のサードパーティはありません。fitdays-apiにはランタイム依存関係がゼロで、コード全体にネットワークポイントが1つだけあります。アップストリームの2つのリポジトリにも、この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