<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Philip D'Souza</title>
    <description>The latest articles on DEV Community by Philip D'Souza (@philipad).</description>
    <link>https://dev.to/philipad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048242%2Fe490c7ae-56a7-462a-aa6d-f544d6bb9cdb.jpg</url>
      <title>DEV Community: Philip D'Souza</title>
      <link>https://dev.to/philipad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/philipad"/>
    <language>en</language>
    <item>
      <title>Connect Apple Health to Claude via MCP, the Exact Config</title>
      <dc:creator>Philip D'Souza</dc:creator>
      <pubDate>Sat, 08 Aug 2026 12:54:30 +0000</pubDate>
      <link>https://dev.to/philipad/connect-apple-health-to-claude-via-mcp-the-exact-config-4ilf</link>
      <guid>https://dev.to/philipad/connect-apple-health-to-claude-via-mcp-the-exact-config-4ilf</guid>
      <description>&lt;p&gt;Claude can reason about your sleep, HRV, and training load. What it cannot do out of the box is reach your Apple Health data. It cannot open the Health app, and pasting a giant CSV into a chat window is a dead end: the units get mangled, the snapshot is stale the moment you export it.&lt;/p&gt;

&lt;p&gt;The fix is MCP, the Model Context Protocol. With a small local server, Claude calls read-only tools against your real Apple Health data whenever you ask a question. This is the exact setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The seven read-only tools
&lt;/h2&gt;

&lt;p&gt;The Health Export AI MCP server is zero-dependency Node. No Docker, no Python environment, no cloud bridge. It exposes seven tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_mcp_status&lt;/code&gt; confirms the server can see your data&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_metrics&lt;/code&gt; lists which of the 190 metrics are available&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_health_metrics&lt;/code&gt; pulls raw values for a metric and date range&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_trends&lt;/code&gt; week-over-week or month-over-month trend math&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;compare_periods&lt;/code&gt; A/B two time windows (this week vs last)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_structured_export&lt;/code&gt; a tidy structured bundle for deeper analysis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;query_health_data&lt;/code&gt; flexible plain-language queries across metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The data never leaves your control. The iOS app reads Apple Health read-only and writes a JSON file to a folder you pick. The MCP server reads that folder. Nothing transits the developer's servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Claude Desktop config
&lt;/h2&gt;

&lt;p&gt;Two routes. The one-click &lt;code&gt;.mcpb&lt;/code&gt; bundle: download &lt;code&gt;health-export.mcpb&lt;/code&gt;, double-click it, Claude Desktop prompts you for the data folder, confirm, restart.&lt;/p&gt;

&lt;p&gt;Or edit &lt;code&gt;claude_desktop_config.json&lt;/code&gt; by hand and merge a &lt;code&gt;health-export&lt;/code&gt; entry into &lt;code&gt;mcpServers&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"health-export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/Users/you/.health-export-mcp/server.mjs"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"HEALTH_DATA_DIR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/you/Library/Mobile Documents/iCloud~ai~healthexport~app/Documents"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap in your real &lt;code&gt;SERVER_PATH&lt;/code&gt; and &lt;code&gt;HEALTH_DATA_DIR&lt;/code&gt;. Fully quit and reopen Claude Desktop, it only reads the config at launch. Verify by asking: "Use the health-export tools to call get_mcp_status."&lt;/p&gt;

&lt;h2&gt;
  
  
  The same setup for Cursor, opencode, OpenClaw
&lt;/h2&gt;

&lt;p&gt;The server never changes, only where each client wants its config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; uses the same &lt;code&gt;mcpServers&lt;/code&gt; shape as Claude Desktop. Drop the identical block into &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;opencode&lt;/strong&gt; uses a different shape. The top key is &lt;code&gt;mcp&lt;/code&gt;, &lt;code&gt;command&lt;/code&gt; is an array, and the env key is &lt;code&gt;environment&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://opencode.ai/config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"health-export"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/you/.health-export-mcp/server.mjs"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"HEALTH_DATA_DIR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/you/Library/Mobile Documents/iCloud~ai~healthexport~app/Documents"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; consumes standard MCP servers; add a &lt;code&gt;health-export&lt;/code&gt; block using the same &lt;code&gt;node server.mjs&lt;/code&gt; command and &lt;code&gt;HEALTH_DATA_DIR&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Once connected, you talk to Claude normally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: How did my recovery trend this week compared to last week?
      Use my Health Export data.

Claude: [calls get_trends, then compare_periods]
        Your HRV averaged 61 ms this week, up 4.4% from 58 ms last week.
        Resting heart rate dropped from 56 to 55 bpm. Sleep held at 7.1 h.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No CSV, no pasting, no stale snapshot. Live numbers from your local export.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude shows no health-export tools:&lt;/strong&gt; the config was not loaded. Confirm the JSON is valid, you edited the right file for your OS, and you fully quit and relaunched Claude Desktop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server connects but says no data:&lt;/strong&gt; your &lt;code&gt;HEALTH_DATA_DIR&lt;/code&gt; points at the wrong folder, or the export has not synced the &lt;code&gt;.health-cache.json&lt;/code&gt; file yet. Check export is on in the iOS app, iCloud Drive has finished syncing, and the path matches with &lt;code&gt;~&lt;/code&gt; expanded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong env key for your client:&lt;/strong&gt; Claude Desktop, Claude Code, and Cursor use &lt;code&gt;mcpServers&lt;/code&gt; with &lt;code&gt;env&lt;/code&gt;. opencode and OpenClaw use &lt;code&gt;mcp&lt;/code&gt; with &lt;code&gt;environment&lt;/code&gt; and an array-style &lt;code&gt;command&lt;/code&gt;. Putting &lt;code&gt;env&lt;/code&gt; into an opencode file silently does nothing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a summary. The complete guide with the full troubleshooting section, the Claude Code CLI setup, and the Hermes notes is on the original post: &lt;a href="https://www.healthexport.dev/blog/connect-apple-health-to-claude-mcp?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=exp-20260808-hea55-claudemcp" rel="noopener noreferrer"&gt;Connect Apple Health to Claude via MCP&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>mcp</category>
      <category>apple</category>
      <category>ai</category>
    </item>
    <item>
      <title>Fix Apple Health export.xml Parse Errors: the iOS 16+ guide</title>
      <dc:creator>Philip D'Souza</dc:creator>
      <pubDate>Sat, 08 Aug 2026 02:48:00 +0000</pubDate>
      <link>https://dev.to/philipad/fix-apple-health-exportxml-parse-errors-the-ios-16-guide-37gb</link>
      <guid>https://dev.to/philipad/fix-apple-health-exportxml-parse-errors-the-ios-16-guide-37gb</guid>
      <description>&lt;p&gt;Since iOS 16 (HealthKit Export Version 12), Apple's &lt;code&gt;export.xml&lt;/code&gt; has shipped with malformed DTD declarations. The file includes incomplete &lt;code&gt;tags without matching&lt;/code&gt; declarations, so every standards-compliant XML parser fails before it reaches your data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The error you see
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ATTLIST: no name for Attribute [68]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ElementTree&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ParseError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;syntax&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;156&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;xmllint&lt;/code&gt;, R's &lt;code&gt;XML&lt;/code&gt; package, Go's &lt;code&gt;encoding/xml&lt;/code&gt;, they all fail on the same root cause. The file can be 1.7 GB or larger, and the DTD error sits in the first 200 lines. You never reach the actual health records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Root cause
&lt;/h2&gt;

&lt;p&gt;Apple ships a malformed DTD fragment on large exports. It is not your parser, and it is not your data. The &lt;code&gt;RightEye EMPTY&lt;/code&gt; element and a handful of others are declared without their &lt;code&gt;ATTLIST&lt;/code&gt; companion, which violates the XML spec.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fixes that work
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Works on &amp;gt;1.7GB&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strip the DOCTYPE&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sed&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-process with Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lxml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tolerant parser&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lxmlrecover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dedicated conversion tool&lt;/td&gt;
&lt;td&gt;Health Export AI&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Fastest:&lt;/strong&gt; strip the DOCTYPE declaration entirely. The DTD is not needed to parse the HealthKit record elements, so removing it lets any parser proceed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permanent:&lt;/strong&gt; skip &lt;code&gt;export.xml&lt;/code&gt; and read HealthKit directly via a native HealthKit export. That avoids the DTD bug and the multi-gigabyte file problem, and gives you clean JSON instead of a broken XML blob.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about AI agents?
&lt;/h2&gt;

&lt;p&gt;If you want Claude, Cursor, or ChatGPT to query your Apple Health data, feeding them a broken 1.7 GB &lt;code&gt;export.xml&lt;/code&gt; is the hard path. A native MCP bridge reads the on-device HealthKit cache directly, so the agent gets structured metrics (HRV, sleep, workouts, 190 types) without touching &lt;code&gt;export.xml&lt;/code&gt; at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is my export corrupted?&lt;/strong&gt; No. The health data is intact. Only the DTD preamble is malformed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will Apple fix it?&lt;/strong&gt; The bug has persisted across iOS 16, 17, 18, and 19. Do not wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I just delete the bad lines?&lt;/strong&gt; Yes, stripping the DOCTYPE block (roughly the first 200 lines) is the most reliable fix and loses zero data.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a summary. The complete guide with code snippets and the full comparison table is on the original post: [Fix Apple Health export.xml Parse Errors, the Complete Guide](&lt;a href="https://dub.sh/oGKpzGL" rel="noopener noreferrer"&gt;https://dub.sh/oGKpzGL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Best Apple Health MCP Servers Compared 2026: Zero-Dep vs DuckDB vs Health Auto Export</title>
      <dc:creator>Philip D'Souza</dc:creator>
      <pubDate>Thu, 06 Aug 2026 15:40:00 +0000</pubDate>
      <link>https://dev.to/philipad/best-apple-health-mcp-servers-compared-2026-zero-dep-vs-duckdb-vs-health-auto-export-21o9</link>
      <guid>https://dev.to/philipad/best-apple-health-mcp-servers-compared-2026-zero-dep-vs-duckdb-vs-health-auto-export-21o9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on [healthexport.dev](&lt;a href="https://dub.sh/m4x3o6y" rel="noopener noreferrer"&gt;https://dub.sh/m4x3o6y&lt;/a&gt; Canonical link below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are now four MCP servers that give AI agents access to Apple Health data. Here is how they compare on setup time, runtime, dependencies, and privacy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four servers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;health-export-mcp&lt;/strong&gt; is a zero-dependency Node.js server with a companion iOS app. The app auto-syncs 190 HealthKit metrics as clean JSON to iCloud. You point the MCP server at that folder. No Docker, no Python, no manual XML export. Setup is about 2 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the-momentum&lt;/strong&gt; (244 GitHub stars) parses Apple's &lt;code&gt;export.xml&lt;/code&gt; into DuckDB and exposes NL-to-SQL tooling. It needs Docker or &lt;code&gt;uv&lt;/code&gt; plus Python plus DuckDB. Strong for raw SQL, but the original server is in maintenance mode now that the team pivoted to Open Wearables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Health Auto Export&lt;/strong&gt; (321 App Store ratings) runs a TCP bridge from a mobile app instead of stdio. Works, but TCP means port management and no stdio compat with most MCP clients out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;neiltron&lt;/strong&gt; (42k weekly npm downloads) is the newest. Same DuckDB paradigm as the-momentum but packaged as an npm module. Still needs the manual &lt;code&gt;export.xml&lt;/code&gt; export and transfer. 3 query tools, smaller community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;health-export-mcp&lt;/th&gt;
&lt;th&gt;the-momentum&lt;/th&gt;
&lt;th&gt;Health Auto Export&lt;/th&gt;
&lt;th&gt;neiltron&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Node.js (zero-dep)&lt;/td&gt;
&lt;td&gt;Python + Docker / uv&lt;/td&gt;
&lt;td&gt;Mobile app + TCP&lt;/td&gt;
&lt;td&gt;Node + DuckDB (npm)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies&lt;/td&gt;
&lt;td&gt;None beyond Node&lt;/td&gt;
&lt;td&gt;Docker, Python, DuckDB&lt;/td&gt;
&lt;td&gt;Mobile app on iPhone&lt;/td&gt;
&lt;td&gt;DuckDB WASM via npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data source&lt;/td&gt;
&lt;td&gt;Auto-synced JSON from iOS&lt;/td&gt;
&lt;td&gt;Manual export.xml to DuckDB&lt;/td&gt;
&lt;td&gt;App SQLite to TCP&lt;/td&gt;
&lt;td&gt;Manual export.xml to DuckDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;~2 minutes&lt;/td&gt;
&lt;td&gt;~15 minutes&lt;/td&gt;
&lt;td&gt;~8 minutes&lt;/td&gt;
&lt;td&gt;~10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data freshness&lt;/td&gt;
&lt;td&gt;Auto-sync (background)&lt;/td&gt;
&lt;td&gt;Manual re-export&lt;/td&gt;
&lt;td&gt;On-demand or scheduled&lt;/td&gt;
&lt;td&gt;Manual re-export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP transport&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;td&gt;TCP socket&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tools exposed&lt;/td&gt;
&lt;td&gt;7 deterministic tools&lt;/td&gt;
&lt;td&gt;NL-to-SQL + DuckDB&lt;/td&gt;
&lt;td&gt;5 query tools&lt;/td&gt;
&lt;td&gt;3 query tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS companion app&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-device AI chat&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Proprietary&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The honest take
&lt;/h2&gt;

&lt;p&gt;The DuckDB route is the right call if you already run DuckDB and want SQL over your data. For everyone else, the dependency cost is steep just to get your steps into Claude or Cursor. Two minutes and zero installs is a better default for the person who just wants to ask their agent about their sleep.&lt;/p&gt;

&lt;p&gt;All four run locally. None sends health data to a cloud. The practical difference is friction: one auto-syncs from your phone, the other three need a manual &lt;code&gt;export.xml&lt;/code&gt; export and transfer every time you want fresh data.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How many Apple Health MCP servers are there in 2026?&lt;/strong&gt; Four, plus healthsync (Go/SQLite) which does not implement MCP natively but can be wrapped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which is easiest to set up?&lt;/strong&gt; health-export-mcp. Install the iOS app, grant HealthKit access, turn on iCloud sync, then &lt;code&gt;npx health-export-mcp&lt;/code&gt;. No Docker, no Python, no manual XML export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which has zero dependencies?&lt;/strong&gt; Only health-export-mcp. The others need DuckDB (the-momentum, neiltron), Python/Docker (the-momentum), or a mobile app TCP setup (Health Auto Export).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does any server auto-sync?&lt;/strong&gt; Only health-export-mcp. The companion iOS app reads HealthKit on a schedule and writes fresh JSON. The other three require a manual re-export of &lt;code&gt;export.xml&lt;/code&gt; for fresh data.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a syndicated summary. [Read the full comparison with the FAQ and the data-model breakdown on healthexport.dev](&lt;a href="https://dub.sh/m4x3o6y" rel="noopener noreferrer"&gt;https://dub.sh/m4x3o6y&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
