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 discovery 처리).

    • src/authorize.ts — /authorize 페이지: 이메일/비밀번호/지역 입력 폼을 표시하고, FitDays에 실제 로그인을 통해 자격 증명을 확인한 다음 { fitdaysEmail, fitdaysPassword, fitdaysRegion }을 grant props로 저장합니다(Cloudflare 라이브러리에 의해 휴지 상태에서 암호화됨).

    • src/mcp-handler.ts — /mcp 핸들러: provider가 자동으로 보호합니다(유효한 OAuth bearer 토큰 필요). grant에서 자격 증명을 읽어 원본 저장소에서 사용한 것과 동일한 버전의 @modelcontextprotocol/sdk에서 가져온 WebStandardStreamableHTTPServerTransport를 통해 MCP 프로토콜을 제공합니다.

  • src/server.ts — 원본과 동일한 5개의 도구: src/server.ts, list_devices, get_weight_history, get_latest_weight, refresh_sync.

  • src/fitdays-session.ts — isolate별 메모리 캐시(5분)가 있는 FitDays 클라이언트로, Worker isolate가 '핫'한 상태일 때 호출할 때마다 로그인 및 전체 재동기화를 방지합니다.

어떤 자격 증명도 제3자 서버를 거치지 않습니다. 로그인은 사용자의 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

클로드(또는 다른 MCP 클라이언트) 연결

  1. Claude.ai → 설정 → 커넥터 → 커넥터 비공개 추가

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

  3. "Connect" 클릭 → 사용자 Worker의 /authorize 페이지가 열립니다 → 이메일, 비밀번호, FitDays 지역을 입력하면 인증됩니다.

이 시점부터 Claude는 사용자의 비밀번호를 볼 수 없이도 FitDays 도구 5개를 호출할 수 있습니다(비밀번호는 암호화된 OAuth grant props 내에서 KV 네임스페이스에 유지됩니다).

로컬 개발

npm run dev

wrangler dev는 로컬 KV namespace를 시뮬레이션하기 위해 로컬에서 Worker를 시작합니다. 배포하지 않고도 로그인 양식과 도구를 테스트할 때 유용합니다.

참고 사항

  • 항상 npm ci를 사용하고, npm install은 절대 사용하지 마세요. npm ci는 정확히 package-lock.json에 명시된 버전과 같은 hash SHA-512를 확인합니다. npm에 게시된 콘텐츠가 변경되면 조용히 다른 코드를 설치하는 대신 EINTEGRITY 오류와 함께 설치가 실패합니다. npm install을 반대로 종속성을 업데이트할 수 있습니다. 항상 package-lock.json을 Git에 커밋하세요.

  • 모든 런타임 종속성은 정확한 버전으로 고정되어(고정 파운드, ^ 없음) 몇 개월 후에 환경을 다시 설치해도 drift가 없습니다.

  • 배포된 Worker는 자가 수정적입니다. wrangler deploy는 배포 시점에 모든 코드를 번들합니다. 런타임에서는 npm이나 GitHub에서 아무것도 다운로드하지 않으며, 이후 The author님이 만든 업스트림 변경 사항은 이미 게시된 Worker에 영향을 미치지 않습니다.

  • nodejs_compat는 fitdays-api가 node:crypto(MD5연과 randomUUID()를 사용하기 때문에 wrangler.jsonc에서 필요합니다.

  • FitDays 사용자 인증은 이메일 + 비밀번호입니다(Hevy와 같이 단일 API 대신). 그 때문에 /authorize` 폼은 인증을 완료하기 전에 실제 로그인을 시도하므로 잘못된 자격은 악성이 아니라 첫 번째 도구 호출에서 바로로 거부됩니다.

비밀번호의 최종 위치

단 두 곳입니다:

  1. FitDays 서버 (online-{us,eu}.fitdays.cn) — 피할 수 없는 유일한 인증 방법입니다. MD5(MD5(password+salt))로 전송되지만 salt는 공개 상수이므로 일반 텍스트 비밀-generic처럼 취급해야 합니다. 다른 곳에서 FitDays 비밀번호를 재사용하지 마세요.

  2. Cloudflare의 KV 네임스페이스, grant props 안에 저장됩니다(Cloudflare OAuth 라이브러리가 휴지 상태에서 암호화).

다른 제3자는 없습니다. 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