apple-health-coverage-mcp
Provides coverage-aware analysis of Apple Health data, distinguishing observed values from placeholder zeros and evaluating Watch availability for metrics like exercise minutes and step count.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@apple-health-coverage-mcpcheck coverage for yesterday"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Apple Health Coverage MCP
A local, read-only MCP semantic layer that prevents Apple Watch non-wear, discharged-device gaps, delayed sync, and exporter placeholder zeros from silently corrupting health trends.
Missing observations are unknown, not zero. A zero is valid only when the metric was actually observable.
This project does not diagnose health conditions and does not claim to know whether a missing Watch interval was caused by non-wear, a depleted battery, or another device problem.
Problem
Many Apple Health pipelines produce daily rows even when the Watch was not collecting data. Empty fields or generated zeroes can then make activity, recovery, sleep, and custom health axes look worse than they were.
Apple Health Coverage MCP separates two questions:
What value was observed?
Was that metric observable well enough to interpret the value?
It classifies coverage before calculating a trend and refuses to interpret periods below a configurable coverage threshold.
Related MCP server: Apple Health Shortcuts MCP
Current scope
The current release consumes a normalized daily JSON file. It includes a deterministic synthetic fixture and no personal health data.
Implemented:
Full, partial, unavailable, pending-sync, and unknown coverage states
Independent Watch-availability evidence
Distinction between observed zero and placeholder zero
Metric-specific Watch dependence
Phone-backed metrics such as steps
Coverage-aware trend thresholds
Late-arriving/backfilled daily upserts
MCP
structuredContentplus text fallbackRead-only/idempotent/closed-world MCP annotations
Planned adapters:
MetricBridge /
health-export-mcpApple Health
export.xmlHealthKite-style live iPhone bridge
Versioned custom health-axis definitions
Coverage states
State | Meaning | Trend behavior |
| At least 18 hours of skin-contact evidence | Eligible |
| Some Watch evidence, but not a full day | Eligible only when metric rules permit |
| Phone activity exists but Watch skin-contact evidence does not | Watch-required values excluded |
| Recent samples may still arrive | Temporarily excluded |
| Neither Watch nor phone provides enough evidence | Excluded |
likely_watch_unavailable deliberately returns multiple possible reasons and claimedCause: null.
Metric semantics
Every metric declares its own rules:
{
"exercise_minutes": {
"unit": "min",
"measurementMode": "cumulative_event",
"zeroSemantics": "valid_if_observable",
"wearDependence": "wearable_required"
},
"step_count": {
"unit": "count",
"measurementMode": "cumulative_event",
"zeroSemantics": "valid_if_observable",
"wearDependence": "wearable_preferred"
}
}An exporter-provided exercise_minutes: 0 is excluded when Watch coverage is unavailable. A real zero from an observed day remains in the average. Phone-backed step_count can remain usable when the Watch is absent.
MCP tools
health_coverage_day— explain one day's observation coveragehealth_coverage_range— inspect coverage across dateshealth_metric_catalog— discover metric-specific observability ruleshealth_metric_trend— calculate only coverage-supported trendshealth_data_quality— summarize coverage before interpretation
All tools are local, read-only, idempotent, and closed-world.
Run the synthetic demo
Requires Node.js 22 or newer.
npm test
npm run check
npm run demoThe demo queries health_data_quality through the real JSON-RPC stdio server using examples/synthetic-health.json.
MCP client configuration
Use an absolute path:
{
"mcpServers": {
"apple-health-coverage": {
"command": "node",
"args": [
"/absolute/path/apple-health-coverage-mcp/src/server.js",
"--data",
"/absolute/path/apple-health-coverage-mcp/examples/synthetic-health.json"
]
}
}
}For personal data, replace the synthetic fixture with a normalized adapter output stored outside the Git repository.
Normalized input
{
"schemaVersion": "wear-health/v1",
"metricDefinitions": {},
"days": [
{
"date": "2026-08-18",
"ingestedAt": "2026-08-19T08:00:00Z",
"coverageSignals": {
"skinContactHours": 0,
"heartRateSamples": 0,
"phoneActivityPresent": true,
"watchSeenOnAdjacentDays": true,
"syncState": "complete"
},
"metrics": {
"exercise_minutes": 0,
"step_count": 3200
}
}
]
}That example classifies the Watch as likely unavailable. The exercise zero is excluded as a likely placeholder, while phone-backed steps remain usable.
Backfill model
HealthKit records may arrive or change after a previous analysis. upsertDays:
Uses date as the daily identity
Keeps the newer ingestion
Merges newly available metrics
Marks the record
backfilledPreserves the previous coverage classification
Derived trends and future health axes should always be recomputed after an upsert.
Privacy
The server opens no network connection.
MCP tool output still goes to whichever AI model your client uses.
Personal exports, databases, ZIP files, and generated CSVs are gitignored.
Never commit Apple Health exports or real derived datasets.
Prefer aggregate queries or a local model for sensitive data.
Development
The implementation uses Node's standard library and native test runner.
npm test
npm run checkTests use synthetic records and cover observed zeroes, placeholder zeroes, partial wear, Watch unavailability, pending sync, unknown days, low-coverage trend refusal, phone fallback, and backfill.
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceExposes health metrics (activity, blood pressure, glucose, heart rate, sleep, SpO2) from the Sapphire Wellness App to AI assistants via the Model Context Protocol.
- AlicenseNot gradedqualityCmaintenanceExposes Apple Health data as read-only tools for AI via HTTP MCP. Provides three tools: health_now, health_detail, and health_trends.MIT
- AlicenseNot gradedqualityCmaintenanceExposes Apple Health data as three read-only MCP tools (current status, details, trends) via a Cloudflare Worker, enabling AI assistants to view health metrics without modification.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI to query Apple Health data through three read-only tools: current status, detailed sleep/metrics, and trends over 7/14/30 days. It deploys to Cloudflare quickly, keeping health data private and access-controlled.MIT
Related MCP Connectors
63 tools for Apple Health, Fitbit, Oura & Health Connect data in Claude, ChatGPT, Grok & Mistral.
Training analytics over your Hevy log: e1RM, PRs, volume, consistency, bodyweight.
Glucose readings from your LibreLink Up sensor: graph, logbook, stats and summaries (read-only). Sec
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mayank-youdata/apple-health-coverage-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server