
Vaultbeat
io.github.Fino-windPublished by GitHub account Fino-windv0.4.5Updated Oct 24, 2026
Your AI agent reads your Apple Health data: sleep, HRV, cycle, workouts. Decrypted on your machine
Overview
Lets an AI assistant read and write your Apple Health data — sleep, HRV, cycle, workouts, meals — decrypted locally on your machine.
- What you can do
- The Vaultbeat iPhone app encrypts HealthKit records on the phone; this local server downloads the ciphertext, decrypts it on your machine, and serves it over MCP. It exposes 26 tools: reads for sleep nights and detail, menstrual cycle, symptoms, notes, strength and food logs, workouts, profile, per-day metrics, intraday HRV, trends, period comparisons and correlations, plus write tools that append or replace a day's food, strength and notes, log weight and symptoms, and update or delete a reported symptom. Eight prompts (daily_brief, sleep_review, why_is_this_empty and others) guide common analyses, and a doctor tool diagnoses the install.
- When to use it
- Use it when you want your own agent to analyze or log Apple Health data — sleep, recovery, training, cycle, nutrition — from a desktop MCP client such as Claude Code or Claude Desktop. It fits personal health review and journaling rather than clinical or multi-user use.
- Requirements
- The Vaultbeat iOS app 1.2.3 or newer, signed in, and a paired machine (bind prints a QR code to scan). uv/uvx with Python 3.11+; the package is vaultbeat-mcp on PyPI. Vaultbeat Pro for agent access after a 3-day trial. Desktop only. Optional HTTP transport uses a bearer token from VAULTBEAT_MCP_HTTP_TOKEN or stored config.
Installation
In SourceWeft
- Open Vaultbeat in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Vaultbeat Apple Health MCP Server
[Vaultbeat MCP server on Glama] [mcp.market grade] [Listed on mcpservers.org]
Your Apple Health data — sleep stages, cycle, HRV, resting heart rate, workouts, weight, VO₂ max, meals, lifts, notes, symptoms, moods (State of Mind) — readable and writable by your own AI agent (Claude Code, Claude Desktop, Codex, Hermes, OpenClaw, anything that speaks MCP), end-to-end encrypted so that only your machine ever sees plaintext.
The Vaultbeat iPhone app reads HealthKit and encrypts every record on the phone. This package is the local server your agent talks to: it downloads the ciphertext, decrypts it on your machine, and serves it over MCP.
The cloud stores ciphertext it cannot read. The key that opens it is generated on your machine when you pair, and never leaves it.
Requirements
- The Vaultbeat iOS app, 1.2.3 or newer, signed in — App Store
- uv (for
uvx). The server needs Python 3.11+, anduvxdownloads a suitable interpreter by itself if your system Python is older. - Vaultbeat Pro for agent access. Pairing a machine starts a 3-day trial of the AI interface; after that, reads and writes need Pro, bought in the iOS app (Settings → Membership). When access lapses nothing is deleted, and buying Pro resumes this machine without re-pairing.
How much history this server can read is decided by what the app uploads. With Pro, that is your whole history. A trial uploads your whole history on app 1.2.9 and later, and your last 7 days on 1.2.8 and earlier. Without either, app 1.2.8 and earlier upload your last 7 days and app 1.2.9 and later upload nothing. So a short history is usually a plan boundary, not a sync delay — vaultbeat_doctor tells the causes apart.
Quick start
1. Pair this machine with your iPhone.
It prints a QR code and waits. In the Vaultbeat app open MCP tab → Connect an AI server (app 1.2.8 and earlier: Settings → Data & AI) and scan it. The command waits 5 minutes (--timeout to change); once scanned there are 10 minutes to finish.
2. Add the server to your MCP client.
Claude Code, as a plugin (adds the server and a setup guide that walks Claude through pairing):
Then run /vaultbeat-apple-health:setup. Or add only the server:
Claude Desktop — add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json) and restart it:
Claude Desktop does not inherit your shell's PATH. If it reports that uvx cannot be found, put the absolute path from which uvx in "command".
Any other MCP client: run uvx vaultbeat-apple-health@latest serve --transport stdio as a stdio server. The @latest matters — without it uvx keeps running whichever version it cached first.
3. Check it works. Ask your agent to call vaultbeat_doctor, or run:
It checks the config, the private key, cloud reachability, the pairing and a real fetch-and-decrypt round trip, and lists which data types have nothing to read yet. Right after pairing the phone is still sealing your history for the new machine, so a few kinds may be empty for a while; MCP tab → Re-sync all health data to AI in the app (app 1.2.8 and earlier: Settings → Data & AI) speeds it up.
Try it without an iPhone
--demo is a global flag — it goes before the subcommand — and serves a fixed synthetic dataset: no pairing, no cloud, no key. Every result says demo_mode: true and carries a [SYNTHETIC DEMO DATA] banner, and the log_* write tools refuse.
MCP tools
29 tools. Reads return your own data — the account that paired this machine. Tools marked partner also take partner=true to read what your partner chose to share with you in their app — sleep, water and weight, and cycle, symptoms, moods and notes only if they turned that on. The two people are never mixed in one result. Every read tool takes fresh=true to skip the local cache.
Diagnostics
Health records
Daily numbers and analysis
The analysis tools return numbers only — no scores, grades or verdicts — and refuse rather than fit a line to two points.
Writes — all into the account that paired this machine, and nowhere else.
log_note and log_note_append take partner=true to record a note about your partner. It stays in your own account, is never sent to them, and is kept apart from your own notes.
Reading the results
- Every read carries a
coverageblock.days_coveredis how many distinct days the answer rests on — quote it beside any average or trend.more_available: truemeans older records exist and yourlimitstopped short of them (oldest_availablesays how far back they go); it is never a sign of missing data. - Results are bounded. A result larger than about 60 KB is not sent; the tool returns
result_too_largewith a suggestion for narrowing the request (a smallerlimit, asincedate, one series instead of all).get_metricandget_intradayreturn their rows as a compact table (columns+rows). - Unknown arguments are rejected. A misspelled or retired parameter is an error, never silently ignored.
MCP prompts
The server also serves eight prompts over prompts/list — daily_brief, sleep_review, energy_balance, training_block_review, cycle_aware_read, partner_check_in, log_from_conversation and why_is_this_empty. Each names the tools to call and carries the same two rules: say what the data covers before concluding, and treat an empty result as something to explain (it has several possible causes), never as a zero. Every argument is optional.
Privacy and security
- Decryption happens only on this machine. The cloud holds ciphertext and per-recipient wrapped keys; the private key that opens them is generated here when you pair.
- Health data leaves this package only through MCP. The command-line subcommands pair a machine, report on that pairing and start the server; none of them prints health data.
- Sensitive categories. Your cycle and the symptoms Apple Health records reach this server only after you turn them on, per category, in the iOS app — they are off by default. Your notes, your moods (State of Mind, from Apple Health and from
log_state_of_mind) and the symptoms you report yourself (in the app, or throughlog_symptom) are always readable by your own agent. None of these reaches your partner's agent unless you turn on sharing it with them. - Unpair at any time from the app's MCP tab (app 1.2.8 and earlier: Settings → Data & AI); the machine can then decrypt nothing new.
- Tool results never contain the private key or the server token.
Where the private key lives
Not in config.json. It is looked for in this order:
- the
VAULTBEAT_PRIVATE_KEYenvironment variable, if set (read, never written back) — for operators injecting it from a secret store; - the system keyring — the normal case on a desktop;
~/.tether/mcp-local/identity.key, mode0600— the automatic fallback on a machine with no keyring.
~/.tether/mcp-local/config.json (mode 0600) holds the cloud-issued server token and your public key. .tether is the app's former name and the path is kept on purpose: existing installs find their key through it.
Never delete
config.jsonto "start clean". The private key is not in it, so deleting does not clear a bad key — it mints a new identity, and every record already encrypted for the old one becomes permanently unreadable. To repair a pairing, runbindagain: it re-pairs this machine in place and keeps what is already encrypted for it.
Headless servers. If the keyring is unreachable, let the identity.key fallback handle it — it engages by itself. Do not set PYTHON_KEYRING_BACKEND to the null backend: it accepts writes and stores nothing, so it only hides a keyring you might be able to reach. If a D-Bus session exists but this process cannot see it (common when the server is started by an agent framework, systemd or cron), pass DBUS_SESSION_BUS_ADDRESS through explicitly — resolve it first (echo "unix:path=/run/user/$(id -u)/bus") and put the literal result in the client's env block, since that block is JSON, not a shell.
Telemetry
The server sends usage events to PostHog (EU): which tool was called, whether it succeeded,
a duration range, and the AI client and package versions — tied to the account this machine is
paired to. Tool arguments, results and health data are never sent. Set VAULTBEAT_TELEMETRY=0
(or DO_NOT_TRACK=1) to turn it off. Details: vaultbeat.app/privacy.
Troubleshooting
Start with doctor. uvx vaultbeat-apple-health@latest doctor prints an [OK] / [FAIL] list with a fix for the first thing that is broken; doctor --json is the same report for an agent. Exit code 0 means healthy.
A read comes back short or empty. Read coverage.more_available first: true means your limit was the boundary — ask for more. false with a short history is the plan boundary described under Requirements, or a pairing that is still filling in. vaultbeat_doctor lists the kinds with no data and the possible reasons for each.
The QR code looks wrong (mojibake or uneven rows — usually Windows with a non-UTF-8 code page). The pairing is still waiting, so do not re-run bind: that replaces the code on screen. Instead render the JSON payload printed just above the code as an image (qrencode -o pair.png '<payload>'), send it to your phone and use import from Photos in the app's scanner; or run chcp 65001 in a fresh terminal; or use bind --no-qr for the payload as text.
Reads fail with an access message. The trial or Pro membership has lapsed. Nothing has been deleted; buying Pro in the iOS app (Settings → Membership) resumes this machine without re-pairing.
HTTP transport
For clients that connect over a network instead of launching a subprocess:
The token is read from VAULTBEAT_MCP_HTTP_TOKEN (preferred, keeps it out of shell history) or the stored config, and clients send it as Authorization: Bearer <token>. --show-token prints the stored one. --no-token serves loopback without auth.
Binding beyond loopback (--host 0.0.0.0 for a LAN or VPS) fails closed: it needs both a token and --allow-remote. The token crosses the wire in clear text, so put TLS in front of it (Caddy, nginx, Cloudflare). Other flags: --sse-response for SSE-style responses, --stateful-http for clients that need sessions.
Example mcp.json (VS Code / Cursor style):
A client that only speaks stdio can reach the HTTP server through mcp-remote: npx -y mcp-remote http://127.0.0.1:8000/mcp --header "Authorization: Bearer <token>".
Reporting issues
This repo takes issues for both the MCP server and the Vaultbeat iPhone app —
install failures, tool errors, binding that never completes, doctor reporting
something wrong, and app problems too (UI, subscriptions, HealthKit permission
prompts, sync not showing up on the phone).
Open an issue
and pick the template that fits. Questions and ideas can go in
Discussions.
This is a public repo: never paste health data, pairing codes or account details.
Development
The command line has six subcommands, and none of them reads health data:
Decrypted records are cached per data type under ~/.tether/mcp-local/cache/ (files 0600, directory 0700) for 600 seconds; VAULTBEAT_MCP_CACHE_TTL overrides it (0 disables). After the first read, a refresh downloads only the records that changed. Pairing to a different server identity clears the cache.
Run the checks from a clone:
vaultbeat-mcp and vaultbeat-mcp-local remain as console-script aliases for installs from before the package was renamed vaultbeat-apple-health (0.6.2).
Source: README.md at commit f44b212
Tools
0Version history
1- v0.4.5LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts