Le miroir autohébergé
Un petit serveur sur du matériel qui vous appartient, qui garde une copie complète et vivante de vos données Marrow et répond aux agents pendant que votre téléphone est en veille, dans une poche ou à l’autre bout du monde.
La configuration pour une app à la fois est sur sa propre page sous connexions.
Tous les guides Marrow: MCP · Miroir autohébergé · Automatisations · Fichiers · Assistance
De quoi il s’agit
Un petit serveur open source que vous faites tourner sur du matériel qui vous appartient : un Raspberry Pi, un NAS, un vieil ordinateur portable, un VPS à $5. Votre téléphone s’y associe une fois en scannant un code QR, puis envoie chaque changement en arrière-plan, app fermée. Le serveur garde une copie SQLite complète de vos données Marrow et sert treize outils MCP de lecture : les sept du téléphone, sleep_log et symptoms_and_mood, et quatre qui répondent dans les termes propres à l’app (daily_brief, baselines, what_changed, data_quality), si bien qu’un agent peut demander « comment ai-je dormi cette semaine » à 3 h du matin avec votre téléphone dans un tiroir. Sous licence MIT : github.com/MarrowHealth/marrow-mcp.
Installer
Un fichier Python, bibliothèque standard uniquement, Python 3.10 ou plus récent :
pip install marrow-mcp marrow-server # or: python3 marrow_server.py
Ou avec Docker :
git clone https://github.com/MarrowHealth/marrow-mcp cd marrow-mcp docker compose up -d
Au premier démarrage, il affiche une URL de jumelage et montre un code QR dans n’importe quel navigateur de votre réseau.
Associer le téléphone
- Ouvrez l’URL de jumelage sur n’importe quel écran près de vous.
- Dans Marrow : Exporter, MCP serveur, Associer à un serveur, scannez le code.
- C’est fait. Le téléphone commence à envoyer, et la page Serveur affiche l’heure du dernier envoi et le nombre d’enregistrements en attente.
Le jumelage crée deux jetons dans le répertoire de données du serveur : un que le téléphone utilise pour envoyer, un que les agents utilisent pour lire. Supprimez un fichier de jeton pour le renouveler.
Pointer un agent vers lui
claude mcp add --transport http marrow http://<server-ip>:8800/mcp \ --header "Authorization: Bearer <mcp token>"
Treize outils, tous en lecture. Les neuf bruts : health_summary, list_metrics, metric_daily, metric_samples, workouts, nutrition_log, strength_log, sleep_log, symptoms_and_mood. Et quatre qui commencent là où s’arrêtent les bruts, notés par rapport à votre propre normale récente avec le même calcul que la page Accueil de l’app : daily_brief (un jour : chaque mesure clé avec sa valeur et la formule propre à l’app, l’alimentation et l’eau face à vos objectifs, le sommeil de la nuit dernière, l’entraînement fait, les signaux à mentionner), baselines (votre propre normale par mesure, le z de la dernière valeur et la tendance sur 90 jours), what_changed (la dernière semaine face aux quatre précédentes : ce qui a bougé, à quel point c’est notable pour vous, décalages du sommeil et de l’heure du coucher, flux qui ont commencé ou cessé) et data_quality (ce qui est frais, périmé ou manquant, pour qu’un agent ne prenne jamais un trou pour un fait). Chaque lecture accepte un nombre de jours en arrière ou un début et une fin dans le calendrier du téléphone. Le serveur liste aussi quatre prompts (how_am_i_doing, weekly_review, doctor_prep, log_from_text) et quatre ressources pour les clients qui les affichent. Il porte aussi douze outils d’écriture, listés dès que votre téléphone les autorise. Depuis Marrow 1.5, activez Autoriser l’écriture par l’IA pour votre serveur dans Exporter, Vos connexions et une IA peut enregistrer repas, eau, poids, entraînements, sommeil, symptômes, humeur et objectifs par son intermédiaire, gratuitement. Le serveur met chaque entrée en file d’attente et le téléphone l’applique quand Marrow s’ouvre ou se réveille, et chacune peut être annulée. La configuration pour Claude Desktop, Cursor et d’autres est sur la page MCP. Seule l’URL change.
L’atteindre depuis l’extérieur de votre réseau local
Le serveur parle en HTTP simple et n’a pas de TLS propre. Ne redirigez pas son port tel quel. Installez Tailscale sur la machine et le téléphone et utilisez tailscale serve, ou placez devant un Cloudflare Tunnel ou n’importe quel reverse proxy qui termine le HTTPS. Le code QR de jumelage porte l’adresse que le serveur annonce : sa propre adresse locale, ou celle que vous lui donnez avec --url. Lancez-le avec l’adresse que vous utiliserez vraiment, par exemple marrow-server --url https://pi.your-tailnet.ts.net, puis associez.
Ce qui est écrit sur le disque
- Une base SQLite avec chaque série quotidienne, échantillon, entrée de journal et série de musculation, tenue à jour par les envois du téléphone.
- Chaque envoi brut conservé en JSONL à côté, pour que la base puisse être reconstruite si vous l’abîmez un jour.
- Prévoyez 50 à 150 Mo par an d’historique en pleine fidélité.
Unités : les mesures de santé arrivent dans leurs unités SI stockées, avec leurs libellés. Les séries de musculation arrivent en livres avec "unit": "lb" quel que soit le réglage d’affichage du téléphone, si bien que le miroir ne mélange jamais les unités. Pointez Grafana, DuckDB ou une tâche cron directement vers le fichier de la base.
Dépannage
Deux tests depuis l’ordinateur sur lequel tourne votre IA vous disent où est le problème. D’abord, le serveur est-il en marche ? Celui-ci n’a pas besoin de jeton :
curl http://<server-ip>:8800/health
Il répond {"server": "marrow", "ok": true}. Ensuite, le jeton de votre agent fonctionne-t-il ?
curl -i http://<server-ip>:8800/mcp \ -H "Authorization: Bearer <mcp token>" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
| Ce que vous obtenez | Ce que cela signifie |
|---|---|
200 OK et une liste d’outils | Le serveur fonctionne. Vérifiez l’adresse, le jeton et le type de serveur (HTTP) dans la configuration de votre agent, puis redémarrez l’agent. |
401 avec bad bearer token | Mauvais jeton. Les agents utilisent le jeton mcp, pas celui avec lequel le téléphone s’associe. Voir plus bas. |
| Connexion refusée ou délai dépassé | Le serveur ne tourne pas, le port est faux, ou un pare-feu sur la machine bloque le port 8800. Avec Docker, vérifiez la redirection de port 8800:8800. |
- Quel jeton. Le serveur affiche le jeton des agents à son démarrage, sur la ligne qui commence par
agents:. Il se trouve aussi dans le fichier.mcp-tokendu dossier de données (./datasauf si vous avez passé--data,/datadans Docker). Le téléphone utilise un autre jeton, celui de.app-token. Pour changer le jeton des agents, supprimez.mcp-token, redémarrez le serveur et mettez à jour chaque agent. - La page de jumelage indique un jeton faux ou manquant. Ouvrez le lien de jumelage exactement comme le serveur l’a affiché, avec sa partie
?token=. - La page de jumelage affiche du texte, pas un code QR. Le code QR demande le paquet facultatif
segno:pip install "marrow-mcp[qr]". Ou, dans Marrow, choisissez Saisir manuellement à la place et tapez l’urlet letokende ce texte. - Échec du jumelage sur le téléphone. Le téléphone n’a pas pu atteindre l’adresse du code QR. Sous Docker, le serveur ne voit que l’adresse du conteneur lui-même : donnez-lui la vôtre en ajoutant
--url http://<your-computer-ip>:8800à sa commande. Hors de votre Wi-Fi domestique, utilisez une adresse HTTPS issue detailscale serveou d’un tunnel. - Accès au réseau local. Pour atteindre un serveur de votre réseau domestique, Marrow a besoin de l’accès au réseau local. iOS le demande la première fois que vous associez. Si vous avez refusé, activez Marrow dans Réglages, Confidentialité et sécurité, Réseau local, puis associez de nouveau, Marrow ouvert.
- Ce code QR n’est pas un code de jumelage Marrow. L’appareil photo a lu un autre code. Scannez celui de la page de jumelage du serveur.
- Anciennes données, ou Ne reçoit rien dans Marrow. Le téléphone ne peut pas envoyer au serveur. La page MCP serveur dans Marrow montre le dernier envoi et le nombre d’enregistrements en attente. Vérifiez que le serveur tourne, puis ouvrez Marrow pour envoyer ce qui attend. Les envois en arrière-plan s’exécutent quand iOS le permet.
- Ce serveur a besoin d’une mise à jour avant de pouvoir enregistrer. Mettez-le à jour avec
pip install -U marrow-mcpet redémarrez-le. Avec Docker, lancezgit pulletdocker compose up -d --builddans le clone. - Les entrées de l’IA n’apparaissent pas. Activez Autoriser l’écriture par l’IA pour le serveur dans Exporter, Vos connexions. Les outils d’écriture n’apparaissent sur le serveur qu’après cela. Chaque entrée attend sur le serveur et arrive à la prochaine ouverture ou réveil de Marrow.
- La connexion ne veut pas s’activer. Gratuit garde 1 connexion active à la fois, Marrow Pro jusqu’à 10 : IA, serveurs et automatisations ensemble.
Quand le choisir plutôt que les autres
Choisissez le miroir quand votre agent a besoin des données pendant que votre téléphone est en veille ou absent, ou quand vous voulez une base interrogeable plutôt que des fichiers. Choisissez le serveur MCP sur le téléphone quand votre agent tourne près du téléphone et que vous ne voulez rien d’autre à entretenir. Choisissez les automatisations quand vous avez déjà un endroit où les données doivent arriver.