open source (mit) / one python file / mcp built in / free
The self-hosted mirror.
A small server on hardware you own that keeps a complete, live copy of your Marrow data and answers agents while your phone is asleep, in a pocket, or on the other side of the world.
All Marrow guides: MCP · Self-hosted mirror · Automations · Files · Support
What it is
A small open-source server you run on hardware you own: a Raspberry Pi, a NAS, an old laptop, a $5 VPS. Your phone pairs with it once by scanning a QR code, then pushes every change in the background, with the app closed. The server keeps a complete SQLite copy of your Marrow data and serves the same seven read-only MCP tools as the phone does, so an agent can ask "how did I sleep this week" at 3 a.m. with your phone in a drawer. MIT licensed: github.com/skeletonarmytech/marrow-mcp.
Install
One Python file, standard library only, Python 3.10 or newer:
pip install marrow-mcp marrow-mcp # or: python3 marrow_server.py
Or with Docker:
git clone https://github.com/skeletonarmytech/marrow-mcp cd marrow-mcp docker compose up -d
On first start it prints a pairing URL and shows a QR code in any browser on your network.
Pair the phone
- Open the pairing URL on any screen near you.
- In Marrow: Export, Server, Pair with a server, scan the code.
- Done. The phone starts pushing, and the Server page shows the last push time and how many records are waiting.
Pairing creates two tokens in the server's data directory: one the phone uses to push, one agents use to read. Delete a token file to rotate it.
Point an agent at it
claude mcp add --transport http marrow http://<server-ip>:8800/mcp \ --header "Authorization: Bearer <mcp token>"
Same tools as the phone's own server: health_summary, list_metrics, metric_daily, metric_samples, workouts, nutrition_log, strength_log. Setup for Claude Desktop, Cursor and others is on the MCP page; only the URL changes.
Reaching it from outside your LAN
The server speaks plain HTTP and has no TLS of its own. Do not port-forward it raw. Put Tailscale on the box and the phone and use tailscale serve, or front it with Cloudflare Tunnel or any reverse proxy that terminates HTTPS. The pairing QR carries whatever URL you were on when you opened it, so pair from the address you will actually use.
What lands on disk
- A SQLite database with every daily series, sample, diary entry and strength set, kept current by the phone's pushes.
- Every raw push staged as JSONL next to it, so the database can be rebuilt if you ever mangle it.
- Budget 50 to 150 MB per year of full-fidelity history.
Units: Health metrics arrive in their stored SI units with labels; strength sets arrive in pounds with "unit": "lb" whatever the phone's display setting, so the mirror never mixes units. Point Grafana, DuckDB or a cron job straight at the database file.
When to choose this over the others
Choose the mirror when your agent needs the data while your phone is asleep or away, or when you want a queryable database rather than files. Choose the on-phone MCP server when your agent runs near the phone and you want nothing else to maintain. Choose automations when you already have a place data should land.