Renpho Health MCP
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 |
| "¿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 |
| 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 |
| 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? |
| 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) |
| Sexo, edad, altura, unidades, modo atleta y los objetivos establecidos en la aplicación (peso/fecha objetivo, grasa corporal objetivo, peso inicial) |
| IDs de usuario de báscula (perfil), tablas de datos, miembros de la familia y cada categoría de dispositivo/datos que Renpho reporta |
| Sonda de extremo a extremo: sesión, tablas, orden de páginas, lecturas recientes por perfil, vinculado vs no vinculado, dispositivos vistos |
| Vía de escape: llama a cualquier endpoint de |
| 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) |
| 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_diagnosticsprimero. 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 |
|
| kg (siempre kg, independientemente de la unidad de visualización de la aplicación) |
|
| — |
|
| % |
|
| kg |
|
| % |
|
| nivel 1–59 (≤9 saludable, 10–14 alto, ≥15 muy alto) |
|
| % |
|
| % |
|
| kg |
|
| kg |
|
| % |
|
| kcal/day |
|
| años |
|
| bpm (solo básculas con sensor de frecuencia cardíaca) |
|
| L/min/m² |
|
| cm (solo si se introducen) |
|
|
|
|
| boolean |
|
| impedancia bioeléctrica cruda (Ω) |
|
| cómo se asignó la lectura ( |
|
| dispositivo + indicadores |
|
| cuenta a la que está vinculada la lectura / perfil bajo el que se midió |
|
| segundos unix; fecha local RFC-3339 y fecha de calendario en |
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 unexpAt; 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/countenumera 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_Nse lee de ambosscale/queryAllMeasureDataList(el almacén heredado, cuyas filas cuentadevice/count) yscale/queryBodyCompositionMeasureData(el almacén más reciente usado por las básculas de 8 electrodos / multifrecuencia, como la MorphoScan, quedevice/countno 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.endpointindica 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. Pasascale_user_idpara 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_datalimpia 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.
Crea dos espacios de nombres KV en el panel de Cloudflare (Storage & Databases → KV):
OAUTH_KVyRENPHO_CACHE. Pega sus ids enwrangler.jsoncy haz commit.Crea un token de API de Cloudflare (My Profile → API Tokens → plantilla "Edit Cloudflare Workers") y anota tu ID de cuenta.
Añade los secretos del repositorio de GitHub
CLOUDFLARE_API_TOKENyCLOUDFLARE_ACCOUNT_ID.Haz push a
master. El registro de Actions imprime la URL del Worker (https://renpho-health-mcp.<subdomain>.workers.dev).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 variableALLOWED_EMAILScon 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 deployConectar en Claude
Ajustes → Conectores → Añadir conector personalizado.
URL:
https://renpho-health-mcp.<subdomain>.workers.dev/mcpHaz 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.tsPrueba el flujo con el MCP Inspector:
npx @modelcontextprotocol/inspector@latest
# Transport: Streamable HTTP → http://localhost:8787/mcp → ConnectCó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.comsrc/index.ts— conectaOAuthProvider+ el Durable ObjectMcpAgent.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_idpero no unbound_user_id. Las herramientas recurren al primer perfil y así lo indican (selection: "fallback_scale_user");run_diagnosticsenumera 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.
musclese informa como masa muscular (kg) ysinewcomo % 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(pideinclude_details, o consultaunrecognised_fields_seenenrun_diagnostics). Abre un issue con esos nombres de campo para que puedan mapearse correctamente.Solo la categoría
scaletiene herramientas dedicadas. Los datos de cinta métrica/perímetros, cinta de correr, cuerda y escaneo corporal (MorphoScan) aparecen enget_scale_users→device_categoriesy pueden explorarse conquery_endpoint.Límites de tasa. Renpho devuelve el código
429cuando 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
Ingeniería inversa de la API: forkerer/RenphoGarminSync-CLI y StartupBros-com/renpho-mcp-server (MIT).
Licencia
MIT
This server cannot be installed
Maintenance
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
- AlicenseCqualityCmaintenanceProvides access to body composition data from Renpho smart scales, enabling users to query weight, BMI, body fat percentage, muscle mass, and other health metrics with trend analysis over customizable time periods.3264MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to access and query Oura Ring health data including sleep, activity, readiness, heart rate, and more via the Oura API.MIT
- FlicenseAqualityDmaintenanceFetches body composition data (weight, body fat percentage) from the Tanita Health Planet API and exposes it as MCP tools for AI agents like Claude Desktop.51
- FlicenseAqualityCmaintenanceEnables Claude to read your WHOOP health data including recovery, sleep, strain, and workouts through the official WHOOP API, so you can ask natural language questions about your fitness metrics.7
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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