Connecter un agent à Marrow
Marrow sert vos données Apple Health via le Model Context Protocol, depuis votre propre iPhone ou votre propre serveur. Sept outils en lecture seule sur le téléphone, treize sur votre propre serveur (quatre d’entre eux répondent dans les termes propres à l’app, notés par rapport à votre normale), authentification par jeton bearer, aucun compte nulle part. Cette page est toute la configuration.
Un agent sur une autre machine, ou besoin de réponses pendant que le téléphone dort ? Associez le miroir autohébergé (pip install marrow-mcp) : il répond 24 h sur 24 à Claude Code, Cursor et OpenClaw. Si vous venez du connecteur intégré de Claude ou de ChatGPT, voici ce qu’il fait et qu’eux ne font pas.
La configuration pour une app à la fois, Claude Code, Cursor, Codex et d’autres, est sur sa propre page sous connexions.
Je veux te connecter mes propres données Apple Health. Marrow est une app iOS gratuite qui les sert via MCP, sans compte et sans abonnement nécessaire pour cela. Elle est sur l’App Store : https://apps.apple.com/app/id6800819435. Guide-moi dans tout le processus : installer l’app, activer le serveur sous Exporter puis MCP local, et ajouter l’URL et le jeton bearer qu’elle m’affiche à ta configuration MCP comme serveur Streamable HTTP. Si tu ne peux pas modifier cette configuration toi-même, dis-moi le fichier exact et ce qu’il faut y coller. Documentation de configuration : https://marrowhealthapp.com/mcp. Une fois connecté, appelle health_summary pour les 7 derniers jours et dis-moi ce qui ressort.
1. Activer le serveur
Il est livré désactivé. Dans l’app : Exporter → MCP local, puis activez le serveur. Vous obtenez une URL, un jeton et un code QR. Le serveur n’écoute que sur votre réseau local, et l’app montre l’adresse exacte sur laquelle il écoute.
2. Pointer votre client vers lui
Remplacez <phone-ip> et <token> par ce que l’app vous montre.
Claude Code
claude mcp add --transport http marrow \ http://<phone-ip>:21212/mcp \ --header "Authorization: Bearer <token>"
Claude Desktop, en un clic
Téléchargez marrow.mcpb sur votre ordinateur et double-cliquez dessus. Claude Desktop installe l’extension et demande l’URL et le jeton ci-dessus. Aucun terminal nécessaire.
Claude Desktop (manuel), Cursor, ou tout client qui utilise un mcp.json
{
"mcpServers": {
"marrow": {
"type": "http",
"url": "http://<phone-ip>:21212/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}
Vérifier à la main
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"}'
Les outils
Les lectures sont toujours là. Les écritures sont un second interrupteur. Depuis Marrow 1.5, le serveur du téléphone liste les mêmes douze outils d’écriture que le 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) une fois que vous activez Autoriser l’écriture par l’IA sous MCP local, appliqués aussitôt sur le téléphone et écrits dans Apple Health, chacun pouvant être annulé. Désactivé, le serveur est en lecture seule.
| Outil | Renvoie |
|---|---|
health_summary | Les jours récents pour l’activité, le cœur, le sommeil et la nutrition |
list_metrics | Chaque mesure suivie, avec ses unités et sa couverture |
metric_daily | Les valeurs quotidiennes de n’importe quelle mesure, jusqu’à 400 jours |
metric_samples | Les enregistrements bruts avec horodatages et appareils sources |
workouts | Les entraînements de toutes les sources. Sur le téléphone, aussi les séances de musculation de Marrow série par série |
nutrition_log | Le journal alimentaire avec le détail complet des nutriments |
strength_log | Chaque série de musculation avec son type, le 1RM estimé par exercice, le volume par groupe musculaire. Les échauffements ne comptent jamais dans le volume ni dans les records |
sleep_log | Une nuit par jour de réveil : heure du coucher, heure du réveil, heures de sommeil, minutes par phase (miroir autohébergé) |
symptoms_and_mood | Les symptômes avec leur gravité, et les entrées État d’esprit avec les émotions et ce qui les a causées (miroir autohébergé) |
Quatre autres sur le miroir autohébergé et sur le MCP cloud. Ils commencent là où s’arrêtent les lectures brutes : chaque valeur est notée par rapport à votre propre normale récente avec le même calcul que la page Accueil de l’app (le jour lui-même exclu), si bien qu’un agent part d’une lecture déjà vraie pour vous au lieu de juger un chiffre par rapport à la population.
| Outil | Renvoie |
|---|---|
daily_brief | Un jour : chaque mesure clé avec sa valeur et la formule propre à l’app (normal pour vous, au-dessus de votre normale, bien en dessous de votre normale), l’alimentation et l’eau face à vos objectifs, le sommeil de la nuit dernière, l’entraînement fait, l’humeur et les symptômes, et les signaux à mentionner |
baselines | Votre propre normale par mesure : moyenne et dispersion sur la fenêtre, le z de la dernière valeur et sa formule, la moyenne sur 7 jours et la tendance sur 90 jours par mois |
what_changed | La dernière semaine face aux quatre précédentes : ce qui a bougé et à quel point c’est notable pour vous, alimentation, entraînement, sommeil et décalages de l’heure du coucher, flux qui ont commencé ou cessé d’arriver |
data_quality | Ce que le miroir détient et sa fraîcheur : par mesure le dernier jour, la couverture, la cadence, les sources et si elle est périmée, pour qu’un agent ne prenne jamais un trou pour un fait |
Le serveur sur l’appareil sert les sept premiers outils bruts plus daily_brief et baselines (neuf lectures). Le miroir autohébergé les sert tous les treize, comme la copie hébergée du MCP cloud. Chaque lecture sur le miroir accepte un nombre de jours en arrière ou un début et une fin dans le calendrier du téléphone, et le miroir propose aussi quatre prompts (how_am_i_doing, weekly_review, doctor_prep, log_from_text) et quatre ressources aux clients qui les affichent. Les échantillons bruts portent les phases de sommeil et la gravité des symptômes.
Il y a 172 mesures Apple Health derrière list_metrics, plus les données de journal et de musculation propres à Marrow derrière nutrition_log et strength_log, couvrant activité, cœur, sommeil, corps, respiration, mobilité, audition, nutrition, esprit, symptômes, cycle et habitudes. Version lisible par machine de cette page : tools.json.
Rester disponible quand le téléphone ne l’est pas
Le serveur sur l’appareil répond tant que l’app tourne. Pour un accès 24 h sur 24, associez un miroir autohébergé : un seul fichier Python de bibliothèque standard sur un Pi, un NAS ou un vieil ordinateur portable. Les envois en arrière-plan du téléphone le tiennent à jour, et il parle la même interface MCP à l’adresse http://<server-ip>:8800/mcp avec son propre jeton. Les outils du téléphone utilisent les clés de mesure de l’app (active_energy, heart_rate_variability). Le serveur accepte à la fois celles-ci et les noms courts d’Apple (active_energy_burned), pour qu’un agent puisse passer de l’un à l’autre sans réapprendre. Il est open source et installable :
pip install marrow-mcp marrow-server
Source : github.com/MarrowHealth/marrow-mcp. Référencé dans le registre MCP officiel sous le nom tech.skeletonarmy/marrow.
Ne redirigez le port d’aucun des deux serveurs vers l’internet public. Les deux sont conçus pour un réseau local ou un tailnet. Si vous avez besoin d’un accès à distance, placez devant tailscale serve ou un équivalent, pour que le transport soit en HTTPS et que l’appareil soit authentifié avant même que le jeton bearer ne soit vu.
Dépannage
Commencez par le test ci-dessous, lancé depuis l’ordinateur sur lequel tourne votre IA. Il vous dit de quel côté se trouve le problème. Utilisez l’adresse et le jeton de la page de la connexion dans Marrow, Marrow étant ouvert sur le téléphone.
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"}'
| Ce que vous obtenez | Ce que cela signifie |
|---|---|
HTTP/1.1 200 OK et une liste d’outils | Le téléphone fonctionne. Le problème est dans les réglages de votre app : l’adresse, le jeton, ou un type de serveur autre que HTTP (Streamable HTTP). Corrigez la configuration et redémarrez l’app. |
401 Unauthorized | Le jeton est faux, ou cette connexion est désactivée dans Marrow. Chaque connexion dans Vos connexions a son propre jeton, et en désactiver une bloque l’accès de cette app pendant que les autres continuent de marcher. Activez-la, ou copiez de nouveau son jeton. |
404 Not Found avec use POST /mcp | Le chemin est faux. L’adresse se termine par /mcp. |
| Connexion refusée, ou aucune réponse jusqu’à l’expiration du délai | L’ordinateur ne peut pas atteindre le téléphone. Parcourez la liste ci-dessous. |
- Marrow doit être ouvert. Le serveur du téléphone ne répond que tant que Marrow est ouvert au premier plan. Quand vous changez d’app ou verrouillez le téléphone, iOS le met vite en pause. Rouvrez Marrow et il répond de nouveau. Pour des réponses téléphone en veille, utilisez le MCP serveur ou le MCP cloud.
- Même Wi-Fi ou même tailnet. L’ordinateur et le téléphone doivent partager un réseau Wi-Fi ou un tailnet. Le MCP local ne répond jamais en cellulaire. Si Marrow indique Aucune adresse réseau trouvée, rejoignez un Wi-Fi ou un tailnet. Les Wi-Fi invités et d’hôtel empêchent souvent les appareils de se joindre.
- Adresse tailnet ou adresse Wi-Fi. Marrow affiche l’une des adresses du téléphone, en général celle du Wi-Fi. Un ordinateur qui joint le téléphone via Tailscale a besoin de l’adresse tailnet du téléphone. L’app Tailscale l’affiche (elle commence par
100.). Mettez-la dans votre configuration à la place de l’adresse Wi-Fi et gardez le même port et le même jeton. - L’adresse a changé. Un routeur peut attribuer au téléphone une nouvelle adresse Wi-Fi au bout d’un moment. Comparez l’adresse dans Marrow avec celle de votre configuration. Une adresse réservée sur le routeur la garde fixe.
- L’accès au réseau local n’est pas en cause. iOS le demande quand Marrow contacte un appareil de votre réseau, comme un serveur associé. Le serveur du téléphone qui répond à un ordinateur n’a besoin d’aucune autorisation : activer ou désactiver cet interrupteur ne change donc rien au MCP local.
- Un VPN sur l’ordinateur. Un VPN autre que votre tailnet peut détourner le trafic local loin de votre Wi-Fi. Mettez-le en pause et relancez le test.
- Un 405 dans le journal de votre app. Le téléphone ne répond qu’au POST et ne garde aucun flux ouvert : un GET reçoit donc
405. Les apps qui parlent Streamable HTTP continuent avec POST, donc cette ligne seule n’est pas le problème. - Votre app n’accepte qu’une commande (stdio). Faites passer l’adresse du téléphone par le pont mcp-remote. Il faut
--allow-httppour une adresse http simple qui n’est pas sur l’ordinateur lui-même :npx -y mcp-remote http://<phone-ip>:21212/mcp --allow-http --header "Authorization: Bearer <token>". Dans un fichier de configuration pour Cursor, Codex ou Claude Desktop sous Windows, les espaces dans les arguments peuvent être abîmés. Écrivez l’en-tête ainsi :Authorization:${AUTH_HEADER}et définissezAUTH_HEADERsurBearer <token>dans l’env du serveur. - Elle lit mais ne peut pas enregistrer. Activez Autoriser l’écriture par l’IA sous MCP local. Les entrées s’appliquent aussitôt sur le téléphone et chacune peut être annulée.
- La connexion ne veut pas s’activer. Gratuit garde 1 connexion active à la fois, Marrow Pro jusqu’à 10 : IA, serveurs et automatisations ensemble. Désactivez-en une dans Vos connexions d’abord.
La configuration et les solutions pour une app à la fois, Claude Code, Cursor, VS Code et d’autres, se trouvent sous connexions.
Ce que cela coûte
Rien. L’accès pour les agents est dans l’offre gratuite, avec la synchronisation en arrière-plan, l’export automatisé, l’export CSV et JSON, et le scan de codes-barres. Health Auto Export a lancé un serveur MCP avant Marrow, et il est bon, mais le leur demande un abonnement Premium. Cette différence, et non l’antériorité, est l’argument qui vaut la peine d’être avancé.
Prérequis
- iOS 17 ou plus récent, et Apple Health. Il n’existe pas de version Android ni web.
- Marrow est sur l’App Store, gratuit : apps.apple.com/app/id6800819435.
- Aucun compte Marrow n’existe : il n’y a donc pas d’API hébergée à appeler sans l’appareil de l’utilisateur.