This is an MCP server to chat with Apple Health data. I built it because I'm working on (yet another) personal trainer tool that keeps track of my workout goals, etc. and does scheduling for me. Part of that is weekly check-ins. I thought pairing those check-ins with sensor data could be useful, so here we are.
It seems there isn't a way to automate access to Apple Health data, so this relies on an iOS app that can quickly/easily export key data to CSV. So the process at the moment is to export the data every Sunday before doing a check-in. More steps than I'd like, but in practice isn't a big lift.
Under the hood this is mostly a thin wrapper around duckdb.
There's a video of it in action here: https://x.com/realtron/status/1947710791521591514
This was quite straightforward once you understand the permissions. I wonder why the OP didn’t do this and was instead using a simple health export CSV?
The main concern I had with releasing this or turning it into a tool was data security.
I have been swimming 1500m x 365 days of the year for the last 7 years. My use case was to build a personalised dashboard for my daily swimming and heart rate data to track detailed progress beyond what Apple offers. Having the ability to query this data with AI could be quite useful, rather than relying on manual reports.
But I'd like to revisit it because it would be a natural fit to just put the personal trainer flow directly in an app.
I would like to go back to this though and add it as an integration option.
I mean, it's been vetted by Apple, right? If they did their job then it should be fine. This isn't the Play Store you're dealing with; it's the App Store. I kinda dig the "simple utility app that does one job well" format, tbh.
We have a REST API with python client lib (https://fulcradynamics.github.io/developer-docs/), an MCP server (https://fulcradynamics.github.io/developer-docs/mcp-server/), and did some experiments with ChatGPT actions as well (https://www.fulcradynamics.com/chatgpt).
It doesn't have the simplicity of a plain export to duckdb/sqlite, but it definitely helps solve a lot of the sharing/collaboration problems.
My general belief around data agents is to offload as much as possible to SQL.
Would love to chip in on the discussion around this topic.
For getting Apple Health data into duckdb, I’ve used this in the past: https://github.com/dogsheep/healthkit-to-sqlite. (You can load the SQLite database directly in duckdb.)
@_neil, any reason not to use this instead? duckdb over a .db file is a more straightforward approach
I think supporting the native Apple Health export feature would be a good idea. It just takes longer than the CSV export, so I started there. I would imagine the native export has more data, though, which might be nice.
People use it to track sensitive information, like reproductive and mental health data, that should only be exported very intentionally.
I haven't experimented with MCP too much because I have some reservations about it, but I decided to go MCP-first for this to see how it feels to prototype around it. My typical flow would have been to go sqlite+sveltekit.
if RubyLLM.with_tools(...).ask("Do my health metrics indicate I am stressed?") model = 'claude-4-opus' else model = 'claude-4-sonnet' end
I have a proof of concept here that turns the Apple Health export xml file into a timeseries .parquet that you can then load into clickhouse or duckdb.
https://github.com/atlaslib/atlas
I love the use of a notebook as an updating dashboard here. One of my demos before this MCP server was an evidence.dev dashboard.