Marrow Get the app

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

  1. Open the pairing URL on any screen near you.
  2. In Marrow: Export, Server, Pair with a server, scan the code.
  3. 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

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.