Mibly – Apple Health MCP
Servidor MCP de Apple Health de código abierto. Lleva tus datos de sueño, frecuencia cardíaca, HRV y entrenamientos desde el iPhone a Claude, Codex o cualquier agente MCP. Modo local, cifrado, sin nube.
Documentación
Apple Health MCP — Mibly Receiver
Un servidor Apple Health MCP de código abierto: lleva tus datos de Apple Health (HealthKit) — sueño, pasos, frecuencia cardíaca, HRV, entrenamientos, peso, grasa corporal y más — a Claude Desktop/Code, Codex, o cualquier otro agente de IA que construyas o ejecutes tú mismo (cualquier cosa que hable MCP).
Modo local: tus datos nunca tocan los servidores de Mibly. Sin cuenta, sin nube, sin telemetría. Se almacenan cifrados en una máquina que tú controlas, y este repositorio es el código que lo hace.
La forma más rápida de empezar
- Descarga Mibly en tu iPhone → App Store
- Copia el prompt de configuración desde dentro de la app de Mibly (Connection Settings → "Copy for your Agent") y pégalo en tu agente.
Tu agente configura el receptor y el servicio MCP por ti. Sin clonar, sin compilar, sin archivos de configuración.
¿Por qué una app de iPhone?
Los datos de Apple Health solo se pueden leer a través de HealthKit, dentro de una app nativa de iOS. No existe una API web. Mibly maneja el lado de HealthKit — permisos, sincronización en segundo plano y formato de datos — para que no necesites una cuenta de desarrollador de Apple ni Xcode.
Qué es este repositorio
Una implementación de referencia del receptor que tu agente instala. Está aquí para que puedas:
- Revisar exactamente qué se ejecuta en tu máquina y a dónde van tus datos
- Personalizarlo si quieres
No necesitas este código para usar Mibly. El prompt de configuración anterior es la vía recomendada.
¿A dónde van los datos?
| Pregunta | Respuesta |
|---|---|
| ¿Dónde se almacenan los datos de salud? | Solo en ~/.mibly/data.enc. AES-256-GCM, clave = scrypt(pairing token, sal aleatoria). |
| ¿El servicio hace solicitudes de red salientes? | No. Solo escucha. Sin telemetría, sin comprobación de actualizaciones. |
| ¿Quién puede leerlos a través de la red? | Cualquiera que tenga el pairing token. Cada ruta requiere Authorization: Bearer <token>. |
| ¿Cuánto tiempo se conservan? | 365 días de historial. Solo la muestra más reciente por tipo se conserva más tiempo. |
| ¿El tráfico está cifrado en tránsito? | No. El modo local está diseñado para tu LAN doméstica u oficina: el iPhone y este receptor están en el mismo Wi-Fi y hablan HTTP plano. No expongas el puerto a internet público. |
Compruébalo tú mismo. Esto debería imprimir nada:
grep -rnE "fetch\(|https?\.request|axios|net\.connect|XMLHttpRequest" src
El protocolo de cable (endpoints, cargas útiles, formato de almacenamiento) está en PROTOCOL.md; el modelo de amenazas está en SECURITY.md.
Ejecútalo tú mismo
Requiere Node.js 18+.
npm ci
npm run build
MIBLY_TOKEN=<token from the Mibly app> npm start
En la primera ejecución, el token se guarda en ~/.mibly/config.json (modo 0600), por lo que los reinicios posteriores no necesitan variable de entorno. Al iniciar, el receptor imprime las direcciones a usar, p. ej. Target Host to enter in Mibly: 192.168.1.24:7345 (en0). Introdúcelo en el campo Target Host de la app (solo IP:port, sin http://, sin ruta); elige la dirección en tu Wi-Fi/LAN si aparecen varias.
| Variable | Significado | Predeterminado |
|---|---|---|
MIBLY_TOKEN | Pairing token de la app | configuración guardada |
MIBLY_HOST | Dirección de enlace host:port | 0.0.0.0:7345 |
Conecta un cliente MCP por HTTP a http://<ip>:7345/mcp con el encabezado Authorization: Bearer <token>. Para agentes que generan servidores MCP por stdio, añade --stdio (los registros van a stderr).
Si regeneras el token en la app, reinicia con el nuevo MIBLY_TOKEN. El almacén cifrado antiguo no se puede descifrar con la nueva clave, por lo que el receptor comienza vacío.
Mapa del código: src/index.ts (rutas) · src/auth.ts (verificación de token) · src/config.ts (~/.mibly/config.json) · src/ingest.ts (validación) · src/store.ts (cifrado, retención, consultas) · src/mcp.ts (las dos herramientas). Ejecuta las pruebas con npm test.
Iniciar automáticamente al arrancar
El receptor debería seguir ejecutándose después de un reinicio. Reemplaza las rutas (y, en Linux, el usuario) por las tuyas; el token ya está guardado en ~/.mibly/config.json, por lo que no se necesita variable de entorno.
macOS (launchd) — ~/Library/LaunchAgents/com.mibly.receiver.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.mibly.receiver</string>
<key>ProgramArguments</key><array>
<string>/usr/local/bin/node</string>
<string>/Users/you/mibly-apple-health-mcp/dist/index.js</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict></plist>
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.mibly.receiver.plist
Linux (systemd) — /etc/systemd/system/mibly-receiver.service:
[Unit]
Description=Mibly receiver
After=network-online.target
Wants=network-online.target
[Service]
User=you
ExecStart=/usr/bin/node /home/you/mibly-apple-health-mcp/dist/index.js
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable --now mibly-receiver
Reinicia la máquina y luego confirma que el receptor está de vuelta (usa la IP que imprimió el receptor):
curl -H "Authorization: Bearer <token>" http://<ip>:7345/status
Una respuesta JSON con version y lastPushAt significa que está en ejecución.
Actualizar desde una versión anterior
Actualiza en el lugar; no configures un segundo receptor.
- Trae el código nuevo, luego
npm ci && npm run build, y reinicia el servicio. - Conserva tu token y tus datos. No elimines
~/.miblyni cambies el token. Un token nuevo inicia un almacén vacío. - Los registros heredados de
heartRate(lecturas individuales sinheartRateSummary) se eliminan al iniciar, porqueheartRateahora es un resumen por hora. Todo lo demás se conserva. - Comprueba
GET /status: debería mostrar el nuevoversionycapabilities.
Las funciones más nuevas de la app de Mibly necesitan la versión correspondiente del receptor; las apps más antiguas siguen funcionando con un receptor más nuevo.
Local vs Nube
| Local (Gratis) | Nube (Pro) | |
|---|---|---|
| Ruta de datos | iPhone → un entorno de agente que tú controlas | iPhone → Mibly Cloud → tus agentes |
| Acceso remoto entre dispositivos | — | ✓ |
| Múltiples agentes sobre los mismos datos | — | ✓ |
| Datos del ciclo menstrual | Disponibles (desactivados por defecto) | Nunca se suben |
Este repositorio cubre solo Local. Tú eliges qué tipos de datos se comparten y puedes desactivar cada uno en cualquier momento.
Notas
- Mibly no diagnostica ni toma decisiones médicas. Solo da a tu agente acceso a los datos que elijas compartir.
- Los problemas en este repositorio son para el código del receptor. Para soporte de la app, consulta mibly.app.
- Política de privacidad: https://mibly.app/privacy/
Licencia
MIT