marrow-mcp
Self-hosted mirror and MCP server for Marrow: read-only agent access to your own Apple Health data
- 3 estrellas
- 0 forks
- 0 issues abiertos
- Lenguaje: Python
- Licencia: MIT
- actualizado
Instalación
local · uvx (python)claude mcp add marrow-mcp -- uvx marrow-mcp{
"mcpServers": {
"marrow-mcp": {
"command": "uvx",
"args": ["marrow-mcp"]
}
}
}{
"mcpServers": {
"marrow-mcp": {
"command": "uvx",
"args": ["marrow-mcp"]
}
}
}- Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
- Replace any <placeholder> values with your API keys or paths.
- Restart Claude. The MCP server and its tools appear automatically.
Package name inferred from the repository name. Verify it exists on PyPI, or clone https://github.com/MarrowHealth/marrow-mcp and follow its README.
Resumen de MCP Servers
Marrow Health MCP server (marrow-mcp)
Let your AI agents read your own Apple Health data.
Marrow is a free iOS app that tracks 178 health data series - 172 Apple Health types plus its own meal diary and set-by-set weightlifting log. This repo is its self-hosted companion server: one Python file, standard library only, that keeps a SQLite mirror of your data on hardware you own and serves it over the Model Context Protocol so agents can query it 24/7, phone in your pocket.
Nothing here talks to a cloud. Data flows phone → your machine, full stop.

Run it
pip install "marrow-mcp[qr]" # [qr] adds segno, which draws the pairing QR
marrow-server --port 8800 --data ./data # prints a pairing URLWithout [qr] the pairing page shows the pairing JSON instead of a code.
or from a clone
python3 marrow_server.py # prints a pairing URL
python3 marrow_server.py --port 8800 --data ./dataor with Docker
docker compose up -dOpen the pairing URL on any screen, then in Marrow: Export, Server MCP,
Pair with a server, and scan. From then on the app's background pushes keep
the mirror current with the app closed. The app pairs over plain http only on
your own networks (a private or tailnet IPv4 address, a .local or .ts.net
name, a short LAN name). A public address needs https (--url https://...).
Upgrading to 0.3.0
Stop the old server and start the new one on the same --data directory.
An existing mirror.sqlite gains the new columns on first start, and the
tokens in --data carry over, so the phone stays paired. Sets logged by
Marrow 1.4 carry a set_type (work,
warmup, failure or drop). Warm-ups are still listed but no longer count toward
volume or records, and rows mirrored before the upgrade read as work sets.
Connect an agent
The server speaks MCP over Streamable HTTP (JSON-RPC 2.0, protocol version
2025-06-18), authenticated with a bearer token it generates on first run and
prints alongside the pairing link.
Claude Code
claude mcp add --transport http marrow \
http://<server-ip>:8800/mcp \
--header "Authorization: Bearer <mcp token>"Claude Desktop, one click
Download marrow.mcpb,
double-click it, and Claude Desktop installs the extension and asks for the
URL and token. No terminal involved. (The bundle is a tiny zero-dependency
bridge in mcpb/. It forwards Claude's stdio to your Marrow URL and nothing
else.)
Claude Desktop (manual), Cursor, or anything using an mcp.json
{
"mcpServers": {
"marrow": {
"type": "http",
"url": "http://<server-ip>:8800/mcp",
"headers": { "Authorization": "Bearer <mcp token>" }
}
}
}Check it by hand
curl -s http://<server-ip>:8800/mcp \
-H "Authorization: Bearer <mcp token>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Tools
Thirteen tools, all of them reads. The server also carries write tools (log a meal, a workout and so on), but it lists them only after a phone registers it for write-back, and today only Marrow Connect does that. A self-hosted server paired from the app serves the thirteen reads and nothing an agent can call writes to your health record.
Four of them answer in the app's own terms, scored against your own trailing normal with the same math the app's Home page uses (the day itself excluded), so an agent starts from a read that is already true for you instead of judging a number against the population:
| Tool | Returns |
|---|---|
daily_brief | One day: each key metric with its value and a phrase (normal for you, above your normal, well below your normal), food and water against your targets, last night's sleep, training done, mood and symptoms, and flags worth mentioning |
baselines | Your own normal per metric: mean and spread over the window, the latest value's z and phrase, the 7-day mean and the 90-day trend per month |
what_changed | The recent days against the period before them: what moved and how notable it is for you, food, training, sleep and bedtime shifts, and streams that started or stopped arriving |
data_quality | What the mirror holds and how fresh it is: per metric the latest day, coverage, cadence, sources and whether it has gone stale, plus diary, sleep and training coverage and when the phone last synced |
The nine raw reads:
| Tool | Returns |
|---|---|
health_summary | Recent days across activity, heart, sleep and nutrition |
list_metrics | Every metric in the mirror, with units and coverage |
metric_daily | Daily values for any metric, up to 400 days |
metric_samples | Raw records with timestamps and source devices |
workouts | Workouts from every source: activity, start, end, duration and source |
nutrition_log | The meal diary: every logged food with full nutrient detail, by day |
strength_log | Every lifting set with its set type and estimated 1RM, per-exercise progression, and volume per muscle group (warm-ups left out) |
sleep_log | One night per wake day: bedtime, wake time, hours asleep, minutes per stage |
symptoms_and_mood | Symptoms with their severity, and State of Mind entries with valence, feelings and what they were about |
Every read takes days back from the phone's today, or from and to on
the phone's calendar. metric_samples pages with before (the start of the
last record you have). Tools with an output schema also answer with
structuredContent.
Four prompts come with the server (how_am_i_doing, weekly_review,
doctor_prep, log_from_text) and four resources (marrow://today,
marrow://metrics, marrow://targets, marrow://quality), for the clients
that show them.
Metric keys: list_metrics shows Apple's short names (active_energy_burned),
and the tools also accept the app's own keys (active_energy,
heart_rate_variability), so an agent moved over from the phone keeps its
vocabulary.
Then ask your agent things like "how did my sleep change once I started training in the mornings?" and let it go and look.
Kits, recipes and the Claude Code plugin
kits/: copy-and-paste setup for Claude Code, Claude Desktop, Cursor, OpenClaw and Hermes Agent.
recipes/: receivers for Marrow's Automations (the app POSTs your data to any URL on a schedule, with the app closed): Home Assistant, n8n, Google Sheets through Apps Script, InfluxDB.
The Claude Code plugin:
/plugin marketplace add MarrowHealth/marrow-mcpthen/plugin install marrow-health@marrow. It adds the Marrow Connect server and four commands (/marrow-health:how-am-i-doing,weekly-review,doctor-prep,log) plus a skill that knows which tool answers what.
Why not the built-in Claude or ChatGPT connector?
Both Claude (Pro/Max, US) and ChatGPT now read Apple Health natively. Use them if that is all you need. They stop where this server starts:
| Claude / ChatGPT connector | Marrow + this server | |
|---|---|---|
| Where it works | The iOS app only | Claude Code, Claude Desktop, Cursor, OpenClaw, Hermes, any MCP client, on any machine |
| When it works | While you are in the chat on the phone | 24/7, phone in your pocket, from your own box |
| What the model sees | Raw HealthKit numbers | Daily values reconciled against Apple's own totals, meal diary, set-by-set lifts |
| Where the data lives | Their cloud, per conversation | SQLite on hardware you own |
| Cost | Subscription | Free, MIT |
OpenClaw / Hermes / any agent on a home machine. Point the agent's MCP
config at the server URL with the bearer token, exactly as in the mcp.json
block above. Reach it from outside the LAN with tailscale serve --bg --https=8800 http://127.0.0.1:8800 and use the tailnet URL.
The other ways in
This server is one of the doors on Marrow's Export tab, and you do not need it to give agents access:
Local MCP. Marrow runs an MCP server on the iPhone itself at
http://:21212/mcp, answering while the app is running. Seven of the raw reads above, zero extra hardware.Server MCP. This package: an always-on mirror on your own box.
Automated. Scheduled pushes to any URL (Home Assistant, n8n, your own endpoint).
Manual. CSV, JSON and GPX files out of the share sheet.
All four are in the free tier. Setup for all of them: https://marrowhealthapp.com/guides.
Marrow Connect is the hosted Pro path: Marrow runs the mirror, and ChatGPT, Claude or Gemini read it with the phone asleep and nothing to run. It is the only door that can log for you, once you turn on Allow AI write in the app. https://marrowhealthapp.com/connect
Security
Both servers are built for a LAN or a tailnet. Do not port-forward this to the open internet. If you need it remotely, front it with
tailscale serve, Caddy, or an equivalent so the transport is HTTPS and the device is authenticated before the bearer token is ever presented.Two separate tokens live in
--data:.app-tokenfor the phone's pushes and.mcp-tokenfor agents. Rotating one does not disturb the other.Ingest is idempotent and UUID-keyed, so a replayed batch cannot double-count.
Status
Marrow is on the App Store, iOS 17+, and requires Apple Health. Get it on the App Store.
The iOS app is closed source. This server is not, because you should be able to read anything you are asked to run on your own hardware.
Registry
Lo que la gente pregunta sobre marrow-mcp
¿Qué es MarrowHealth/marrow-mcp?
MarrowHealth/marrow-mcp es mcp servers para el ecosistema de Claude AI. Self-hosted mirror and MCP server for Marrow: read-only agent access to your own Apple Health data Tiene 3 estrellas en GitHub y su última actualización registrada es del 2026-10-23.
¿Cómo se instala marrow-mcp?
Puedes instalar marrow-mcp clonando el repositorio (https://github.com/MarrowHealth/marrow-mcp) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar MarrowHealth/marrow-mcp?
Nuestro agente de seguridad ha analizado MarrowHealth/marrow-mcp y le ha asignado un Trust Score de 95/100 (tier: Verified). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene MarrowHealth/marrow-mcp?
MarrowHealth/marrow-mcp es mantenido por MarrowHealth. La última actividad registrada en GitHub es del 2026-10-23, con 0 issues abiertos.
¿Hay alternativas a marrow-mcp?
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.