Vaultbeat

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

1

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.

2

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 status
uvx vaultbeat-apple-health@latest bind

bind 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.

3

Add it to Claude Code

claude mcp add vaultbeat-health -- uvx vaultbeat-apple-health@latest serve --transport stdio

Done. 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.

Setting this up with an agent? Point it at vaultbeat.app/skill.md — machine-readable setup instructions it can follow directly.

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 stdio

For clients that connect over HTTP, a streamable-HTTP endpoint is available:

uvx vaultbeat-apple-health@latest serve --transport http

HTTP 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

ToolReturns
vaultbeat_statusLocal binding state — never exposes keys or tokens
vaultbeat_doctorFive-step self-diagnosis of this install, plus which data types are currently unavailable
vaultbeat_start_bindingGenerate a fresh QR binding payload for the iOS app to scan
vaultbeat_poll_bindingPoll once for the iOS authorization to complete binding
vaultbeat_sync_sleepRecent sleep sessions with heart-rate samples; per-day primary-session selection matching the iOS app
get_sleep_detailPer-night heart-rate + respiratory-rate + sleep-stage timeline
get_water_intakeDaily water intake plus a computed daily average
get_weight_trendDaily weights with latest / average / min / max and a weekly trend rate
get_menstrual_cycleopt-in onlyCycle samples plus a next-period prediction
get_symptomsopt-in onlyHealthKit symptom days, grouped by data owner
get_notesopt-in onlyFree-text day annotations with their writer
get_activityDaily activity rings: steps, energy, exercise minutes, stand hours, distance
get_resting_hrResting heart-rate records with the window mean
get_workoutsWorkout records: type, duration, calories, distance
get_mindfulnessMindful sessions and minutes per day
get_hrvHeart-rate variability (SDNN) records with the window mean
get_wrist_tempSleeping wrist temperature, in absolute °C
get_basal_energyBasal (resting) energy burned — the Apple Watch BMR estimate, in kcal
get_total_energy_burnedTDEE per day: basal plus active energy, over the last N days
get_vo2maxVO₂ Max samples with latest, peak, trough and window average
get_strength_logStrength-training sessions — exercises, sets, reps and weight per day
get_food_logDaily 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.

ToolWrites
log_weight_entryRecord 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_entryRecord 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_appendAdd 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_entryRecord 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_appendAdd 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_noteRecord 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_appendAdd 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.

PromptWhat it asks for
daily_briefThe 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 serversVaultbeat
FreshnessManual XML/CSV export — a stale snapshot from the moment it landsContinuous background sync — always current
WorkflowRe-export and re-import every time you want new dataBind once with a QR scan; your agent just asks
PeopleSingle user onlyCouples — your partner's data too, with their explicit per-category consent
SecurityPlaintext export files sitting on diskE2EE — 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.