Query your Apple Health data from your own Supabase/Postgres via local MCP.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
Ask your AI about your sleep, HRV, recovery, and fitness β in plain language.
Free iOS app Β· Your own database Β· Works with any MCP client
Download health4ai on the App Store
Apple Health holds years of your biometric data β sleep stages, HRV, heart rate, workouts, VOβ max, and 150+ other metrics. health4.ai makes all of it queryable from Claude, ChatGPT, Cursor, Ollama, or any MCP-compatible client through purpose-built MCP tools.
You control the data. It syncs to a Supabase project you create and own. health4.ai runs no backend and never stores or has access to your health data.
| Problem | health4.ai fix |
|---|---|
| Apple has no HealthKit server API β all access requires an on-device app | Native iOS app with HKObserverQuery + BGTaskScheduler background sync |
| Health Auto Export only works on the same WiFi | Your data lands in Postgres β queryable from any AI, anywhere |
| The claude.ai Apple Health connector doesn't reach Claude Code CLI or Cursor | Standard MCP (stdio) β one config block works everywhere |
| Most solutions require a managed cloud service | Bring your own Supabase project β health4ai runs no server |
Demo video coming. Here's what a typical conversation looks like:
health4ai needs a Supabase project you own. The app signs in with Supabase Auth and writes through a Supabase Edge Function, so plain Postgres (Neon, a local Docker container) is not a supported backend. Full walkthrough: docs/SETUP.md.
1. Create the schema. Create a project at supabase.com, open its SQL editor, and run web/public/schema.sql (also at https://health4.ai/schema.sql). It is generated from supabase/bootstrap/: tables, row-level security, and grants that deny clients direct access. Do not use supabase db push β the numbered migrations do not apply to a fresh project.
2. Deploy the ingest function (needs the Supabase CLI):
--no-verify-jwt is deliberate: the function verifies the signed-in user's token itself and writes only under that user's ID.
3. Create your user. In the dashboard, Authentication β Users β add a user, and copy its UID. The app signs in; it does not sign up.
Then set up the MCP server (from the same checkout):
Edit mcp-server/.env:
Add to your AI client:
Same block β ~/.cursor/mcp.json
Pair with mcphost or mcp-client-for-ollama:
The model runs on your hardware and the MCP server runs locally; your health data is read from your own Supabase project.
Install the iOS app from the App Store, then connect it to that Supabase project (Project URL + anon key), sign in as the user you created, and tap Start Sync. For a TestFlight beta build, follow the tester-isolation guide; never use another person's backend or credentials.
| Tool | What it answers |
|---|---|
get_health_summary | Overview of key metrics for the past N days |
get_sleep | Per-night sleep breakdown with REM, Deep, Core stages. One source per night: Oura > Apple Watch > Whoop > Garmin > Withings > whichever other source (iPhone included) has the most stage records |
get_hrv_trend | Daily HRV (SDNN) with rolling comparison and trend |
get_daily_snapshot | Everything recorded for a specific date |
get_workouts | Recent workouts with type, duration, distance, calories |
query_metric | Raw time-series for any HealthKit metric type |
get_long_term_trend | Monthly aggregates over years (raw + summary tiers) |
get_coaching_brief | Recovery status, sleep quality (same one-source-per-night rule as get_sleep), training load, fitness markers |
search_records | Find days where a metric crossed a threshold |
get_metric_stats | Personal baseline: min/max/mean/percentiles |
compare_periods | Compare a metric between two date ranges |
data_status before believing itiOS never tells an app that a Health permission was denied. A type you have not
shared returns an empty result, byte-for-byte identical to a day where you genuinely
did nothing. Nothing in HealthKit's API can distinguish the two, so an assistant reading
a bare 0 will confidently tell you that you took no steps.
Tools that can return an empty result therefore attach a data_status block:
never_recorded β this metric has never produced a sample for you. For steps,
heart rate, active energy or walking distance that is not possible if the data were
being shared, so it almost certainly is not. Open Health β Sharing β Apps β
health4ai, switch the metric on, then re-run the import from the app's Home tab.empty_window β nothing in the window you asked about, but the metric has data at
other times. A real gap, not a permission problem.This is not hypothetical. On the author's own account, step count, heart rate, active energy and walking distance were silently unshared for nearly three months while every other metric synced normally, and the app displayed a green "Complete" throughout.
Data tiers: queries within the last 30 days return raw samples. Older days use a pre-aggregated row from healthkit_daily_summaries where one exists and are otherwise aggregated per day inside Postgres from the raw samples, so results are complete whether or not the summariser has ever run on your project (on a fresh self-hosted project it never has). Responses carry a tier block saying how many days each tier served. Calendar days follow HEALTH4AI_TZ (default UTC; set it in mcp-server/.env).
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/health4ai)<a href="https://allmcps.com/mcp/health4ai"><img src="https://allmcps.com/api/badge/health4ai?style=directory" alt="Health4ai on AllMCPs" /></a>