Vaultbeat MCP Server
Apple Health MCP Server — live sleep, cycle, weight & more for your AI agent
Vaultbeat's local MCP server gives Claude Code, Claude Desktop, and any MCP-capable agent read access to your — and your partner's — Apple Health data, plus the ability to log meals, lifts, weight and notes back into your own account. Everything is end-to-end encrypted and synced continuously in the background: the cloud only ever holds ciphertext, decryption happens on your machine, and there are no manual exports.
Requires the Vaultbeat — AI Health Sync iOS app, and Python 3.11+ on the machine where your agent runs. The server is open source on GitHub.
Connect Apple Health to Claude Code
Get the app
Install Vaultbeat — AI Health Sync on your iPhone and sign in. The app starts syncing your Apple Health data end-to-end encrypted in the background.
Install & bind
On the computer where your agent runs, verify the server with uvx (no clone, no venv), then start pairing:
uvx vaultbeat-apple-health@latest statusuvx vaultbeat-apple-health@latest bindbind is the command that shows the QR code — serve (below) prints nothing at all, so don't wait on it for one.
bind generates a Curve25519 keypair on your machine and prints a QR code. In the Vaultbeat iOS app, open Settings → Data & AI → Connect an AI server and scan it. From that moment your iPhone seals an encrypted copy of each record for this machine. The private key never leaves that machine: it lives in your system keyring, or in a 0600 file beside the config on a headless box, and is never uploaded anywhere.
Add it to Claude Code
claude mcp add vaultbeat-health -- uvx vaultbeat-apple-health@latest serve --transport stdioDone. Ask Claude: “How did we sleep last night?” Reads are cache-first on your own machine (10-minute TTL by default), so repeat queries answer in about 0.2 seconds.
Claude Desktop — and any other agent framework
After binding (steps 1–2 above), add this to your claude_desktop_config.json:
{
"mcpServers": {
"vaultbeat-health": {
"command": "uvx",
"args": ["vaultbeat-apple-health@latest", "serve", "--transport", "stdio"]
}
}
}Using Hermes, OpenClaw, or your own harness? Use the same split as above: command is just the executable (uvx, or its absolute path if the framework does not inherit your shell PATH), and everything else goes in args as a list. Putting the full command line into command is the most common way this fails: the server starts, prints its help, and exits — which the host reports as Connection closed, as though the server were broken.
Works with any MCP client
The server speaks standard MCP over two transports. For clients that spawn a subprocess, use stdio:
uvx vaultbeat-apple-health@latest serve --transport stdioFor clients that connect over HTTP, a streamable-HTTP endpoint is available:
uvx vaultbeat-apple-health@latest serve --transport httpHTTP binds to loopback only by default and requires a bearer token; binding a non-loopback address fails closed unless explicitly allowed. Hermes, OpenClaw, and any other MCP-capable agent connect the same way.
What your agent can do
The server currently exposes 29 tools — 22 that read and 7 that write. Most read tools take an owner filter, so you can ask about one person at a time. Sensitive categories reach the server only if the data owner explicitly opts in from the iOS app — they are off by default and never re-exported.
Read
| Tool | Returns |
|---|---|
| vaultbeat_status | Local binding state — never exposes keys or tokens |
| vaultbeat_doctor | Five-step self-diagnosis of this install, plus which data types are currently unavailable |
| vaultbeat_start_binding | Generate a fresh QR binding payload for the iOS app to scan |
| vaultbeat_poll_binding | Poll once for the iOS authorization to complete binding |
| vaultbeat_sync_sleep | Recent sleep sessions with heart-rate samples; per-day primary-session selection matching the iOS app |
| get_sleep_detail | Per-night heart-rate + respiratory-rate + sleep-stage timeline |
| get_water_intake | Daily water intake plus a computed daily average |
| get_weight_trend | Daily weights with latest / average / min / max and a weekly trend rate |
| get_menstrual_cycleopt-in only | Cycle samples plus a next-period prediction |
| get_symptomsopt-in only | HealthKit symptom days, grouped by data owner |
| get_notesopt-in only | Free-text day annotations with their writer |
| get_activity | Daily activity rings: steps, energy, exercise minutes, stand hours, distance |
| get_resting_hr | Resting heart-rate records with the window mean |
| get_workouts | Workout records: type, duration, calories, distance |
| get_mindfulness | Mindful sessions and minutes per day |
| get_hrv | Heart-rate variability (SDNN) records with the window mean |
| get_wrist_temp | Sleeping wrist temperature, in absolute °C |
| get_basal_energy | Basal (resting) energy burned — the Apple Watch BMR estimate, in kcal |
| get_total_energy_burned | TDEE per day: basal plus active energy, over the last N days |
| get_vo2max | VO₂ Max samples with latest, peak, trough and window average |
| get_strength_log | Strength-training sessions — exercises, sets, reps and weight per day |
| get_food_log | Daily food logs as plain text, with optional portions and timing |
Every read tool also returns a coverageblock — how many distinct days the answer actually rests on, the span they fall across, and how many days inside that span are missing. It is there so an agent can say “this is based on 3 days” rather than presenting a three-day average and a thirty-day one in the same words: they are the same shape and the same number of digits, and nothing else in the result tells them apart.
Write
Your agent can log four kinds of record for you — food, strength training, weight and free-text notes — useful when you would rather say “I did 5×5 squats at 80kg” than open the app and tap it in. Three of those kinds come as a pair, and the names say which is which: a log_ tool replaces a whole day, while its _appendtwin only adds and cannot delete — so an agent that cannot see what you have already recorded has a safe option. Writes are encrypted on your machine before upload, exactly like the ones your iPhone makes, so our cloud still only ever receives ciphertext. None of these tools takes an owner argument: an agent can write to your own account and nowhere else, never your partner's. Sleep, cycle and symptom records stay read-only.
| Tool | Writes |
|---|---|
| log_weight_entry | Record a weigh-in. The one write that can also sync into Apple Health — only if you enable "Allow AI to update Apple Health" in Settings (off by default) |
| log_food_entry | Record a day's meals as plain text, with optional portions and timing. Replaces the whole day — use log_food_append to add to a day that already has entries |
| log_food_append | Add meals to a day already logged, leaving everything else that day untouched. Cannot delete anything — prefer this when the day may not be empty |
| log_strength_entry | Record a strength session — exercises, sets, reps, weight. Replaces the whole day — use log_strength_append to add to a day that already has entries |
| log_strength_append | Add exercises to a day already logged, leaving everything else that day untouched. Cannot delete anything — prefer this when the day may not be empty |
| log_note | Record a free-text note for a day (general or mood), so narrative context sits beside the metrics. Replaces that day's note. Sleep and cycle notes stay iOS-authored and are refused |
| log_note_append | Add a line to a day's note, leaving the existing text untouched. Cannot delete anything |
Only log_weight_entry can reach Apple Health, and only when you enable Settings → Data & AI → “Allow AI to update Apple Health” — off by default. The full detail is in the Privacy Policy. The authoritative tool list lives in the GitHub README.
And 8 prompts, so it does not have to guess how
Tools are what your agent can call. prompts/list is how it asks what the server is for — and every MCP client can read it. Without one, each agent invents its own routine, and the two mistakes that do real damage with health data get left to whichever agent happened to connect: calling an association a cause, and reading a gap as a zero. Each entry below names the tools to call for it and carries the same two rules — say what the data covers before concluding anything, describe rather than prescribe, invent no scores or grades; and where a read can come back empty, never treat that emptiness as a measurement of zero.
| Prompt | What it asks for |
|---|---|
| daily_brief | The most recent day, set against the fortnight behind it — and it names the newest date it can actually see before drawing anything from it |
| sleep_reviewnights (optional) | Duration and stages across recent nights. Nights where the watch logged time in bed without ever measuring sleep stay their own category instead of averaging in as zero-minute nights that never happened |
| energy_balancedays (optional) | Calories in against calories out, with the days missing hours of basal data excluded rather than quietly dragging the average down |
| training_block_reviewdays (optional) | Lifting and cardio volume beside the recovery signals from the same weeks — offered as context, never as a verdict on the block |
| cycle_aware_readmetric (optional) | A metric read against the same phase of earlier cycles instead of against last week, which mixes phases and manufactures a trend out of an ordinary rhythm |
| partner_check_indays (optional) | Both of you side by side, read once per person rather than averaged across two bodies — and described rather than assessed, because sharing is a kindness and not a monitoring feature |
| log_from_conversationentry (optional) | Turns something you said in passing into an entry, and asks you for a weight, rep count or portion it was not told rather than reaching for a plausible one |
| why_is_this_emptycontext (optional) | Works out which of the four causes is behind an empty or stale read, then gives the single next step for that one instead of a checklist of all four |
Every argument is optional. Omit one and it is filled with a default written into the prompt itself, so asking for a prompt with no arguments is a supported call rather than a degraded one.
Why not just export my Apple Health XML?
Most Apple Health MCP servers work on a manual export: you generate an XML or CSV dump, import it, and query a snapshot that is stale the moment it lands. Vaultbeat takes a different approach — the iOS app syncs continuously in the background, so your agent always reads current data.
| Export-based MCP servers | Vaultbeat | |
|---|---|---|
| Freshness | Manual XML/CSV export — a stale snapshot from the moment it lands | Continuous background sync — always current |
| Workflow | Re-export and re-import every time you want new data | Bind once with a QR scan; your agent just asks |
| People | Single user only | Couples — your partner's data too, with their explicit per-category consent |
| Security | Plaintext export files sitting on disk | E2EE — the cloud holds ciphertext only; keys never leave your devices |
How the end-to-end encryption works
Every health record is encrypted on your iPhone before it leaves the device: the record is sealed with AES-GCM, and its key is wrapped for each authorized recipient using Curve25519 ECDH with HKDF-SHA256 — one envelope for you, one for your partner if sharing is on, one for each machine you pair. The cloud stores and routes ciphertext only; we hold no decryption keys and cannot read your health data — architecturally, not just by policy. When you bind a machine, it generates its own Curve25519 keypair. The private key never leaves that machine: it lives in your system keyring, or in an owner-only file beside the config when the machine has no keyring at all, and is never uploaded anywhere. Decryption happens in exactly the places you chose: your own devices, an opted-in partner's device, and the machine your agent runs on. The decryption code is open source — audit it.
Frequently asked questions
My agent suddenly cannot read my health data — what should I check?
Check https://vaultbeat.app/status first. It shows whether the sync endpoint your agent reads through is reachable right now. If a service is degraded, waiting is the fix — do not re-pair, since that means setting your AI connection up again for nothing. If everything there is green, run `uvx vaultbeat-apple-health@latest doctor`, which walks the whole chain locally: config present, keypair usable, binding valid, cloud reachable, and a real record decrypted end to end.
Do I need an Apple Watch?
No. Without a Watch, Vaultbeat uses Apple’s on-device Motion & Fitness inference on your iPhone to record sleep sessions, and your agent reads them the same way. An Apple Watch adds stage-level detail (core, deep, REM) and heart-rate samples during sleep — when both sources exist, Vaultbeat automatically prefers the Watch record.
Can my agent read my partner’s data?
Yes — with their explicit consent, granted per category from their own phone. Vaultbeat is the only health app on the App Store designed to be read by your own AI agent, and that extends to partner data: ask Claude Code, Hermes, or OpenClaw how your partner slept, and it answers from the records they chose to share. Sensitive categories are off by default and revocable at any time.
Which plan do I need?
None to start, in Vaultbeat 1.2.3 and later: connecting an AI server is open on every plan, and once your machine is paired you get three days of full agent access. (On 1.2.2 and earlier, connecting still requires Pro — update the app first.) After that, continued agent access is Vaultbeat Pro: $9.99/month, $79.99/year, or $149.99 lifetime. Pro includes everything in Plus (full history and trend charts). Recording your health and sharing it with your partner are free — partner sharing is never paywalled.
Is my data used to train AI?
No — and not just as a policy promise: it is impossible by design. The cloud stores ciphertext only, and Vaultbeat holds no decryption keys, so there is nothing readable to train on. Your data is decrypted in exactly three user-chosen places: your own devices, an opted-in partner’s device, and the machine you explicitly paired.
Not here for the agent? Vaultbeat also lets you share sleep data with your partner — that part is free. Questions? Email support@vaultbeat.app or open an issue on vaultbeat-community.