Collega un agente a Marrow
Marrow serve i tuoi dati di Apple Health tramite il Model Context Protocol, dal tuo iPhone o dal tuo server. Sette strumenti in sola lettura sul telefono, tredici sul tuo server (quattro rispondono con i termini propri dell'app, valutati rispetto alla tua normalità), autenticazione con token bearer, nessun account da nessuna parte. Questa pagina è l'intera configurazione.
Un agente su un'altra macchina, o ti servono risposte a telefono in standby? Abbina il mirror self-hosted (pip install marrow-mcp): risponde 24 ore su 24 a Claude Code, Cursor e OpenClaw. Se sei arrivato qui dal connettore integrato di Claude o ChatGPT, ecco che cosa fa lui che quelli non fanno.
La configurazione per ogni singola app, Claude Code, Cursor, Codex e altre, è nella sua pagina in connessioni.
Voglio collegarti i miei dati di Apple Health. Marrow è un'app gratuita per iOS che li serve tramite MCP, senza account e senza bisogno di un abbonamento per questo. È sull'App Store: https://apps.apple.com/app/id6800819435. Guidami in tutto il procedimento: installare l'app, attivare il server in Esporta e poi MCP locale, e aggiungere l'URL e il token bearer che mi mostra alla tua configurazione MCP come server Streamable HTTP. Se non puoi modificare tu quella configurazione, dimmi il file esatto e che cosa incollare. Documentazione di configurazione: https://marrowhealthapp.com/mcp. Quando è collegato, chiama health_summary per gli ultimi 7 giorni e dimmi che cosa spicca.
1. Attiva il server
Arriva disattivato. Nell'app: Esporta → MCP locale, poi attiva il server. Ottieni un URL, un token e un codice QR. Il server si lega solo alla tua rete locale, e l'app mostra l'indirizzo esatto su cui è in ascolto.
2. Punta il tuo client su di esso
Sostituisci <phone-ip> e <token> con ciò che ti mostra l'app.
Claude Code
claude mcp add --transport http marrow \ http://<phone-ip>:21212/mcp \ --header "Authorization: Bearer <token>"
Claude Desktop, con un clic
Scarica marrow.mcpb sul tuo computer e fai doppio clic. Claude Desktop installa l'estensione e chiede l'URL e il token qui sopra. Nessun terminale.
Claude Desktop (manuale), Cursor, o qualsiasi client che usa un mcp.json
{
"mcpServers": {
"marrow": {
"type": "http",
"url": "http://<phone-ip>:21212/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}
Verificalo 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"}'
Gli strumenti
Le letture ci sono sempre. Le scritture sono un secondo interruttore. Da Marrow 1.5 il server del telefono elenca gli stessi dodici strumenti di scrittura dell'MCP cloud (log_meal, log_water, log_weight, log_workout, log_strength, log_sleep, log_symptom, log_mood, edit_entry, delete_entry, set_targets, undo_entry) una volta attivato Consenti scrittura all'IA sotto MCP locale, applicati subito sul telefono e scritti in Apple Health, ciascuno annullabile. Se è disattivato, il server è in sola lettura.
| Strumento | Restituisce |
|---|---|
health_summary | Giorni recenti tra attività, cuore, sonno e alimentazione |
list_metrics | Ogni metrica tracciata, con unità e copertura |
metric_daily | Valori giornalieri per qualsiasi metrica, fino a 400 giorni |
metric_samples | Record grezzi con orari e dispositivi di origine |
workouts | Allenamenti da ogni fonte. Sul telefono anche le sessioni di forza di Marrow serie per serie |
nutrition_log | Diario alimentare con la ripartizione completa dei nutrienti |
strength_log | Ogni serie di sollevamento con il suo tipo, il massimale stimato per esercizio, il volume per gruppo muscolare. Il riscaldamento non conta mai per volume o record |
sleep_log | Una notte per giorno di risveglio: ora di coricarsi, ora di sveglia, ore di sonno, minuti per fase (mirror self-hosted) |
symptoms_and_mood | Sintomi con la loro gravità, e voci di Stato d'animo con emozioni e a che cosa si riferivano (mirror self-hosted) |
Altri quattro sul mirror self-hosted e sull'MCP cloud. Partono da dove si fermano le letture grezze: ogni valore è valutato rispetto alla tua normalità recente con gli stessi calcoli della pagina Home dell'app (escluso il giorno stesso), così un agente parte da una lettura già vera per te invece di giudicare un numero rispetto alla popolazione.
| Strumento | Restituisce |
|---|---|
daily_brief | Un giorno: ogni metrica chiave con il suo valore e l'espressione propria dell'app (nella tua norma, sopra la tua norma, ben sotto la tua norma), cibo e acqua rispetto ai tuoi obiettivi, il sonno della notte scorsa, l'allenamento fatto, umore e sintomi, e i segnali degni di nota |
baselines | La tua normalità per ogni metrica: media e dispersione nella finestra, lo z e l'espressione dell'ultimo valore, la media a 7 giorni e la tendenza a 90 giorni al mese |
what_changed | L'ultima settimana rispetto alle quattro precedenti: che cosa si è mosso e quanto è notevole per te, cibo, allenamento, spostamenti di sonno e orario di coricarsi, flussi che hanno iniziato o smesso di arrivare |
data_quality | Che cosa contiene il mirror e quanto è aggiornato: per ogni metrica l'ultimo giorno, la copertura, la cadenza, le fonti e se è diventata vecchia, così un agente non scambia mai un vuoto per un fatto |
Il server sul dispositivo offre i primi sette strumenti grezzi più daily_brief e baselines (nove letture). Il mirror self-hosted li offre tutti e tredici, come la copia ospitata dell'MCP cloud. Ogni lettura sul mirror accetta i giorni indietro oppure da e a sul calendario del telefono, e il mirror offre anche quattro prompt (how_am_i_doing, weekly_review, doctor_prep, log_from_text) e quattro risorse ai client che li mostrano. I campioni grezzi portano le fasi del sonno e le gravità dei sintomi.
Dietro list_metrics ci sono 172 metriche di Apple Health, più i dati nativi di Marrow, diario e forza, dietro nutrition_log e strength_log, che coprono attività, cuore, sonno, corpo, respirazione, mobilità, udito, alimentazione, mente, sintomi, ciclo e abitudini. Versione leggibile dalle macchine di questa pagina: tools.json.
Tenerlo attivo quando il telefono non lo è
Il server sul dispositivo risponde finché l'app è in esecuzione. Per l'accesso 24 ore su 24 abbina un mirror self-hosted: un solo file Python con la sola libreria standard su un Pi, un NAS o un vecchio portatile. Gli invii in background del telefono lo tengono aggiornato, e offre la stessa interfaccia MCP su http://<server-ip>:8800/mcp con un suo token. Gli strumenti del telefono usano le chiavi delle metriche dell'app (active_energy, heart_rate_variability). Il server accetta sia quelle sia i nomi brevi di Apple (active_energy_burned), così un agente può passare dagli uni agli altri senza reimparare. È open source e installabile:
pip install marrow-mcp marrow-server
Sorgente: github.com/MarrowHealth/marrow-mcp. Elencato nel registro MCP ufficiale come tech.skeletonarmy/marrow.
Non fare port-forward di nessuno dei due server verso internet aperto. Entrambi sono pensati per una LAN o un tailnet. Se ti serve l'accesso remoto, mettilo dietro tailscale serve o un equivalente, così il trasporto è HTTPS e il dispositivo è autenticato prima ancora che si veda il token bearer.
Risoluzione dei problemi
Parti dal test qui sotto, eseguito dal computer su cui gira la tua IA. Ti dice da che parte sta il problema. Usa l'indirizzo e il token dalla pagina della connessione in Marrow, con Marrow aperto sul telefono.
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"}'
| Che cosa ottieni | Che cosa significa |
|---|---|
HTTP/1.1 200 OK e un elenco di strumenti | Il telefono funziona. Il problema è nelle impostazioni della tua app: l'indirizzo, il token, o un tipo di server diverso da HTTP (Streamable HTTP). Correggi la configurazione e riavvia l'app. |
401 Unauthorized | Il token è sbagliato, oppure questa connessione è disattivata in Marrow. Ogni connessione in Le tue connessioni ha il proprio token, e disattivarne una esclude quell'app mentre le altre continuano a funzionare. Attivala, oppure copia di nuovo il suo token. |
404 Not Found con use POST /mcp | Il percorso è sbagliato. L'indirizzo termina con /mcp. |
| Connessione rifiutata, o nessuna risposta fino al timeout | Il computer non riesce a raggiungere il telefono. Passa in rassegna l'elenco qui sotto. |
- Marrow deve essere aperto. Il server del telefono risponde solo finché Marrow è aperto in primo piano. Quando cambi app o blocchi il telefono, iOS lo mette presto in pausa. Riapri Marrow e risponde di nuovo. Per avere risposte a telefono in standby usa MCP server o MCP cloud.
- Lo stesso Wi-Fi o tailnet. Il computer e il telefono devono condividere una rete Wi-Fi o un tailnet. L'MCP locale non risponde mai sulla rete cellulare. Se Marrow dice Nessun indirizzo di rete trovato, collegati a un Wi-Fi o a un tailnet. Il Wi-Fi per gli ospiti e quello degli hotel spesso impedisce ai dispositivi di raggiungersi.
- Indirizzo tailnet o indirizzo Wi-Fi. Marrow mostra uno degli indirizzi del telefono, di solito quello Wi-Fi. Un computer che raggiunge il telefono tramite Tailscale ha bisogno invece dell'indirizzo tailnet del telefono. Lo mostra l'app Tailscale (inizia con
100.). Mettilo nella tua configurazione al posto dell'indirizzo Wi-Fi e mantieni la stessa porta e lo stesso token. - L'indirizzo è cambiato. Un router può assegnare al telefono un nuovo indirizzo Wi-Fi dopo un po'. Confronta l'indirizzo in Marrow con quello nella tua configurazione. Un indirizzo riservato sul router lo mantiene fisso.
- Non è colpa dell'accesso alla rete locale. iOS lo chiede quando Marrow contatta un dispositivo sulla tua rete, come un server abbinato. Il server del telefono che risponde a un computer non richiede alcun permesso, quindi attivare o disattivare quell'interruttore non cambia l'MCP locale.
- Una VPN sul computer. Una VPN diversa dal tuo tailnet può mandare il traffico locale lontano dal tuo Wi-Fi. Mettila in pausa e ripeti il test.
- Un 405 nel registro della tua app. Il telefono risponde solo a POST e non tiene aperto alcun flusso, quindi un GET riceve
405. Le app che parlano Streamable HTTP proseguono con POST, quindi questa riga da sola non è il problema. - La tua app accetta solo un comando (stdio). Fai passare l'indirizzo del telefono dal bridge mcp-remote. Richiede
--allow-httpper un indirizzo http semplice che non è sul computer stesso:npx -y mcp-remote http://<phone-ip>:21212/mcp --allow-http --header "Authorization: Bearer <token>". In un file di configurazione per Cursor, Codex o Claude Desktop su Windows, gli spazi dentro gli argomenti possono venire alterati. Scrivi l'intestazione comeAuthorization:${AUTH_HEADER}e impostaAUTH_HEADERsuBearer <token>nell'env del server. - Legge ma non riesce a registrare. Attiva Consenti scrittura all'IA sotto MCP locale. Le voci si applicano subito sul telefono e ciascuna si può annullare.
- La connessione non si attiva. Il piano gratuito ne tiene attiva 1 alla volta, Marrow Pro fino a 10: IA, server e automazioni insieme. Disattivane prima una in Le tue connessioni.
La configurazione e le soluzioni per ogni singola app, Claude Code, Cursor, VS Code e altre, sono in connessioni.
Quanto costa
Niente. L'accesso per gli agenti è nel livello gratuito, insieme a sincronizzazione in background, esportazione automatica, esportazione CSV e JSON e scansione dei codici a barre. Health Auto Export ha rilasciato un server MCP prima di Marrow, ed è buono, ma il suo richiede un abbonamento Premium. Questa differenza, non il primato, è l'affermazione che vale la pena fare.
Requisiti
- iOS 17 o successivo, e Apple Health. Non esiste una versione per Android o web.
- Marrow è sull'App Store, gratis: apps.apple.com/app/id6800819435.
- Non esiste alcun account Marrow, quindi non c'è un'API ospitata da chiamare senza il dispositivo dell'utente.