Verbind een agent met Marrow
Marrow biedt je Apple Health-gegevens aan via het Model Context Protocol, vanaf je eigen iPhone of je eigen server. Zeven tools om te lezen op de telefoon, dertien op je eigen server (vier ervan antwoorden in de eigen termen van de app, afgezet tegen jouw eigen normaal), authenticatie met een bearertoken, nergens een account. Deze pagina is de hele installatie.
Een agent op een andere computer, of antwoorden nodig terwijl de telefoon slaapt? Koppel de zelfgehoste mirror (pip install marrow-mcp): die antwoordt 24/7 voor Claude Code, Cursor en OpenClaw. Kom je hier vanuit de ingebouwde koppeling van Claude of ChatGPT, dan zie je hier wat Marrow doet dat zij niet doen.
De installatie voor één app tegelijk, Claude Code, Cursor, Codex en meer, staat op een eigen pagina onder verbindingen.
Ik wil mijn eigen Apple Health-gegevens met jou verbinden. Marrow is een gratis iOS-app die ze aanbiedt via MCP, zonder account en zonder dat daarvoor een abonnement nodig is. Hij staat in de App Store: https://apps.apple.com/app/id6800819435. Loop me door het hele proces: de app installeren, de server aanzetten onder Exporteer en dan Lokale MCP, en de URL en het bearertoken die hij me toont toevoegen aan jouw MCP-configuratie als Streamable HTTP-server. Kun je die configuratie niet zelf bewerken, vertel me dan precies welk bestand het is en wat ik moet plakken. Documentatie voor het instellen: https://marrowhealthapp.com/mcp. Roep als het verbonden is health_summary aan voor de laatste 7 dagen en vertel me wat opvalt.
1. Zet de server aan
Hij staat standaard uit. In de app: Exporteer → Lokale MCP, en zet dan de server aan. Je krijgt een URL, een token en een QR-code. De server bindt alleen aan je lokale netwerk, en de app toont het exacte adres waarop hij luistert.
2. Wijs je client ernaartoe
Vervang <phone-ip> en <token> door wat de app je toont.
Claude Code
claude mcp add --transport http marrow \ http://<phone-ip>:21212/mcp \ --header "Authorization: Bearer <token>"
Claude Desktop, met één klik
Download marrow.mcpb op je computer en dubbelklik erop. Claude Desktop installeert de extensie en vraagt om de URL en het token hierboven. Geen terminal nodig.
Claude Desktop (handmatig), Cursor of elke client die een mcp.json gebruikt
{
"mcpServers": {
"marrow": {
"type": "http",
"url": "http://<phone-ip>:21212/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}
Controleer het met de hand
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"}'
De tools
Leestools zijn er altijd. Schrijftools zijn een tweede schakelaar. Vanaf Marrow 1.5 toont de server van de telefoon dezelfde twaalf schrijftools als Cloud-MCP (log_meal, log_water, log_weight, log_workout, log_strength, log_sleep, log_symptom, log_mood, edit_entry, delete_entry, set_targets, undo_entry) zodra je onder Lokale MCP AI-schrijftoegang toestaan aanzet. Ze worden meteen op de telefoon toegepast en naar Apple Health geschreven, en elk ervan kan ongedaan worden gemaakt. Staat het uit, dan kan de server alleen lezen.
| Tool | Geeft terug |
|---|---|
health_summary | Recente dagen over activiteit, hart, slaap en voeding |
list_metrics | Elke bijgehouden meetwaarde, met eenheden en dekking |
metric_daily | Dagwaarden voor elke meetwaarde, tot 400 dagen |
metric_samples | Ruwe records met tijdstempels en bronapparaten |
workouts | Work-outs uit elke bron. Op de telefoon ook de krachttrainingen van Marrow set voor set |
nutrition_log | Voedingsdagboek met de volledige uitsplitsing van voedingsstoffen |
strength_log | Elke krachtset met het settype, geschat 1RM per oefening, volume per spiergroep. Opwarmsets tellen nooit mee voor volume of records |
sleep_log | Eén nacht per dag waarop je wakker wordt: bedtijd, wektijd, uren geslapen, minuten per fase (zelfgehoste mirror) |
symptoms_and_mood | Symptomen met hun ernst, en items van Gemoedstoestand met gevoelens en waar ze over gingen (zelfgehoste mirror) |
Nog vier op de zelfgehoste mirror en op Cloud-MCP. Ze beginnen waar de ruwe leestools ophouden: elke waarde wordt afgezet tegen je eigen voortschrijdende normaal met dezelfde berekening als de Home-pagina van de app (de dag zelf uitgezonderd), zodat een agent begint met een lezing die al voor jou klopt in plaats van een getal te beoordelen tegen de bevolking.
| Tool | Geeft terug |
|---|---|
daily_brief | Eén dag: elke belangrijke meetwaarde met zijn waarde en de eigen formulering van de app (normaal voor jou, boven je normaal, ver onder je normaal), voeding en water ten opzichte van je doelen, de slaap van afgelopen nacht, gedane training, stemming en symptomen, en signalen die het noemen waard zijn |
baselines | Je eigen normaal per meetwaarde: gemiddelde en spreiding over het venster, de z en formulering van de laatste waarde, het 7-daagse gemiddelde en de 90-daagse trend per maand |
what_changed | De laatste week ten opzichte van de vier ervoor: wat bewoog en hoe opvallend dat voor jou is, voeding, training, verschuivingen in slaap en bedtijd, reeksen die begonnen of stopten met binnenkomen |
data_quality | Wat de mirror bevat en hoe vers het is: per meetwaarde de laatste dag, dekking, frequentie, bronnen en of het verouderd is, zodat een agent een gat nooit voor een feit aanziet |
De server op het apparaat biedt de eerste zeven ruwe tools plus daily_brief en baselines (negen leestools). De zelfgehoste mirror biedt alle dertien, net als de gehoste kopie van Cloud-MCP. Elke leestool op de mirror accepteert dagen terug of van en tot op de kalender van de telefoon, en de mirror biedt ook vier prompts (how_am_i_doing, weekly_review, doctor_prep, log_from_text) en vier resources aan clients die ze tonen. Ruwe samples bevatten slaapfases en ernst van symptomen.
Achter list_metrics zitten 172 Apple Health-meetwaarden, plus de eigen dagboek- en krachtgegevens van Marrow achter nutrition_log en strength_log, over activiteit, hart, slaap, lichaam, ademhaling, mobiliteit, gehoor, voeding, geest, symptomen, cyclus en gewoonten. Machineleesbare versie van deze pagina: tools.json.
Bereikbaar blijven als de telefoon dat niet is
De server op het apparaat antwoordt zolang de app draait. Voor toegang 24/7 koppel je een zelfgehoste mirror: één Python-stdlib-bestand op een Pi, NAS of oude laptop. De pushes van de telefoon op de achtergrond houden hem actueel, en hij biedt hetzelfde MCP-oppervlak op http://<server-ip>:8800/mcp met een eigen token. De tools op de telefoon gebruiken de meetwaardesleutels van de app (active_energy, heart_rate_variability). De server accepteert zowel die als de korte namen van Apple (active_energy_burned), zodat een agent tussen beide kan wisselen zonder opnieuw te leren. Hij is open source en te installeren:
pip install marrow-mcp marrow-server
Bron: github.com/MarrowHealth/marrow-mcp. Vermeld in het officiële MCP-register als tech.skeletonarmy/marrow.
Gebruik geen port-forwarding om een van beide servers aan het open internet bloot te stellen. Beide zijn ontworpen voor een lokaal netwerk of een tailnet. Heb je toegang op afstand nodig, zet er dan tailscale serve of iets vergelijkbaars voor, zodat het transport HTTPS is en het apparaat is geauthenticeerd voordat het bearertoken ooit wordt gezien.
Problemen oplossen
Begin met de test hieronder, uitgevoerd vanaf de computer waarop je AI draait. Hij vertelt je aan welke kant het probleem zit. Gebruik het adres en het token van de pagina van de verbinding in Marrow, met Marrow open op de telefoon.
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"}'
| Wat je krijgt | Wat het betekent |
|---|---|
HTTP/1.1 200 OK en een lijst met tools | De telefoon werkt. Het probleem zit in de instellingen van je app: het adres, het token, of een servertype anders dan HTTP (Streamable HTTP). Pas de configuratie aan en start de app opnieuw. |
401 Unauthorized | Het token is onjuist, of deze verbinding staat uit in Marrow. Elke verbinding bij Je verbindingen heeft een eigen token, en als je er een uitzet, wordt die app buitengesloten terwijl de andere blijven werken. Zet hem aan, of kopieer zijn token opnieuw. |
404 Not Found met use POST /mcp | Het pad klopt niet. Het adres eindigt op /mcp. |
| Verbinding geweigerd, of geen antwoord totdat de time-out verstrijkt | De computer kan de telefoon niet bereiken. Loop de lijst hieronder langs. |
- Marrow moet open zijn. De server van de telefoon antwoordt alleen zolang Marrow open op de voorgrond staat. Als je van app wisselt of de telefoon vergrendelt, pauzeert iOS hem al snel. Open Marrow weer en hij antwoordt weer. Gebruik Server-MCP of Cloud-MCP voor antwoorden terwijl de telefoon slaapt.
- Hetzelfde wifi-netwerk of tailnet. De computer en de telefoon moeten hetzelfde wifi-netwerk of hetzelfde tailnet delen. Lokale MCP antwoordt nooit via mobiel. Zegt Marrow Geen netwerkadres gevonden, maak dan verbinding met wifi of een tailnet. Gast- en hotelwifi voorkomt vaak dat apparaten elkaar bereiken.
- Tailnet-adres of wifi-adres. Marrow toont een van de adressen van de telefoon, meestal het wifi-adres. Een computer die de telefoon via Tailscale bereikt, heeft in plaats daarvan het tailnet-adres van de telefoon nodig. De Tailscale-app toont het (het begint met
100.). Zet het in je configuratie in plaats van het wifi-adres en houd dezelfde poort en hetzelfde token. - Het adres is veranderd. Een router kan de telefoon na een tijdje een nieuw wifi-adres geven. Vergelijk het adres in Marrow met dat in je configuratie. Een gereserveerd adres op de router houdt het vast.
- Toegang tot Lokaal netwerk is niet de oorzaak. iOS vraagt erom als Marrow contact zoekt met een apparaat op je netwerk, zoals een gekoppelde server. Als de server van de telefoon een computer antwoordt, is geen toestemming nodig, dus die schakelaar aan- of uitzetten verandert niets aan Lokale MCP.
- Een vpn op de computer. Een andere vpn dan je tailnet kan lokaal verkeer van je wifi weglokken. Pauzeer hem en probeer de test opnieuw.
- Een 405 in het log van je app. De telefoon antwoordt alleen op POST en houdt geen stroom open, dus een GET krijgt
405. Apps die Streamable HTTP spreken, gaan door met POST, dus deze regel alleen is niet het probleem. - Je app accepteert alleen een opdracht (stdio). Leid het adres van de telefoon via de bridge mcp-remote. Voor een gewoon http-adres dat niet op de computer zelf staat, is
--allow-httpnodig:npx -y mcp-remote http://<phone-ip>:21212/mcp --allow-http --header "Authorization: Bearer <token>". In een configuratiebestand voor Cursor, Codex of Claude Desktop op Windows kunnen spaties in args verknoeid raken. Schrijf de koptekst alsAuthorization:${AUTH_HEADER}en stelAUTH_HEADERin opBearer <token>in de env van de server. - Het leest, maar kan niet loggen. Zet AI-schrijftoegang toestaan aan onder Lokale MCP. Items worden meteen op de telefoon toegepast en elk item kan ongedaan worden gemaakt.
- De verbinding gaat niet aan. Gratis houdt 1 verbinding tegelijk aan, Marrow Pro maximaal 10: AI's, servers en automatiseringen samen. Zet eerst een andere uit bij Je verbindingen.
Instellen en oplossingen voor één app tegelijk, Claude Code, Cursor, VS Code en meer, staan onder verbindingen.
Wat het kost
Niets. Toegang voor agents zit in de gratis variant, samen met synchronisatie op de achtergrond, geautomatiseerde export, export naar CSV en JSON en het scannen van barcodes. Health Auto Export bracht een MCP-server uit vóór Marrow, en die is goed, maar die van hen vraagt om een Premium-abonnement. Dat verschil, niet de eerste zijn, is de claim die het waard is om te maken.
Vereisten
- iOS 17 of nieuwer, en Apple Health. Er is geen Android- of webversie.
- Marrow staat gratis in de App Store: apps.apple.com/app/id6800819435.
- Er bestaat geen Marrow-account, dus er is geen gehoste API om aan te roepen zonder het eigen apparaat van een gebruiker.