Conecta un agente a Marrow
Marrow sirve tus datos de Apple Health por el Model Context Protocol, desde tu propio iPhone o tu propio servidor. Siete herramientas de solo lectura en el teléfono, trece en tu propio servidor (cuatro de ellas responden en los términos de la propia app, puntuadas frente a tu propia normalidad), autenticación con token bearer, sin cuenta en ningún sitio. Esta página es toda la configuración.
¿Un agente en otra máquina, o necesitas respuestas mientras el teléfono duerme? Vincula el espejo autoalojado (pip install marrow-mcp): responde 24/7 a Claude Code, Cursor y OpenClaw. Si llegaste aquí desde el conector integrado de Claude o ChatGPT, esto es lo que hace Marrow y ellos no.
La configuración para cada app, Claude Code, Cursor, Codex y más, está en su propia página en conexiones.
Quiero conectar mis propios datos de Apple Health contigo. Marrow es una app gratuita de iOS que los sirve por MCP, sin cuenta y sin necesitar una suscripción para esto. Está en la App Store: https://apps.apple.com/app/id6800819435. Guíame en todo el proceso: instalar la app, activar el servidor en Exportar y luego MCP local, y añadir la URL y el token bearer que me muestra a tu configuración MCP como un servidor Streamable HTTP. Si no puedes editar esa configuración tú mismo, dime el archivo exacto y qué pegar. Documentación de la configuración: https://marrowhealthapp.com/mcp. Cuando esté conectado, llama a health_summary para los últimos 7 días y dime qué destaca.
1. Activa el servidor
Viene desactivado. En la app: Exportar → MCP local, y luego activa el servidor. Obtienes una URL, un token y un código QR. El servidor se enlaza solo a tu red local, y la app muestra la dirección exacta en la que escucha.
2. Apunta tu cliente hacia él
Sustituye <phone-ip> y <token> por lo que te muestra la app.
Claude Code
claude mcp add --transport http marrow \ http://<phone-ip>:21212/mcp \ --header "Authorization: Bearer <token>"
Claude Desktop, con un clic
Descarga marrow.mcpb en tu ordenador y haz doble clic en él. Claude Desktop instala la extensión y pide la URL y el token de arriba. Sin terminal.
Claude Desktop (manual), Cursor o cualquier cliente que use un mcp.json
{
"mcpServers": {
"marrow": {
"type": "http",
"url": "http://<phone-ip>:21212/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}
Compruébalo a mano
curl -s http://<phone-ip>:21212/mcp \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Las herramientas
Las lecturas siempre están. Las escrituras son un segundo interruptor. Desde Marrow 1.5 el servidor del teléfono lista las mismas doce herramientas de escritura que MCP en la nube (log_meal, log_water, log_weight, log_workout, log_strength, log_sleep, log_symptom, log_mood, edit_entry, delete_entry, set_targets, undo_entry) cuando activas Permitir escritura a la IA en MCP local, aplicadas al instante en el teléfono y escritas en Apple Health, y todas se pueden deshacer. Desactivado, el servidor es de solo lectura.
| Herramienta | Devuelve |
|---|---|
health_summary | Días recientes de actividad, corazón, sueño y nutrición |
list_metrics | Cada métrica seguida, con unidades y cobertura |
metric_daily | Valores diarios de cualquier métrica, hasta 400 días |
metric_samples | Registros sin procesar con marcas de tiempo y dispositivos de origen |
workouts | Entrenamientos de todas las fuentes. En el teléfono, también las sesiones de fuerza de Marrow serie a serie |
nutrition_log | Diario de comidas con el desglose completo de nutrientes |
strength_log | Cada serie de levantamiento con su tipo, 1RM estimado por ejercicio y volumen por grupo muscular. Los calentamientos nunca cuentan para el volumen ni los récords |
sleep_log | Una noche por día de despertar: hora de acostarse, hora de despertar, horas dormidas, minutos por fase (espejo autoalojado) |
symptoms_and_mood | Síntomas con su gravedad, y entradas de Estado de ánimo con emociones y sobre qué eran (espejo autoalojado) |
Cuatro más en el espejo autoalojado y en MCP en la nube. Empiezan donde terminan las lecturas sin procesar: cada valor se puntúa frente a tu propia normalidad reciente con las mismas cuentas que usa la pantalla de Inicio de la app (excluido el propio día), de modo que un agente parte de una lectura que ya es cierta para ti en lugar de juzgar un número frente a la población.
| Herramienta | Devuelve |
|---|---|
daily_brief | Un día: cada métrica clave con su valor y la frase propia de la app (normal para ti, por encima de tu normal, muy por debajo de tu normal), comida y agua frente a tus objetivos, el sueño de anoche, el entrenamiento hecho, estado de ánimo y síntomas, y avisos que vale la pena mencionar |
baselines | Tu propia normalidad por métrica: media y dispersión en la ventana, la z y la frase del último valor, la media de 7 días y la tendencia de 90 días por mes |
what_changed | La última semana frente a las cuatro anteriores: qué se movió y cuán notable es para ti, comida, entrenamiento, cambios de sueño y de hora de acostarse, flujos que empezaron o dejaron de llegar |
data_quality | Qué guarda el espejo y cuán reciente es: por métrica el último día, cobertura, cadencia, fuentes y si se ha quedado obsoleta, para que un agente nunca confunda un hueco con un hecho |
El servidor en el dispositivo sirve las primeras siete herramientas sin procesar más daily_brief y baselines (nueve lecturas). El espejo autoalojado sirve las trece, igual que la copia alojada de MCP en la nube. Cada lectura del espejo acepta días hacia atrás o from y to en el calendario del teléfono, y el espejo también ofrece cuatro prompts (how_am_i_doing, weekly_review, doctor_prep, log_from_text) y cuatro recursos a los clientes que los muestran. Las muestras sin procesar llevan fases del sueño y gravedades de síntomas.
Hay 172 métricas de Apple Health detrás de list_metrics, más datos de diario y de fuerza propios de Marrow detrás de nutrition_log y strength_log, que cubren actividad, corazón, sueño, cuerpo, respiración, movilidad, audición, nutrición, mente, síntomas, ciclo y hábitos. Versión legible por máquina de esta página: tools.json.
Mantenerlo activo cuando el teléfono no lo está
El servidor en el dispositivo responde mientras la app se está ejecutando. Para acceso 24/7, vincula un espejo autoalojado: un archivo de la biblioteca estándar de Python en una Pi, un NAS o un portátil viejo. Los envíos en segundo plano del teléfono lo mantienen al día, y habla la misma superficie MCP en http://<server-ip>:8800/mcp con su propio token. Las herramientas del teléfono usan las claves de métrica de la app (active_energy, heart_rate_variability). El servidor acepta tanto esas como los nombres cortos de Apple (active_energy_burned), de modo que un agente puede pasar de unas a otras sin volver a aprender. Es de código abierto y se puede instalar:
pip install marrow-mcp marrow-server
Código fuente: github.com/MarrowHealth/marrow-mcp. Incluido en el registro oficial de MCP como tech.skeletonarmy/marrow.
No abras puertos de ninguno de los dos servidores a internet. Ambos están pensados para una LAN o una tailnet. Si necesitas acceso remoto, pon delante tailscale serve o algo equivalente, de modo que el transporte sea HTTPS y el dispositivo se autentique antes de que se vea el token bearer.
Solución de problemas
Empieza con la prueba de abajo, ejecutada desde el ordenador en el que se ejecuta tu IA. Te dice de qué lado está el problema. Usa la dirección y el token de la página de la conexión en Marrow, con Marrow abierta en el teléfono.
curl -i http://<phone-ip>:21212/mcp \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
| Lo que obtienes | Qué significa |
|---|---|
HTTP/1.1 200 OK y una lista de herramientas | El teléfono funciona. El problema está en los ajustes de tu app: la dirección, el token o un tipo de servidor distinto de HTTP (Streamable HTTP). Corrige la configuración y reinicia la app. |
401 Unauthorized | El token es incorrecto, o esta conexión está desactivada en Marrow. Cada conexión de Tus conexiones tiene su propio token, y desactivar una deja fuera a esa app mientras las demás siguen funcionando. Actívala, o vuelve a copiar su token. |
404 Not Found con use POST /mcp | La ruta es incorrecta. La dirección termina en /mcp. |
| Conexión rechazada, o sin respuesta hasta que se agota el tiempo | El ordenador no puede llegar al teléfono. Repasa la lista de abajo. |
- Marrow debe estar abierta. El servidor del teléfono solo responde mientras Marrow está abierta en primer plano. Cuando cambias de app o bloqueas el teléfono, iOS lo pausa enseguida. Abre Marrow otra vez y vuelve a responder. Para respuestas con el teléfono dormido, usa Servidor MCP o MCP en la nube.
- La misma Wi-Fi o tailnet. El ordenador y el teléfono deben compartir una red Wi-Fi o una tailnet. MCP local nunca responde por datos móviles. Si Marrow dice No se encontró ninguna dirección de red, conéctate a una Wi-Fi o a una tailnet. La Wi-Fi de invitados y de hoteles suele impedir que los dispositivos se vean entre sí.
- Dirección de tailnet o de Wi-Fi. Marrow muestra una de las direcciones del teléfono, normalmente la de Wi-Fi. Un ordenador que llega al teléfono por Tailscale necesita en cambio la dirección de tailnet del teléfono. La app de Tailscale la muestra (empieza por
100.). Ponla en tu configuración en lugar de la dirección de Wi-Fi y conserva el mismo puerto y token. - La dirección cambió. Un router puede asignar al teléfono una dirección Wi-Fi nueva pasado un tiempo. Compara la dirección de Marrow con la de tu configuración. Una dirección reservada en el router la mantiene fija.
- El acceso a la red local no es la causa. iOS lo pide cuando Marrow se comunica con un dispositivo de tu red, como un servidor vinculado. Que el servidor del teléfono responda a un ordenador no necesita permiso, así que activar o desactivar ese interruptor no cambia MCP local.
- Una VPN en el ordenador. Una VPN distinta de tu tailnet puede desviar el tráfico local fuera de tu Wi-Fi. Páusala y repite la prueba.
- Un 405 en el registro de tu app. El teléfono responde solo a POST y no mantiene ningún flujo abierto, así que un GET recibe
405. Las apps que hablan Streamable HTTP continúan con POST, así que esta línea por sí sola no es el problema. - Tu app solo acepta un comando (stdio). Pasa la dirección del teléfono por el puente mcp-remote. Necesita
--allow-httppara una dirección http simple que no esté en el propio ordenador:npx -y mcp-remote http://<phone-ip>:21212/mcp --allow-http --header "Authorization: Bearer <token>". En un archivo de configuración de Cursor, Codex o Claude Desktop en Windows, los espacios dentro de args pueden estropearse. Escribe el encabezado comoAuthorization:${AUTH_HEADER}y defineAUTH_HEADERcomoBearer <token>en el env del servidor. - Lee pero no puede registrar. Activa Permitir escritura a la IA en MCP local. Las entradas se aplican al instante en el teléfono y cada una se puede deshacer.
- La conexión no se activa. El plan gratuito mantiene 1 conexión activa a la vez, Marrow Pro hasta 10: IA, servidores y automatizaciones juntos. Desactiva primero una en Tus conexiones.
La configuración y las soluciones para cada app, Claude Code, Cursor, VS Code y más, están en conexiones.
Lo que cuesta
Nada. El acceso de agentes está en el nivel gratuito, junto con la sincronización en segundo plano, la exportación automática, la exportación a CSV y JSON y el escaneo de códigos de barras. Health Auto Export lanzó un servidor MCP antes que Marrow, y es bueno, pero el suyo requiere una suscripción Premium. Esa diferencia, y no haber llegado primero, es la afirmación que vale la pena hacer.
Requisitos
- iOS 17 o posterior y Apple Health. No hay versión para Android ni web.
- Marrow está en App Store, gratis: apps.apple.com/app/id6800819435.
- No existe ninguna cuenta de Marrow, así que no hay una API alojada a la que llamar sin el dispositivo del propio usuario.