Skip to main content
Glama
a1dancole

Renpho Health MCP

by a1dancole

Renpho Health MCP — Claudeのトレーニングコーチ向けスマートスケールデータ

Cloudflare Workers上にデプロイされたリモートMCPサーバーで、Renphoスマートスケールの体組成データ(体重、体脂肪、除脂肪量、筋肉量、水分量、骨量、内臓脂肪、BMR、代謝年齢など)をRenpho HealthクラウドAPI経由でClaudeに公開します。カスタムコネクタとして一度追加すれば、Claude Web、デスクトップ、モバイルで動作します。StravaおよびGoogle Healthコネクタと組み合わせることで、コーチはトレーニング負荷、回復、そして体組成を確認できます。

データソース: Renpho Healthアプリ(青いアイコン)のバックエンドcloud.renpho.com。レガシーRenphoアプリ(renpho.qnclouds.com)のアカウントはサポートされていません。先にアプリ内で移行してください。

StartupBros-com/renpho-mcp-server(ローカルstdioサーバー)とforkerer/RenphoGarminSync-CLIのリバースエンジニアリングされたプロトコルに基づき、google-health-mcpのスタイルでマルチユーザーリモートWorkerとして再構築しました。

Tools

Tool

What it answers

get_latest_measurement

「今の調子は?」— 最新の測定値とすべての指標、カテゴリ分類、7/30/90日前との変化、アプリの体重目標への進捗

get_measurements

期間内の測定履歴:各計量ごとの全指標、または日/週ごとの平均値。オプションで指標のサブセットとデバイス/インピーダンスの詳細

get_body_composition_trend

指標ごとの開始/終了平均、変化、最小/最大/平均、最小二乗法による週次レート(r²付き)、さらに日次/週次シリーズ — 体重変化は脂肪か除脂肪量か?

get_weight_trend

日平均体重と7日移動平均、適合した週次レート、目標達成時期の予測(および目標日を達成するために必要なレート)

get_profile

性別、年齢、身長、単位、アスリートモード、アプリで設定された目標(目標体重/日付、目標体脂肪、開始時体重)

get_scale_users

スケールユーザー(プロファイル)ID、データテーブル、家族メンバー、Renphoが報告するすべてのデバイス/データカテゴリ

run_diagnostics

エンドツーエンドのプローブ:セッション、テーブル、ページ順序、プロファイルごとの最近の測定値、バインド済み/未バインド、検出されたデバイス

query_endpoint

エスケープハッチ:アプリの暗号化/認証を適用して任意のcloud.renpho.comエンドポイントを呼び出す

refresh_data

キャッシュされたセッションとページを破棄して再ログイン(新しい計量が表示されない場合)

delete_my_data

アカウントにキャッシュされたすべてのデータを削除

トラブルシューティング: 測定値が欠落している、古い、または誤った人物に帰属しているように見える場合は、最初にrun_diagnosticsを実行してください。データが実際にどこにあるか(どのテーブル/プロファイル、バインドされているかどうか)を報告するため、下流の症状から推測する必要はありません。


Related MCP server: Oura Ring MCP Server

Field mapping (Renpho Health API)

RenphoHealth/scale/queryAllMeasureDataListからの生レコードには約57個のキーがあります。ツールはメトリクスを単位接尾辞付きのsnake_caseにリネームし、enumコードをデコードし、エンベロープノイズを除去し、認識されないものはextraの下に保持するため、Renphoがフィールドを追加しても失われるものはありません(src/measurements.tsを参照)。

Renpho key

Tool field

Unit / meaning

weight

weight_kg

kg(アプリの表示単位に関係なく常にkg)

bmi

bmi

bodyfat

body_fat_pct

%

fatFreeWeight

fat_free_mass_kg

kg

subfat

subcutaneous_fat_pct

%

visfat

visceral_fat_level

レベル1〜59(≤9は健康的、10〜14は高、≥15は非常に高)

water

body_water_pct

%

sinew

skeletal_muscle_pct

%

muscle

muscle_mass_kg

kg

bone

bone_mass_kg

kg

protein

protein_pct

%

bmr

bmr_kcal

kcal/日

bodyage

metabolic_age

heartRate

heart_rate_bpm

bpm(心拍センサー付きスケールのみ)

cardiacIndex

cardiac_index

L/min/m²

waistline, hip

waistline_cm, hip_cm

cm(入力された場合のみ)

bodyShape / bodytype

body_type

thin, low_fat, athletic, muscle_deficient, well_balanced, overweight, invisible_obesity, fat_excess, obese

personType

athlete_mode

ブール値

resistance, secResistance, actual*

impedance.*

生の生体インピーダンス(Ω)

method

source.method

測定値の割り当て方法(bluetooth_online_measurecloud_wifi_auto_allocationmanual_inputなど)

internalModel, scaleName, mac, deviceType, isAuto, sportFlag, invalidFlag

source.*

デバイスとフラグ

bUserId, subUserId

user.bound_user_id, user.scale_user_id

測定値がバインドされているアカウント / 測定されたプロファイル

timeStamp

timestamp, time, date

Unix秒。TIME_ZONEでのローカルRFC-3339とカレンダー日付

0として報告されたメトリクスは「未測定」を意味し、省略されます。Renpho IDはJavaScriptの安全な範囲を超える64ビット整数であるため、クライアントは解析前にそれらを文字列として再引用します(src/json.ts)。

データの取得方法

  • ログインrenpho-aggregation/user/login)はexpAt付きのベアラートークンを返します。これは有効期限の少し前までKVにキャッシュ(シール)され、再ログインによって更新されます — Renphoにはリフレッシュトークンがありません。

  • device/count はアカウントのデータテーブルとレコード数を一覧表示し、ツール呼び出しのたびに新しく取得されます。これが鮮度のシグナルです。

  • テーブルごとに2つのストア。measurements_info_Nテーブルは、両方scale/queryAllMeasureDataList(レガシーストア。device/countがカウントする行)とscale/queryBodyCompositionMeasureDataMorphoScanなどの8電極/多周波数スケールが使用する新しいストア。device/countカウントしない)から読み取られます。行はidでマージされ、両方が存在する場合はボディコンポジションのコピーが保持されます。これはより豊富なフィールドセットを持つためです。source.endpointは読み取りがどのストアから来たかを示します。

  • 測定ページ(各200レコード)はKVにキャッシュされます。レガシーページはテーブル、プロファイルセットおよびレコード数でキー付けされるため、新しい計測があるとキーが変わり自動的に無効化されます。ボディコンポジションページにはカウントがなく、代わりに15分間キャッシュされます。ページネーターは各ストアの並び順を検出し、要求されたウィンドウに必要な範囲だけを走査します(呼び出しごとにストアあたり最大30ページ/6,000レコード)。

  • 選択: サインイン中のアカウント(bUserId)にバインドされた測定値がデフォルトで返されます。まだ何もバインドされていない場合(Wi-Fiスケールはアプリが測定値をバインドする前にアップロードする)、アカウントの最初のスケールユーザープロファイルにフォールバックし、その旨を通知します。家族メンバーの場合はscale_user_idを渡してください。

キャッシュと暗号化

RENPHO_CACHE KV名前空間に書き込まれるすべてのもの — セッショントークンと測定ページ — は、SESSION_ENCRYPTION_KEYシークレットから導出されたキー(メールアドレスのSHA-256)でユーザーごとにキー付けされ、AES-256-GCMでシールされます。シークレットが未設定の場合、キャッシュは単に無効化されます。キャッシュの失敗がリクエストを壊すことはありません。

Renphoトランスポート自体は、アプリに同梱されている静的キーを使用したAES-128-ECBです。WebCryptoにはECBモードがないため、Workerは純JSのaes-jssrc/crypto.ts、テストでOpenSSLとバイト単位で検証済み)を使用します。


サインインの仕組み(一度読んでください)

RenphoにはOAuthがありません。WorkerはClaudeに対してOAuthサーバーとして機能し(workers-oauth-provider)、その/authorizeページはRenphoのサインインフォームです。メールアドレスとパスワードはRenphoに対して一度だけ検証され、その後グラントの暗号化されたプロパティ内に保存されます — 暗号化キーはClaudeが保持するトークンから導出されるため、KVの内容だけでは復号できません。資格情報が必要なのは、Renphoのセッショントークンが数時間で期限切れになり、新しいトークンを取得する唯一の方法が再ログインだからです。

  • Claudeでコネクタを切断するとグラントが削除されます(保存された資格情報も一緒に削除されます)。delete_my_dataはキャッシュをクリアします。

  • ALLOWED_EMAILS(カンマ区切り)を設定すると、あなたのデプロイメントに他の人のRenphoアカウントが接続するのを防げます。空のままにすると、任意のRenphoユーザーが使用できます(各ユーザーは自分のデータしか見えません)。

デプロイ

オプションA — GitHub Actions(ローカルのwrangler不要)

.github/workflows/deploy.ymlのワークフローは、masterへのプッシュのたびに(およびオンデマンドで)デプロイします。アプリのシークレットはGitHubではなくCloudflareにあります — GitHubが保持するのはCloudflare APIトークンとアカウントIDのみです。

  1. Cloudflareダッシュボードで2つのKV名前空間を作成しますStorage & Databases → KV):OAUTH_KVRENPHO_CACHE。それらのIDをwrangler.jsoncに貼り付けてコミットします。

  2. Cloudflare APIトークンを作成しますMy Profile → API Tokens → "Edit Cloudflare Workers"テンプレート)し、アカウントIDをメモします。

  3. GitHubリポジトリのシークレットCLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_IDを追加します。

  4. masterにプッシュします。 ActionsのログにWorkerのURL(https://renpho-health-mcp.<subdomain>.workers.dev)が出力されます。

  5. Cloudflareでアプリのシークレットを設定しますWorkers & Pages → renpho-health-mcp → Settings → Variables and Secrets、タイプSecret): SESSION_ENCRYPTION_KEY = 任意の長いランダム文字列。 必要に応じてALLOWED_EMAILS変数にあなたのRenphoメールアドレスを設定します。

オプションB — ローカルのwrangler

npm install
npx wrangler kv namespace create OAUTH_KV        # paste the id into wrangler.jsonc
npx wrangler kv namespace create RENPHO_CACHE    # paste the id into wrangler.jsonc
npx wrangler secret put SESSION_ENCRYPTION_KEY   # any long random string
npx wrangler deploy

Claudeで接続

  1. Settings → Connectors → Add custom connector.

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

  3. Connectをクリック → Renpho Healthのメールアドレス/パスワードでサインイン → 完了。

その後、コーチにこう尋ねてみてください:「最新のスケール測定値を取得して、先月の体重減少が脂肪由来か除脂肪量由来かを教えてください。」

コネクタのアイコン

WorkerはMCPのserverInfo.icons(およびwebsiteUrl)でPUBLIC_URL/icon.pngを公開するため、サーバーブランディングをレンダリングするクライアントはコネクタリストにそれを表示します。デフォルトは生成されたスケールアイコン(npm run icon)です。代わりに公式のRenpho Healthアプリアイコンを使用するには、App Store/Play StoreのリストからPNGを保存して埋め込みます:

npm run icon:embed -- ~/Downloads/renpho-health-icon.png   # writes src/icon.ts + assets/icon.png
npm run deploy

(公式マークはRenphoの商標です — 個人のデプロイメントには問題ありませんが、再配布には適していません。そのためこのリポジトリには含まれていません。)

ローカル開発

cp .dev.vars.example .dev.vars   # set SESSION_ENCRYPTION_KEY
npm run dev                      # http://localhost:8787
npm test                         # vitest
npm run typecheck                # worker + tests
npm run icon                     # regenerate assets/icon.png + src/icon.ts

MCP Inspectorでフローをテストします:

npx @modelcontextprotocol/inspector@latest
# Transport: Streamable HTTP → http://localhost:8787/mcp → Connect

仕組み

Claude (web/desktop/mobile)
  └─ custom connector → /mcp
       └─ workers-oauth-provider  (this Worker IS Claude's OAuth server)
            └─ AuthHandler        (Renpho sign-in page; validates against Renpho)
                 └─ RenphoMCP (Durable Object) → RenphoClient → cloud.renpho.com
  • src/index.tsOAuthProvider + McpAgent Durable Objectを配線します。

  • src/auth-handler.ts — サインインページ(/authorize)、ランディングページ、アイコン。

  • src/renpho-api.ts — Renphoクライアント:セッションキャッシュ、リトライ/再ログイン付きの暗号化トランスポート、順序非依存のページネーター、ユーザー選択。

  • src/measurements.ts — 生レコード → スリムなコーチング形状、列挙型、分類、プロファイル。

  • src/stats.ts — 回帰、エッジウィンドウ集計、移動平均、目標予測。

  • src/tools.ts — 上記のコーチングツール。

  • src/crypto.tssrc/json.tssrc/dates.ts — AESヘルパー、big-int対応JSON、タイムゾーン対応日付。すべて純粋でユニットテスト済み。

注意事項と制限

  • Wi-Fiスケールのバインド遅延。 一部のWi-Fiスケールは、アプリがアカウントにバインドする前に測定値をアップロードします。それまではscale_user_idはありますがbound_user_idはありません。ツールは最初のプロファイルにフォールバックし、その旨を通知します(selection: "fallback_scale_user")。run_diagnosticsは非表示の測定値を一覧表示します。

  • 生体インピーダンスはノイズが多いです。 水分量、時間帯、最近のトレーニングによって体脂肪率/体水分率の測定値は数ポイント変動します。同じ時間帯に計測し、単発の測定値ではなく平均値/トレンドを読んでください — トレンドツールが7日間のエッジウィンドウと移動平均を使用するのはまさにこのためです。

  • 単位。 質量はkg、組成指標は%で、Renphoアプリと一致しています。muscleは筋肉(kg)、sinewは骨格筋率%として報告されます。デバイスのファームウェアが別の値を報告する場合、生の値は変更されず、ラベルのみが異なります。

  • MorphoScan/8電極スケール。 これらの測定値はボディコンポジションストア(上記参照)にあり、追加のデバイス固有フィールド — 部位別脂肪/筋肉、SMIなど — を持ちます。ツールはこれらをextraの下でパススルーします(include_detailsを要求するか、run_diagnosticsunrecognised_fields_seenを参照してください)。これらのフィールド名でissueを開いて、適切にマッピングできるようにしてください。

  • 専用ツールがあるのはscaleカテゴリのみです。 周囲径/メジャー、トレッドミル、ロープ、ボディスキャン(MorphoScan)のデータはget_scale_usersdevice_categoriesに表示され、query_endpointで探索できます。

  • レート制限。 負荷がかかるとRenphoはコード429を返します。クライアントはバックオフしてリトライし、キャッシュされたページが引き続き提供されます。

  • パスワードの変更は保存された資格情報を壊します — コネクタを切断して再接続してください。

  • 非公式API。 これはモバイルアプリのプライベートAPIを使用しています。Renphoはいつでも変更する可能性があります。Renphoとは提携しておらず、承認も受けていません。

プライバシー

  • 資格情報はRenphoとの認証にのみ使用され、OAuthグラント内に暗号化されて保存されます。ログには何も記録されません。

  • 健康データは自分のKV名前空間にのみキャッシュされ、シールされ、delete_my_dataで削除可能です。第三者に送信されるものはありません。

クレジット

ライセンス

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

Related MCP Connectors

  • WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.

  • Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.

  • 63 tools for Apple Health, Fitbit, Oura & Health Connect data in Claude, ChatGPT, Grok & Mistral.

View all MCP Connectors

Latest Blog Posts

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/a1dancole/renpho-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server