Skip to main content
Glama
a1dancole

Renpho Health MCP

by a1dancole

Renpho Health MCP — данные умных весов для вашего тренера Claude

Удалённый MCP сервер, развёрнутый на Cloudflare Workers, который предоставляет данные о составе тела с ваших умных весов Renpho — вес, процент жира, безжировую массу, мышцы, воду, кости, висцеральный жир, BMR, метаболический возраст и другое — в Claude через облачный API Renpho Health. Добавьте его один раз как пользовательский коннектор, и он будет работать на Claude в вебе, на десктопе и на мобильных устройствах. Сочетается с коннекторами Strava и Google Health, чтобы ваш тренер видел тренировочную нагрузку, восстановление и состав тела.

Источник данных: бэкенд приложения Renpho Health (синяя иконка) по адресу cloud.renpho.com. Учётные записи в устаревшем приложении Renpho (renpho.qnclouds.com) не поддерживаются — сначала перенесите их в приложении.

Создан на основе протокола, восстановленного из StartupBros-com/renpho-mcp-server (локальный stdio-сервер) и forkerer/RenphoGarminSync-CLI, переработан в многопользовательский удалённый Worker в стиле google-health-mcp.

Инструменты

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

Идентификаторы пользователей весов (профилей), таблицы данных, члены семьи и все категории устройств/данных, о которых сообщает Renpho

run_diagnostics

Сквозная проверка: сессия, таблицы, порядок страниц, последние измерения по каждому профилю, привязанные и непривязанные, видимые устройства

query_endpoint

Запасной выход: вызвать любой endpoint cloud.renpho.com с применением шифрования/аутентификации приложения

refresh_data

Сбросить кэшированную сессию и страницы и войти снова (после нового взвешивания, которое не отображается)

delete_my_data

Удалить все кэшированные данные для вашей учётной записи

Устранение неполадок: если измерения выглядят отсутствующими, устаревшими или приписанными не тому человеку, сначала запустите run_diagnostics. Он сообщает, где на самом деле находятся данные (какая таблица/профиль, привязаны или нет), вместо того чтобы заставлять вас делать выводы по косвенному симптому.


Related MCP server: Oura Ring MCP Server

Сопоставление полей (Renpho Health API)

Необработанная запись из RenphoHealth/scale/queryAllMeasureDataList содержит ~57 ключей. Инструменты переименовывают показатели в snake_case с суффиксом единицы измерения, декодируют коды перечислений, убирают шум обёртки и сохраняют всё нераспознанное в extra, чтобы ничего не терялось при добавлении полей Renpho (см. src/measurements.ts).

Renpho key

Tool field

Unit / meaning

weight

weight_kg

кг (всегда кг, независимо от единицы отображения в приложении)

bmi

bmi

bodyfat

body_fat_pct

%

fatFreeWeight

fat_free_mass_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

кг

bone

bone_mass_kg

кг

protein

protein_pct

%

bmr

bmr_kcal

ккал/день

bodyage

metabolic_age

годы

heartRate

heart_rate_bpm

уд/мин (только весы с датчиком ЧСС)

cardiacIndex

cardiac_index

л/мин/м²

waistline, hip

waistline_cm, hip_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_measure, cloud_wifi_auto_allocation, manual_input, …)

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

source.*

устройство + флаги

bUserId, subUserId

user.bound_user_id, user.scale_user_id

учётная запись, к которой привязано измерение / профиль, под которым оно было выполнено

timeStamp

timestamp, time, date

секунды Unix; локальная дата RFC-3339 и календарная дата в TIME_ZONE

Показатель, сообщённый как 0, означает «не измерено» и опускается. Идентификаторы Renpho — 64-битные целые числа, выходящие за безопасный диапазон JavaScript, поэтому клиент переводит их в строки перед разбором (src/json.ts).

Как получаются данные

  • Вход (renpho-aggregation/user/login) возвращает bearer-токен с expAt; он кэшируется (запечатывается) в KV до истечения срока и обновляется повторным входом — у Renpho нет refresh-токенов.

  • device/count перечисляет таблицы данных и количество записей аккаунта и запрашивается заново при каждом вызове инструмента; это сигнал свежести.

  • Два хранилища на таблицу. Каждая таблица measurements_info_N читается из обоих scale/queryAllMeasureDataList (легаси-хранилище, строки которого device/count считает) и scale/queryBodyCompositionMeasureData (новое хранилище, используемое весами с 8 электродами / многочастотными весами, такими как MorphoScan, которое device/count не считает). Строки объединяются по id, при этом сохраняется копия из body-composition, если существуют обе, потому что она содержит более полный набор полей; source.endpoint указывает, из какого хранилища получено измерение.

  • Страницы измерений (по 200 записей) кэшируются в KV. Легаси-страницы ключуются по таблице, набору профилей и количеству записей, поэтому новое взвешивание меняет ключ и автоматически инвалидирует кэш; страницы body-composition не имеют счётчика и кэшируются 15 минут. Пагинатор определяет порядок сортировки каждого хранилища и проходит только до нужного окна (максимум 30 страниц / 6 000 записей на хранилище за вызов).

  • Выбор: по умолчанию возвращаются измерения, привязанные к вошедшему аккаунту (bUserId); если ещё ничего не привязано (Wi-Fi весы загружают измерение до привязки в приложении), используется первый профиль scale-user аккаунта, и об этом сообщается. Передайте scale_user_id для члена семьи.

Кэширование и шифрование

Всё, что записывается в KV-пространство имён RENPHO_CACHE — токены сессий и страницы измерений — запечатывается AES-256-GCM ключом, полученным из секрета SESSION_ENCRYPTION_KEY, с привязкой к пользователю (SHA-256 от email). Если секрет не задан, кэширование просто отключено. Сбои кэша никогда не ломают запрос.

Сам транспорт Renpho использует AES-128-ECB со статическим ключом из приложения; в WebCrypto нет режима ECB, поэтому Worker использует чистый JS-модуль aes-js (src/crypto.ts, проверенный побайтово против OpenSSL в тестах).


Как работает вход (прочтите один раз)

У Renpho нет OAuth. Worker является OAuth-сервером для Claude (workers-oauth-provider), а его страница /authorize — это форма входа в Renpho. Ваши email/пароль проверяются в Renpho один раз, затем сохраняются в зашифрованных свойствах гранта — ключ шифрования получается из токена, который хранит Claude, поэтому содержимое KV само по себе не может быть расшифровано. Учётные данные нужны, потому что токены сессии Renpho истекают через несколько часов, и единственный способ получить новый — войти снова.

  • Отключение коннектора в Claude удаляет грант (и вместе с ним сохранённые учётные данные); delete_my_data очищает кэш.

  • Установите ALLOWED_EMAILS (через запятую), чтобы запретить другим аккаунтам Renpho подключаться к вашему развёртыванию. Если оставить пустым, любой пользователь Renpho сможет им пользоваться (каждый видит только свои данные).

Развёртывание

Вариант A — GitHub Actions (без локального wrangler)

Workflow в .github/workflows/deploy.yml развёртывает при каждом push в master (и по запросу). Секрет приложения хранится в Cloudflare, а не в GitHub — GitHub хранит только API-токен Cloudflare и ID аккаунта.

  1. Создайте два KV-пространства имён в панели Cloudflare (Storage & Databases → KV): OAUTH_KV и RENPHO_CACHE. Вставьте их id в wrangler.jsonc и закоммитьте.

  2. Создайте API-токен Cloudflare (My Profile → API Tokens → шаблон "Edit Cloudflare Workers") и запишите ваш Account ID.

  3. Добавьте секреты репозитория GitHub CLOUDFLARE_API_TOKEN и CLOUDFLARE_ACCOUNT_ID.

  4. Запушьте в master. В логе Actions будет выведен URL Worker'а (https://renpho-health-mcp.<subdomain>.workers.dev).

  5. Установите секрет приложения в Cloudflare (Workers & Pages → renpho-health-mcp → Settings → Variables and Secrets, тип Secret): SESSION_ENCRYPTION_KEY = любая длинная случайная строка. При желании установите переменную ALLOWED_EMAILS на ваш email 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 → войдите с вашим email/паролем Renpho Health → готово.

Затем спросите вашего тренера: «Получи моё последнее измерение с весов и скажи, потеря веса за последний месяц произошла за счёт жира или мышечной массы».

Иконка коннектора

Worker рекламирует PUBLIC_URL/icon.png в своих MCP serverInfo.iconswebsiteUrl), поэтому клиенты, отображающие брендинг сервера, показывают её в списке коннекторов. По умолчанию используется сгенерированная иконка весов (npm run icon). Чтобы использовать официальную иконку приложения Renpho Health, сохраните PNG из списка App Store / Play Store и встройте его:

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.ts — связывает OAuthProvider + Durable Object McpAgent.

  • src/auth-handler.ts — страница входа (/authorize), целевая страница, иконка.

  • src/renpho-api.ts — клиент Renpho: кэш сессий, зашифрованный транспорт с повтором/повторным входом, пагинатор, не зависящий от порядка, выбор пользователя.

  • src/measurements.ts — сырая запись → компактная форма для коучинга, перечисления, классификация, профиль.

  • src/stats.ts — регрессия, сводки по краевым окнам, скользящие средние, прогноз цели.

  • src/tools.ts — вышеупомянутые инструменты коучинга.

  • src/crypto.ts, src/json.ts, src/dates.ts — AES-хелперы, JSON с поддержкой больших целых чисел, даты с учётом часового пояса. Всё чистое и покрыто юнит-тестами.

Примечания и ограничения

  • Задержка привязки Wi-Fi весов. Некоторые Wi-Fi весы загружают измерение до того, как приложение привяжет его к вашему аккаунту; до этого у него есть scale_user_id, но нет bound_user_id. Инструменты используют первый профиль и сообщают об этом (selection: "fallback_scale_user"); run_diagnostics перечисляет скрытые измерения.

  • Биоимпеданс шумит. Гидратация, время суток и недавние тренировки сдвигают показания жира/воды на несколько пунктов. Взвешивайтесь в одно и то же время суток и смотрите на средние/тренды, а не на отдельные измерения — инструменты трендов используют 7-дневные краевые окна и скользящие средние именно по этой причине.

  • Единицы измерения. Массы в кг, композиционные метрики в %, как в приложении Renpho. muscle сообщается как мышечная масса (кг), а sinew — как процент скелетных мышц; если прошивка устройства сообщает иначе, сырые значения не меняются — отличается только подпись.

  • Весы MorphoScan / с 8 электродами. Их измерения хранятся в хранилище body-composition (см. выше) и содержат дополнительные поля, специфичные для устройства — сегментарный жир/мышцы, SMI и т.д. — которые инструменты передают в extra (запросите include_details или посмотрите unrecognised_fields_seen в run_diagnostics). Пожалуйста, откройте 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