DEV Community

Philip D'Souza
Philip D'Souza

Posted on

One MCP server, eight AI clients: Apple Health setup that works everywhere

Most Apple Health MCP guides are per-client. Claude today, Cursor tomorrow, ChatGPT next week. That's the wrong abstraction. MCP is a protocol. The server command is identical across every client. Only the config file path and JSON shape change.

What the server exposes

Eight read-only tools, all local:

Tool What it returns
get_mcp_status Health check: data source, metric count, most recent data date
list_metrics Every available metric with unit, day count, date range
get_health_metrics Values for a metric over a date range with aggregation
get_trends Compare recent N-day window against prior N
compare_periods A/B two arbitrary date windows for a single metric
get_structured_export Clean structured JSON, paginated
get_intraday Hour-by-hour window, live within-day view
query_health_data Natural-language convenience query

190 Apple Health metrics. 84 kB npm package. Zero dependencies. Zero network calls.

The config that works everywhere

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "health-export": {
      "command": "node",
      "args": ["/Users/you/.health-export-mcp/server.mjs"],
      "env": {
        "HEALTH_DATA_DIR": "/Users/you/Library/Mobile Documents/iCloud~ai~healthexport~app/Documents"
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Cursor uses the same shape at ~/.cursor/mcp.json. Windsurf uses it at ~/.codeium/windsurf/mcp_config.json. ChatGPT Desktop takes the inner block in Settings > MCP Servers. Codex CLI reads .mcp.json. opencode uses mcp + environment + array command instead of mcpServers + env.

The server command never changes. Only the file path does.

Real queries

You: What is my HRV trend over the last 14 days?
Agent: [calls get_trends] Your HRV averaged 58 ms, up 5.5% vs prior 14 days.

You: Compare my sleep this week to last week.
Agent: [calls compare_periods] Deep sleep up 17%, total sleep up 6%.

You: How does my RHR change on days I sleep less than 6 hours?
Agent: [calls query_health_data] RHR averages 58 bpm after <6h sleep, 53 bpm after >7h.
Enter fullscreen mode Exit fullscreen mode

No CSV, no copy-paste, no screenshots. Live data from your iPhone, answered locally.

Full config blocks for all eight clients, troubleshooting, and FAQ: complete guide on healthexport.dev

Top comments (0)