Skip to main content
Glama
a1dancole

Renpho Health MCP

by a1dancole

Renpho Health MCP — datos de báscula inteligente para tu entrenador de Claude

Un servidor MCP remoto, desplegado en Cloudflare Workers, que expone los datos de composición corporal de tu báscula inteligente Renpho — peso, grasa corporal, masa libre de grasa, músculo, agua, hueso, grasa visceral, BMR, edad metabólica y más — a Claude a través de la API en la nube de Renpho Health. Añádelo una vez como conector personalizado y funciona en Claude web, de escritorio y móvil. Se combina con los conectores de Strava y Google Health para que tu entrenador vea la carga de entrenamiento, la recuperación y la composición corporal.

Fuente de datos: el backend de la aplicación Renpho Health (icono azul) en cloud.renpho.com. Las cuentas de la aplicación Renpho heredada (renpho.qnclouds.com) no son compatibles: migra las primero en la aplicación.

Construido sobre el protocolo de ingeniería inversa de StartupBros-com/renpho-mcp-server (un servidor stdio local) y forkerer/RenphoGarminSync-CLI, reestructurado como un Worker remoto multiusuario al estilo de google-health-mcp.

Herramientas

Tool

What it answers

get_latest_measurement

"¿Cómo voy?" — la lectura más reciente con todas las métricas, clasificaciones de categoría, cambios frente a hace 7/30/90 días y progreso hacia el objetivo de peso de la aplicación

get_measurements

Historial de lecturas en un rango: cada métrica por pesaje, o promediada por día/semana; subconjunto de métricas opcional y detalles de dispositivo/impedancia

get_body_composition_trend

Promedios iniciales/finales por métrica, cambio, mínimo/máximo/media y una tasa semanal de mínimos cuadrados (con r²) más una serie diaria/semanal: ¿el cambio de peso es grasa o masa magra?

get_weight_trend

Peso promedio diario con una media móvil de 7 días, tasa semanal ajustada y una proyección de cuándo se alcanzará el objetivo (y la tasa necesaria para alcanzar la fecha objetivo)

get_profile

Sexo, edad, altura, unidades, modo atleta y los objetivos establecidos en la aplicación (peso/fecha objetivo, grasa corporal objetivo, peso inicial)

get_scale_users

IDs de usuario de báscula (perfil), tablas de datos, miembros de la familia y cada categoría de dispositivo/datos que Renpho reporta

run_diagnostics

Sonda de extremo a extremo: sesión, tablas, orden de páginas, lecturas recientes por perfil, vinculado vs no vinculado, dispositivos vistos

query_endpoint

Vía de escape: llama a cualquier endpoint de cloud.renpho.com con el cifrado/autenticación de la aplicación aplicados

refresh_data

Elimina la sesión y las páginas en caché y vuelve a iniciar sesión (después de un nuevo pesaje que no se muestra)

delete_my_data

Elimina todo lo que está en caché para tu cuenta

Solución de problemas: si las lecturas parecen faltantes, desactualizadas o atribuidas a la persona equivocada, ejecuta run_diagnostics primero. Informa dónde viven realmente los datos (qué tabla/perfil, vinculado o no) en lugar de hacerte inferirlo a partir de un síntoma posterior.


Related MCP server: Oura Ring MCP Server

Mapeo de campos (API de Renpho Health)

Un registro sin procesar de RenphoHealth/scale/queryAllMeasureDataList tiene ~57 claves. Las herramientas renombran las métricas a snake_case con sufijo de unidad, decodifican los códigos de enumeración, eliminan el ruido del sobre y mantienen cualquier cosa no reconocida bajo extra para que no se pierda nada cuando Renpho añade campos (ver src/measurements.ts).

Clave de Renpho

Campo de herramienta

Unidad / significado

weight

weight_kg

kg (siempre kg, independientemente de la unidad de visualización de la aplicación)

bmi

bmi

bodyfat

body_fat_pct

%

fatFreeWeight

fat_free_mass_kg

kg

subfat

subcutaneous_fat_pct

%

visfat

visceral_fat_level

nivel 1–59 (≤9 saludable, 10–14 alto, ≥15 muy alto)

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/day

bodyage

metabolic_age

años

heartRate

heart_rate_bpm

bpm (solo básculas con sensor de frecuencia cardíaca)

cardiacIndex

cardiac_index

L/min/m²

waistline, hip

waistline_cm, hip_cm

cm (solo si se introducen)

bodyShape / bodytype

body_type

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

personType

athlete_mode

boolean

resistance, secResistance, actual*

impedance.*

impedancia bioeléctrica cruda (Ω)

method

source.method

cómo se asignó la lectura (bluetooth_online_measure, cloud_wifi_auto_allocation, manual_input, …)

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

source.*

dispositivo + indicadores

bUserId, subUserId

user.bound_user_id, user.scale_user_id

cuenta a la que está vinculada la lectura / perfil bajo el que se midió

timeStamp

timestamp, time, date

segundos unix; fecha local RFC-3339 y fecha de calendario en TIME_ZONE

Una métrica reportada como 0 significa "no medida" y se omite. Los IDs de Renpho son enteros de 64 bits más allá del rango seguro de JavaScript, por lo que el cliente los vuelve a citar como cadenas antes de analizarlos (src/json.ts).

Cómo se obtienen los datos

  • Inicio de sesión (renpho-aggregation/user/login) devuelve un token de portador con un expAt; se almacena en caché (sellado) en KV hasta poco antes de su caducidad y se renueva volviendo a iniciar sesión: Renpho no tiene tokens de refresco.

  • device/count enumera las tablas de datos de la cuenta y los recuentos de registros, y se obtiene de nuevo en cada llamada a una herramienta; es la señal de frescura.

  • Dos almacenes por tabla. Cada tabla measurements_info_N se lee de ambos scale/queryAllMeasureDataList (el almacén heredado, cuyas filas cuenta device/count) y scale/queryBodyCompositionMeasureData (el almacén más reciente usado por las básculas de 8 electrodos / multifrecuencia, como la MorphoScan, que device/count no cuenta). Las filas se fusionan por id, conservando la copia de composición corporal cuando existen ambas porque lleva el conjunto de campos más rico; source.endpoint indica de qué almacén procede cada lectura.

  • Páginas de mediciones (200 registros cada una) se almacenan en caché en KV. Las páginas heredadas se indexan por tabla, conjunto de perfiles y recuento de registros, de modo que un nuevo pesaje cambia la clave e invalida automáticamente; las páginas de composición corporal no tienen recuento y se almacenan en caché durante 15 minutos en su lugar. El paginador detecta en qué dirección está ordenado cada almacén y avanza solo hasta donde necesita la ventana solicitada (máx. 30 páginas / 6 000 registros por almacén y llamada).

  • Selección: por defecto se devuelven las lecturas vinculadas a la cuenta con sesión iniciada (bUserId); si aún no hay nada vinculado (las básculas Wi-Fi suben antes de que la app vincule la lectura), se recurre al primer perfil de usuario de báscula de la cuenta y así se indica. Pasa scale_user_id para un miembro de la familia.

Caché y cifrado

Todo lo que se escribe en el espacio de nombres KV RENPHO_CACHE —tokens de sesión y páginas de mediciones— está sellado con AES-256-GCM con una clave derivada del secreto SESSION_ENCRYPTION_KEY, con clave por usuario (SHA-256 del correo electrónico). Si el secreto no está definido, la caché simplemente se desactiva. Los fallos de caché nunca rompen una solicitud.

El transporte de Renpho en sí es AES-128-ECB con la clave estática incluida en la app; WebCrypto no tiene modo ECB, por lo que el Worker usa la librería aes-js en JS puro (src/crypto.ts, verificada byte a byte contra OpenSSL en las pruebas).


Cómo funciona el inicio de sesión (léelo una vez)

Renpho no tiene OAuth. El Worker es un servidor OAuth para Claude (workers-oauth-provider), y su página /authorize es un formulario de inicio de sesión de Renpho. Tu correo electrónico y contraseña se comprueban contra Renpho una vez y luego se almacenan dentro de las propiedades cifradas del grant — la clave de cifrado se deriva del token que tiene Claude, por lo que el contenido de KV por sí solo no puede descifrarse. Las credenciales son necesarias porque los tokens de sesión de Renpho caducan después de unas horas y la única forma de obtener uno nuevo es volver a iniciar sesión.

  • Desconectar el conector en Claude elimina el grant (y con él las credenciales almacenadas); delete_my_data limpia la caché.

  • Define ALLOWED_EMAILS (separados por comas) para impedir que la cuenta de Renpho de cualquier otra persona se conecte a tu despliegue. Si se deja vacío, cualquier usuario de Renpho puede usarlo (cada uno solo ve sus propios datos).

Despliegue

Opción A — GitHub Actions (sin wrangler local)

El flujo de trabajo en .github/workflows/deploy.yml despliega en cada push a master (y bajo demanda). El secreto de la app vive en Cloudflare, no en GitHub — GitHub solo guarda el token de API de Cloudflare y el id de cuenta.

  1. Crea dos espacios de nombres KV en el panel de Cloudflare (Storage & Databases → KV): OAUTH_KV y RENPHO_CACHE. Pega sus ids en wrangler.jsonc y haz commit.

  2. Crea un token de API de Cloudflare (My Profile → API Tokens → plantilla "Edit Cloudflare Workers") y anota tu ID de cuenta.

  3. Añade los secretos del repositorio de GitHub CLOUDFLARE_API_TOKEN y CLOUDFLARE_ACCOUNT_ID.

  4. Haz push a master. El registro de Actions imprime la URL del Worker (https://renpho-health-mcp.<subdomain>.workers.dev).

  5. Define el secreto de la app en Cloudflare (Workers & Pages → renpho-health-mcp → Settings → Variables and Secrets, tipo Secret): SESSION_ENCRYPTION_KEY = cualquier cadena aleatoria larga. Opcionalmente, define la variable ALLOWED_EMAILS con tu correo de Renpho.

Opción B — wrangler local

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

Conectar en Claude

  1. Ajustes → Conectores → Añadir conector personalizado.

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

  3. Haz clic en Conectar → inicia sesión con tu correo/contraseña de Renpho Health → listo.

Luego pregúntale a tu entrenador: "Obtén mi última lectura de la báscula y dime si la pérdida de peso del último mes vino de grasa o de masa magra."

Icono del conector

El Worker anuncia PUBLIC_URL/icon.png en su MCP serverInfo.icons (y websiteUrl), de modo que los clientes que renderizan la marca del servidor lo muestran en la lista de conectores. El predeterminado es un icono de báscula generado (npm run icon). Para usar el icono oficial de la app Renpho Health en su lugar, guarda el PNG de la ficha de App Store / Play Store e incrústalo:

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

(La marca oficial es una marca comercial de Renpho — está bien para un despliegue personal, no para redistribución, por eso no está en este repositorio.)

Desarrollo local

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

Prueba el flujo con el MCP Inspector:

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

Cómo funciona

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 — conecta OAuthProvider + el Durable Object McpAgent.

  • src/auth-handler.ts — página de inicio de sesión (/authorize), página de aterrizaje, icono.

  • src/renpho-api.ts — cliente de Renpho: caché de sesión, transporte cifrado con reintento/reinicio de sesión, paginador independiente del orden, selección de usuario.

  • src/measurements.ts — registro bruto → forma de coaching depurada, enums, clasificación, perfil.

  • src/stats.ts — regresión, resúmenes de ventanas de borde, medias móviles, proyección de objetivos.

  • src/tools.ts — las herramientas de coaching anteriores.

  • src/crypto.ts, src/json.ts, src/dates.ts — ayudantes AES, JSON seguro para enteros grandes, fechas correctas por zona horaria. Todo puro y con pruebas unitarias.

Notas y límites

  • Retraso de vinculación de la báscula Wi-Fi. Algunas básculas Wi-Fi suben una lectura antes de que la app la vincule a tu cuenta; hasta entonces tiene un scale_user_id pero no un bound_user_id. Las herramientas recurren al primer perfil y así lo indican (selection: "fallback_scale_user"); run_diagnostics enumera las lecturas ocultas.

  • La bioimpedancia es ruidosa. La hidratación, la hora del día y el entrenamiento reciente mueven las lecturas de grasa corporal/agua varios puntos. Pésate a la misma hora del día y lee las medias/tendencias, no lecturas individuales — las herramientas de tendencias usan ventanas de borde de 7 días y medias móviles precisamente por esta razón.

  • Unidades. Las masas están en kg y las métricas de composición en %, coincidiendo con la app de Renpho. muscle se informa como masa muscular (kg) y sinew como % de músculo esquelético; si el firmware de tu dispositivo informa de otra forma, los valores brutos no cambian — solo difiere la etiqueta.

  • Básculas MorphoScan / 8 electrodos. Sus lecturas viven en el almacén de composición corporal (ver arriba) y llevan campos adicionales específicos del dispositivo — grasa/músculo segmental, SMI, etc. — que las herramientas pasan bajo extra (pide include_details, o consulta unrecognised_fields_seen en run_diagnostics). Abre un issue con esos nombres de campo para que puedan mapearse correctamente.

  • Solo la categoría scale tiene herramientas dedicadas. Los datos de cinta métrica/perímetros, cinta de correr, cuerda y escaneo corporal (MorphoScan) aparecen en get_scale_usersdevice_categories y pueden explorarse con query_endpoint.

  • Límites de tasa. Renpho devuelve el código 429 cuando se le presiona; el cliente retrocede y reintenta, y las páginas en caché siguen sirviendo.

  • Los cambios de contraseña rompen las credenciales almacenadas — desconecta y vuelve a conectar el conector.

  • API no oficial. Esto usa la API privada de la app móvil; Renpho puede cambiarla en cualquier momento. No afiliado ni respaldado por Renpho.

Privacidad

  • Las credenciales se usan solo para autenticarse con Renpho y se almacenan cifradas dentro del grant de OAuth; no se registra nada.

  • Los datos de salud se almacenan en caché solo en tu propio espacio de nombres KV, sellados y eliminables con delete_my_data; no se envía nada a terceros.

Créditos

Licencia

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