Health Export AI
This server lets AI agents query Apple Health data (190+ metrics) via natural language or structured tool calls, returning trends, comparisons, and structured JSON exports. It operates locally with no external dependencies, ensuring privacy and read-only access.
Check status (
get_mcp_status): Verify the bridge is connected; see data source, metric/workout counts, and latest data date. Recommended as a first call.Discover metrics (
list_metrics): Browse all available Apple Health metrics with units, day counts, and date ranges.Retrieve daily data (
get_health_metrics): Fetch daily values for a specific metric (e.g.step_count,hrv,sleep_analysis) or all metrics over a date range, with aggregation options (avg, sum, min, max, latest).Analyze trends (
get_trends): Compare a recent N-day window vs. the prior N days — returns change, percent change, and direction (up/down/flat).Compare periods (
compare_periods): Pit two arbitrary date ranges (Period A vs. B) against each other for a metric, returning aggregates and the delta.Export structured JSON (
get_structured_export): Get clean JSON for selected metrics and a date range, ready for an agent's context window or a notebook.Natural-language queries (
query_health_data): Ask plain-English questions like "average HRV last month" and receive structured results without needing exact tool parameters.
It integrates natively with MCP-compatible agents (Claude Desktop, Cursor, VS Code, etc.) and supports non-MCP tools (ChatGPT, Gemini, n8n, Home Assistant) via webhook. Data is sourced from the companion "Health Export AI" iOS app, which exports Apple Health data to iCloud, a local folder, or directly to the server.
Allows querying Apple Health data (190 metrics) through natural language, enabling AI agents to analyze personal health metrics.
Reads exported Apple Health data from a Dropbox folder, enabling access from synced files.
Provides MCP tools for Hermes AI agents to query personal health data in natural language.
Allows Home Assistant to receive Apple Health data via webhook for automations and monitoring.
Reads exported Apple Health data from iCloud Drive, providing access to synced health metrics.
Enables n8n workflows to receive Apple Health data via webhook for integration into custom automations.
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., "@Health Export AICompare my HRV this week vs last week"
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.
health-export-mcp, Apple Health MCP server for AI agents
Query your Apple Health data from Claude, ChatGPT, Cursor, OpenClaw, Hermes, and any other AI agent.
health-export-mcp is an open-source, zero-dependency Model Context Protocol (MCP) server that lets any MCP-compatible AI agent query your Apple Health / HealthKit data, 190 metrics as clean JSON, in plain language. Local-first, read-only, no accounts, and no developer server in the path. It's the open-source server for the MetricBridge iOS app, available on the App Store.
Ask your agent: "Compare my HRV this week vs last week and tell me if I'm recovering.", it calls the tools and answers from your actual numbers.
What is health-export-mcp?
It's an MCP server that turns your Apple Health export into a tool your AI agent can query in natural language, HRV, sleep, resting heart rate, steps, workouts, VO₂ max, and 180+ more.
Who it's for: anyone who wants their AI to reason over their real health data instead of a stale CSV.
What it isn't: a cloud service. There's no developer server in the path, your data goes only where you point it.
Setup: point the server at your exported data and add it to your AI client.
Just exported and the Mac has not seen it yet? iCloud can take a few minutes to sync the file across, so a check 60 seconds after tapping Run in the app can still show the old timestamp.
get_mcp_statusreportslastDataDateand the intradaylastWrite, which is the quickest way to tell "still syncing" from "never arrived".
Try it with no iPhone needed:
node server.mjs --demoserves a deterministic synthetic dataset (400 days, workouts, events, sleep sessions) with every answer watermarked as synthetic. Or runnpm testto write a sample cache and exercise every tool.
Related MCP server: Apple Health MCP Server
Connect Apple Health to your AI agent, Quickstart
1. Get your Apple Health data flowing
The companion iOS app MetricBridge exports your Apple Health data, read-only, automatic, private. For this MCP server, export to a destination it can read:
Destination | Notes |
iCloud Drive (default) | Your Mac reads the synced folder automatically |
Local folder | Any folder that syncs to your Mac (Dropbox, Google Drive, OneDrive, …) |
LAN (HTTP / WebSocket) | Direct push to the server, great over Tailscale |
Using a non-MCP tool (ChatGPT, n8n, Home Assistant)? The app can also POST to a webhook those tools read directly, see Works with.
2. Add the server to your agent
Fastest, auto-configure:
git clone https://github.com/PhilipAD/health-export-mcp.git
cd health-export-mcp
node apply-mcp-config.mjs # detects installed clients and writes the config for youManual, Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"health-export": {
"command": "npx",
"args": ["-y", "health-export-mcp"],
"env": { "HEALTH_DATA_DIR": "~/Library/Mobile Documents/iCloud~ai~healthexport~app/Documents" }
}
}
}
npxfetches the published package at run time (npm verifies package integrity), it runs anywhere, no clone or absolute path needed. Prefer to pin a vetted local checkout instead? Use"command": "node", "args": ["REPLACE_WITH_ABSOLUTE_PATH/server.mjs"], get the path withnode -e "console.log(process.cwd()+'/server.mjs')"inside the repo. Or skip JSON entirely, draghealth-export.mcpbinto Claude Desktop → Settings → Extensions.
Cursor / VS Code: node gen-deeplinks.mjs prints one-click install links.
opencode / OpenClaw / Hermes: see AGENTS.md for the exact block, same shape, one per client.
3. Ask your agent
Restart the client and try:
"Use health-export: what's my average HRV this week vs last week?"
Works with Claude, Cursor, ChatGPT, OpenClaw, Hermes
Client / Agent | Integration | How |
Claude Desktop | Native MCP |
|
Cursor | Native MCP | One-click deeplink, or |
opencode | Native MCP |
|
OpenClaw | Native MCP | Add the server block to your MCP config |
Hermes | Native MCP | Add the server block to your agent's MCP config |
VS Code (Copilot / Continue) | Native MCP | One-click deeplink |
ChatGPT · Gemini · Grok | Webhook* | Consume the app's webhook export |
n8n · Home Assistant | Webhook* | Trigger automations on the exported JSON |
*MCP clients query this server directly over stdio. ChatGPT / Gemini / Grok / n8n / Home Assistant don't speak MCP, they consume the same Apple Health data via the iOS app's token-authenticated webhook export.
The 14 MCP tools
Full reference with request/response examples: healthexport.dev/mcp.
Tool | What it does |
| Health check: source, metric/workout counts, which context files exist, latest data date. Call first. |
| Every available metric with unit, day count, and date range. |
| Daily values for a metric (or all) over a date range + an aggregate (avg/sum/min/max/latest). Supports |
| Recent N-day window vs the prior N days: change, % change, direction. Supports |
| A metric across two arbitrary date periods (A vs B), or around a logged event via |
| Clean JSON for chosen metrics/range, paginated with a cursor. |
| Today's hour-by-hour window from the app's hourly automations ( |
| Natural-language convenience: "average HRV last month" routed to structured results. |
| Logged context events (medication, habit, visit, life, shift, episode, travel) with type/tag/date filters. |
| Opted-in context fields (conditions, medications, goals, allergies, notes) plus |
| Workouts by activity/date with pagination; includes heart rate, running dynamics, cycling power, intervals and |
| Clustered sleep sessions attributed to the waking day; split nights returned as-is. |
| Day-in-cycle and coarse phase derived from logged period starts. Never predictive. |
| Pearson correlation between two metrics with a 0..3 day lag. Association, not causation, always stated. |
Coverage: 190 Apple Health metrics across activity, heart, HRV, mobility, respiratory, body, sleep, hearing, and nutrition, plus workouts. Data answers carry honest coverage blocks, and single-metric answers list logged events inside the window as segmentBoundaries so an average across a medication start or life change cannot masquerade as one regime.
Data files
The daily cache (.health-cache.json) and workouts cache are joined by optional context files, all read-only and all optional: health-events.json (the logging surface), health-profile.json (opt-in context), health-sessions.json (sleep sessions), health-cycles.json (observed cycle starts), health-days.json (timezone change log). An absent file is reported as available:false with a note, never as "no data". Formats: docs/SCHEMA-CONTRACTS.md.
Two patterns worth knowing: query a parent's Apple Health from your own AI (consent-first, the parent's phone is the authority) and logging data into Apple Health via Shortcuts (the server and app stay strictly read-only).
MCP prompts
The server ships 22 prompts over prompts/list / prompts/get: daily brief, weekly review, doctor visit prep, what changed since my last visit, sleep quality and regularity, HRV trend, training and race week reviews, zone minutes, n-of-1 experiment, medication before/after, GLP-1 dose-step compare, sobriety milestone, shift block compare, travel-honest monthly review, cycle-aware trend read, caregiver check-in, glucose day summary, long-term activity narrative, data coverage audit, and a profile-aware context bootstrap. Every prompt leads with coverage honesty and never turns data into diagnosis.
Demo mode
node server.mjs --demo (or HEALTH_DEMO=1) serves a deterministic synthetic dataset: ~15 metrics over 400 days, 30 workouts with intervals, 8 events, a profile, 60 sleep sessions, cycle starts and a timezone change, anchored to a fixed date with a seeded PRNG. Every answer carries demo: true and a [SYNTHETIC DEMO DATA] text prefix, so demo output can never pass for a real export.
CLI
node server.mjs --doctor # diagnostics: files, sizes, schema, freshness, pairing
node server.mjs status --max-age 24 # exit 0 if data is fresh, 1 if stale (cron gate)
node server.mjs receive # standalone LAN receiver (binds 127.0.0.1 by default)
node server.mjs --helpExample AI queries
"What has my resting heart rate done over the last 30 days?"
"Compare my deep sleep this week vs last week."
"Is my VO₂ max trending up or down this quarter?"
"Give me a clean JSON export of HRV, RHR and sleep for the last 14 days."
"Correlate my step count with my sleep duration this month."Use cases
AI health coach, let an agent reason over your real HRV, resting heart rate, and sleep to suggest when to push and when to recover, grounded in your actual numbers instead of generic advice.
Training-load analysis, pull workouts, VO₂ max, and heart-rate trends so your agent can flag overreaching, plot fitness progression, and pace a training block.
Sleep correlations, have your agent correlate deep-sleep duration against steps, caffeine, late workouts, or screen time to find what actually moves your sleep quality.
Quantified-self dashboards, feed clean JSON for any metric set and date range straight into a notebook, spreadsheet, or LLM-built dashboard for your own self-tracking.
Personal research & experiments, run n-of-1 experiments (supplement, routine, or protocol changes) and let an agent compare before/after periods across 190 metrics to see what changed.
The app that feeds it
Privacy & security
Read-only. The server only reads your exported data, it never touches HealthKit and never writes back.
Local-first. It runs on your machine over stdio. There is no developer server in the path.
Optional pairing. Set
PAIRING_SECRETto the code the iOS app shows (Settings → Agent pairing) to gate access.Auditable. Zero dependencies and a few hundred lines of readable JavaScript, read every line.
Signed releases. Hosted artifacts are minisign-signed and checksummed, see Verifying releases.
Verifying releases
The server artifacts hosted at healthexport.dev/mcp/ (used by the setup skill) are minisign-signed, and every download is SHA-256 checksummed. The signing public key is published in this repo (minisign.pub) and in SKILL.md, pin it from here, not only from the website, so a compromise of the website alone cannot swap both an artifact and its key.
PUBKEY='RWS6TxVWSKUblYkx7Db6ZpmvHALwHpznZpjaED/FlZj+PpxSlel0MxHZ' # = minisign.pub in this repo
curl -fsSL https://healthexport.dev/mcp/SHA256SUMS -o SHA256SUMS
curl -fsSL https://healthexport.dev/mcp/SHA256SUMS.minisig -o SHA256SUMS.minisig
minisign -Vm SHA256SUMS -P "$PUBKEY" || { echo "signature INVALID, do not run"; exit 1; } # fail closed
curl -fsSL https://healthexport.dev/mcp/server.mjs -o server.mjs
shasum -a 256 --ignore-missing -c SHA256SUMS || { echo "checksum mismatch, do not run"; exit 1; }The pinned, checksum-verified download above is the locked-down path. npx health-export-mcp instead resolves the latest version published to npm at run time (npm provides its own package integrity). Full security overview: https://healthexport.dev/security. Report vulnerabilities to security@healthexport.dev.
Requirements
Node.js ≥ 18 (
node -v).A folder containing a
.health-cache.jsonexported by MetricBridge, or runnpm testto generate a sample one.An MCP-compatible client (Claude Desktop, Cursor, opencode, OpenClaw, Hermes, VS Code), or any tool that can read the webhook export.
FAQ
How do I get my Apple Health data into Claude / ChatGPT / my AI agent?
Install health-export-mcp, export your Apple Health data with the MetricBridge iOS app (to iCloud, a folder, or your LAN), then add the MCP server to your AI client. Your agent can then query your Apple Health metrics in natural language. (Non-MCP tools like ChatGPT read the app's webhook export instead.)
Is my health data sent to a server? Not to us. The MCP server runs locally and reads only the export files or endpoints you configure, there's no developer server in the path. Where your iOS export is delivered (iCloud, your LAN, a webhook) is entirely your choice.
Which agents are supported? Any MCP client, Claude Desktop, Cursor, opencode, OpenClaw, Hermes, VS Code, natively. ChatGPT, Gemini, Grok, n8n, and Home Assistant consume the same data via webhook.
Do I need the iOS app?
The app is the easiest way to get Apple Health data off your iPhone in the format this server reads. You can also point HEALTH_DATA_DIR at any folder containing a compatible .health-cache.json.
Troubleshooting
"No metrics found", confirm
HEALTH_DATA_DIRpoints at the folder containing.health-cache.json, and that the app has exported at least once. Runget_mcp_statusto see the resolved source and latest date.Server not visible in the client, use an absolute path to
server.mjs, ensure Node ≥18, and fully restart the client.Locked data error, the export file is protected until first unlock after reboot; unlock your device once.
Run it locally
# Node ≥18, no install needed
HEALTH_DATA_DIR=~/Library/Mobile\ Documents/iCloud~ai~healthexport~app/Documents node server.mjs
# integration test, writes a 14-day sample cache and exercises every tool
npm teststdio transport (newline-delimited JSON-RPC 2.0), the universal MCP transport. Optionally set HEALTH_LISTEN=1 to also accept LAN pushes from the iOS app in the same process (see receiver.mjs).
How it works
The iOS app reads Apple Health (read-only) and writes a compact .health-cache.json (plus optional context files) to the destination you choose. This server reads those files and exposes the 14 tools above over MCP. No bridge, no Docker, no database: just files and stdio.
Apple Health → MetricBridge (iOS) → .health-cache.json → health-export-mcp → MCP client → youRelated projects
Other Apple Health MCP servers in the ecosystem, worth a look depending on your setup:
neiltron/apple-health-mcp, an MCP server that runs SQL-style queries over an Apple Health export.
the-momentum/apple-health-mcp-server, an MCP server for analyzing Apple Health data exported from the Health app.
HealthyApps/health-auto-export-mcp-server, an MCP server for the Health Auto Export app's data.
How health-export-mcp differs: zero dependencies, clean structured JSON, 190 Apple Health metrics, and the widest agent support (Claude, Cursor, opencode, OpenClaw, Hermes, VS Code natively, plus ChatGPT/Gemini/Grok/n8n/Home Assistant via webhook).
Related
Companion iOS app: MetricBridge, exports 190 Apple Health metrics to your agent, automatically.
Model Context Protocol: modelcontextprotocol.io
Per-agent setup: AGENTS.md
If this helps your setup, a ⭐ makes it easier for others to find.
License
MIT, see LICENSE. Contributions welcome.
Apple Health MCP server · export Apple Health to AI · HealthKit MCP server · query Apple Health with Claude / ChatGPT / Cursor · Model Context Protocol health server · Apple Health to LLM · HRV, sleep & heart rate for AI agents.
Available Tools
14 toolscompare_periodsARead-onlyIdempotent
Compare a metric between two arbitrary date periods (A vs B): each aggregate plus the change and percent change. Pass periodA/periodB explicitly, or pass anchor {eventId, days} to build both periods around a logged event (the before/after question, with the event day excluded from both sides).
| Name | Required | Description | Default |
|---|---|---|---|
| anchor | No | Build both periods around a logged event instead of passing dates: periodA is the {days} days before the event date, periodB the {days} days after, the event day itself excluded from both. Get event ids from list_events. Pass either anchor or periodA/periodB, not both. | |
| metric | Yes | ||
| periodA | No | ||
| periodB | No | ||
| excludeTravelDays | No | Drop days on which a timezone change landed (health-days.json): those days were not 24 hours long, so their totals are stretched or shortened by the clock. The answer reports how many days were excluded and why. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate readOnlyHint=true and idempotentHint=true, so safety and idempotence are covered. The description adds useful behavior beyond the annotations: it excludes the event day from both sides when anchor is used, and it says the tool reports how many days it excluded when excludeTravelDays is set. That gives an agent a solid model of aggressive time and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is cosrne and front-loaded: it immediately states the operation and result, then gives the two input patterns. No sentence is wasted; it delivers the vervalue in two sentences. The long second sentence with parentheticals adds a little cost but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does summarize the output shape: each aggregate plus change/percent change and, when excluding travel days, the number excluded. Combined with sibling semantics and annotation safety profile, this is reasonably complete, but it could drive lightly about metric values and required period constraints for the min agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The overall schema describes some parameters, but coverage in the schema is only 40%; the description partially compensates by explaining the anchor/periodA/periodB relationship and the 'exclude the event day' nuance. However, it doesn't describe metric options or the exact date range semantics for periodA/periodB (boundary inclusivity, same length requirement). It thus adds meaningful but incomplete semantics over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation: 'Compare a metric between two arbitrary date periods (A vs B)' and describes the result as each aggregate plus raw change and percent change. It is distinct: it compares period aggregates, and the sibling list contains no other true period-to-period comparison tool, so an agent can tell when to choose this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: explicit periodA/periodB for arbitrary periods, or anchor-based 'before/after' comparisons around a registered event. It does not mention alternatives among siblings or explicitly say when not to use this tool, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
correlate_metricsARead-onlyIdempotent
Pearson correlation between two metrics' daily values: {metricA, metricB, lag (0 to 3, default 0), start, end}. lag pairs metricA on day d with metricB on day d+lag, so lag 1 compares against the FOLLOWING day. Returns alignedPairs, r (withheld below 10 aligned pairs), and both means. The answer always carries the association-not-causation caveat; treat every r as alignment in this file, not mechanism.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | YYYY-MM-DD | |
| lag | No | 0 to 3 days. lag 1 pairs metricA on day d with metricB on the following day. | |
| start | No | YYYY-MM-DD | |
| metricA | Yes | ||
| metricB | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses important quirks: r is withheld below 10 aligned pairs, the function returns both means, and the answer always carries an association-not-causation caveat. It also clarifies lag orientation clearly. This is exactly the kind of behavioral information an agent needs and cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise, information-dense sentences. Every sentence contributes: the first defines the operation, the second explains the lag and return values, the third provides the necessary interpretation caveat. There is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only correlation tool, the description covers the key computation, lag behavior, return fields, sample size threshold, and the contextual caveat. Its main omission is clear default behavior for unlimited or unspecified start/end windows, and it does not describe how alignedPairs is structured. Given there is no output schema, slightly more return-format exposure would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds useful meaning beyond the schema: it explains lag direction, default value, and relationship between aligned daily values. It also identifies the roles of metricA and metricB. Schema coverage is about 60%, and the description compensates for the missing metricA/metricB descriptions, though it does not elaborate on start/end bound semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation with a clear verb and resource: 'Pearson correlation between two metrics' daily values.' This is distinct from sibling tools like get_trends or compare_periods because it focuses on pairwise correlation rather than trend direction or period comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The correlation intent is clear, and the lag semantics are explicitly explained, but the description does not state when to prefer this over alternatives like get_trends, compare_periods, or list_metrics. The decision context is implied rather than explicit, and no exclusions or alternative tools are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cycle_contextARead-onlyIdempotent
Cycle context derived from user-logged period starts (health-cycles.json): day-in-cycle and a coarse phase label (follicular from day 1 to the observed midpoint of that cycle, luteal for the remainder). Derived from logged periods only, never predictive, and no ovulation estimate is made. Optional {date} for a single day; default returns per-day context for the last cycle.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds meaningful behavioral detail beyond those: the phase-label rule, the derived-not-predictive nature, and the observed-midpoint method. It also discloses that no ovulation estimate is made, which is important for an agent considering this tool for health data interpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact, information-dense two-sentence definition. It front-loads the core purpose and source, then adds necessary behavior constraints and parameter behavior. Each sentence earns its place with no filler, though the organization could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-parameter tool with no output schema, the description covers the important context: input semantics, default behavior, derivation source, and the exact output dimensions. The return values are sufficiently described at a high level (day-in-cycle and phase label) to make the tool usable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100% for the single date parameter, and the description enriches it further: the date is optional, it applies to a single day, and the default behavior returns per-day context for the last cycle. This gives the agent a complete understanding of parameter behavior beyond the bare YYYY-MM-DD schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (user-logged period starts), a specific output (day-in-cycle and phase label), and the source file (health-cycles.json). It also distinguishes itself by explicitly noting it is derived from logged periods only and never predictive, which separates it from potential ovulation or prediction tools even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for use: it is for cycle context based purely on logged period starts, and it explicitly excludes predictive or ovulation-estimation use cases. It does not explicitly name sibling tools or provide direct when-to-use-alternative language, but the scope and exclusions are strong enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_health_metricsARead-onlyIdempotent
Get values for a metric (or all metrics) over an optional date range, with an aggregate (avg/sum/min/max/latest). The core data-retrieval tool. Every result carries a coverage block giving the metric's real firstDate/lastDate/days: check it before trusting a long window, and note that aggregate is always computed over the full range even when points are rolled up. Single-metric answers also list any logged point events inside the window as segmentBoundaries.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | YYYY-MM-DD | |
| limit | No | Maximum data points to return (default 365, max 3000). The server rolls up rather than truncating. | |
| start | No | YYYY-MM-DD | |
| metric | No | Metric name, e.g. step_count, heart_rate, sleep_analysis. Omit for all. | |
| filterDays | No | Restrict to days covered by matching logged events (health-events.json): endDate ranges cover every day inclusive, point events cover their single day, negate:true keeps only days NOT covered. The answer states how many days matched. Example: HRV on night-shift blocks vs days off. | |
| aggregation | No | ||
| granularity | No | Roll daily values up before returning them. 'auto' (default) picks the finest granularity that fits the response budget, so a multi-year range returns monthly points instead of thousands of daily ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond annotations: it reveals the `coverage` block with real firstDate/lastDate/days, warns to verify long windows, clarifies that `aggregate` is computed over the full range even when points are rolled up, and mentions segmentBoundaries for point events. These are meaningful nuances that annotations (readOnly, idempotent) do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Only three sentences: purpose first, then critical behavioral warnings, and a final note about segmentBoundaries. Every sentence contributes value, and the most important caveats are front-loaded after the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 params, nested object, no output schema), the description covers essential pitfalls: the coverage block, aggregate behavior with rollups, and event segments. It explains partial return structure but leaves some details (error behavior, exact format of points) to inference. Still, it is reasonably complete for a read-only tool without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so most parameters already have descriptions. The tool description does not add per-parameter semantics beyond the schema; it focuses on general behavior and result structure. The baseline of 3 applies since the schema handles the heavy lifting, and the description's behavioral notes (e.g., aggregate over full range) are more about operation than parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource ('Get values for a metric (or all metrics) over an optional date range, with an aggregate') and even labels itself 'The core data-retrieval tool,' which conveys its role. However, it does not explicitly differentiate from siblings like get_trends or compare_periods, leaving potential ambiguity about which tool covers which analytical task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Calling itself 'the core data-retrieval tool' implies it is the general-purpose retrieval endpoint, but there is no explicit guidance on when to prefer siblings, what user scenarios warrant get_trends vs. this, or exclusions. The guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_intradayARead-onlyIdempotent
The current hour-by-hour window from the iOS app's HOURLY automations (health-intraday.json, app 1.4+): each metric's hourly points plus its latest value. The file is REPLACED on every hourly run, so this is a live within-day view, not history; use get_health_metrics for day-level questions. Returns available:false with setup guidance when no hourly automation has delivered yet.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | No | Metric name to filter, e.g. heart_rate. Omit for every metric in the window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description reveals critical behavioral context: the source file is replaced every hourly run, making the tool a live snapshot rather than a stable historical archive. It also discloses the available:false failure mode and the setup guidance that accompanies it, giving the agent accurate expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, informative sentences cover the core functionality, the source/version, the critical replacement behavior, the appropriate alternative tool, and the edge-case return value. The most identifying information is front-loaded ('current hour-by-hour window') and no waste or repetition exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and no output schema, the description conveys the necessary context: what it returns, when to use it, and how to handle early no-data situations. The remaining details about metrics or format are already in the schema or via sibling tools like list_metrics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'metric' is already fully documented in the input schema with an example and an explicit 'omit for all metrics' rule. The description adds no supplementary semantics for the parameter, so the schema fully covers parameter meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: the current hour-by-hour window's each metric's hourly points plus its latest value. It distinguishes the tool from get_health_metrics by explicitly saying it is a live within-day view, not history, which resolves ambiguity among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use get_health_metrics for day-level questions, framing get_intraday as the tool for live intraday data. It also calls out the no-data-yet condition and explains that the tool returns available:false plus setup guidance, so the agent knows when the data pipeline is not ready.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mcp_statusARead-onlyIdempotent
Health check: data source, how many metrics/workouts are available, which optional context files exist, and the most recent data date. Call this first to confirm the bridge is connected.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior, so the description's job is light. It adds useful context about what information the status call returns and that it serves as a connection check, which helps the agent understand expected behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise, information-dense sentence. It front-loads the purpose ('Health check'), lists the return contents, and gives the usage hint without unnecessary wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and read-only annotations, this description fully equips an agent to call the tool correctly and understand what it will receive. Nothing important is missing for the task of selecting and invoking this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document. The description compensates by explaining what the no-argument call returns, which is the only relevant guidance needed here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as a health-check tool and specifies exactly what it reports: data source, counts of metrics/workouts, optional context files, and most recent data date. It is clearly distinguished from sibling tools that retrieve specific data or insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs the agent to call this tool first to confirm the bridge is connected. This provides a clear decision rule for when to use it, and no alternative or exclusion is needed given it is the startup/connectivity check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileARead-onlyIdempotent
The context fields the user explicitly opted in to sharing (health-profile.json): conditions, medications, goals, allergies, notes. Returns the fields plus a presentFields list. An absent field was withheld by the user or never enabled; absence must never be read as "none".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations establish read-only and idempotent behavior, and the description genuinely adds behavioral value: it discloses the presentFields list and, crucially, warns that an absent field must not be interpreted as a negative value. This semantic caveat goes well beyond annotation signals and helps the agent avoid a dangerous misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the resource scope, the return shape, and the semantic caveat. No fluff, no redundancy, minimum well-organized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no params and no output schema, the description correctly explains both what the returned fields are and what the extra presentFields list means. The 'absent does not equal none' caveat closes the main path for user surprise/misuse. Nothing required to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is no schema coverage burden. The description correctly focuses on the return payload, which is the only remaining semantic surface. It receives a baseline 4 for handling the zero-parameter case well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('get') and a clear resource ('health-profile.json' shared context fields), and distinguishes that resource from sibling tools by spelling out exactly what data is returned (conditions, medications, goals, allergies, notes). No ambiguity about what the tool operates on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly defines the narrow scope—context fields explicitly opted into sharing—so an agent can infer when this tool is relevant. However, it does not state when not to use it or explicitly contrast it with sibling tools such as get_health_metrics or get_cycle_context. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleep_sessionsARead-onlyIdempotent
Clustered sleep sessions from health-sessions.json with {start, end, day} filters. Sessions are attributed to the WAKING day, matching the daily cache's sleep_analysis, so the two surfaces never disagree; a split night appears as multiple sessions with the same day, returned as-is. Timestamps carry the local UTC offset at the time of the sample.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | A single waking day, YYYY-MM-DD. | |
| end | No | Last waking day (inclusive), YYYY-MM-DD. | |
| start | No | First waking day (inclusive), YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses non-obvious behavioral traits: sessions are attributed to the waking day, split nights appear as multiple sessions with the same day, and timestamps include the local UTC offset. These go well beyond the readOnly and idempotent annotations, giving the agent a precise model of how results are shaped and time-zone sensitive. No contradictions exist with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, tightly packed with functional and behavioral details. It front-loads the core purpose then expands on subtle behaviors. Every clause earns its place, and there is no fluff or repeated schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only retrieval tool with no output schema, the description explains the session clustering and timezone handling. However, it does not mention the list of returned fields, ordering, or pagination. Despite the strong behavioral context, the absence of an output schema means the agent still lacks a complete picture of the result shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters with inclusive explicit date range semantics (YYYY-MM-DD) at 100% coverage. The description only references them generically as filters, adding no new details beyond what the schema states. Thus the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, resource, and scope: 'Clustered sleep sessions from health-sessions.json with {start, end, day} filters.' It clearly distinguishes this tool from siblings like get_workouts or get_health_metrics by focusing on sleep sessions and their clustered/aggregated nature. The additional context about waking-day attribution and split nights makes the tool's uniqueness explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when the tool applies: it filters sleep sessions by start/end/day, and aligns with the daily cache's sleep_analysis. However, it does not explicitly name alternative tools or say when not to use it, leaving some inference to the agent. The clear domain coverage earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_structured_exportARead-onlyIdempotent
Return clean structured JSON for the chosen metrics/date range. Paginated: the result carries nextCursor when more metrics remain; pass it back as cursor for the next page. Prefer naming the metrics you need and a date range; calling it bare over a full history is a lot of data.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | YYYY-MM-DD | |
| limit | No | Maximum data points to return (default 365, max 3000). The server rolls up rather than truncating. | |
| start | No | YYYY-MM-DD | |
| cursor | No | Opaque cursor from a previous call's nextCursor. | |
| metrics | No | ||
| granularity | No | Roll daily values up before returning them. 'auto' (default) picks the finest granularity that fits the response budget, so a multi-year range returns monthly points instead of thousands of daily ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses pagination behavior, including nextCursor/cursor, and warns about large results. Since annotations already mark this as read-only and idempotent, no contradiction exists and no hidden mutation or side effect is suggested.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each with a distinct purpose: describing what it returns, explaining pagination, and providing usage advice. There is no redundant wording or unnecessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should have provided a clearer picture of the returned JSON shape; it only says 'clean structured JSON' and mentions nextCursor. Pagination, date range, and metrics guidance are covered, but the actual output format remains under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema property descriptions cover most parameters, so the baseline is already appropriate. The description does not add much semantic value beyond the schema: cursor behavior, limit, and granularity are already described in the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly describes the tool's deliverable: clean structured JSON for chosen metrics and a date range. It is distinct enough from analytics-oriented siblings like get_trends or compare_periods, though it does not explicitly name an alternative or scope how it differs from query_health_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete usage guidance: name metrics and a date range, and avoid bare calls over a full history because they return a lot of data. It provides a clear practical context but does not explicitly say when to choose this tool over a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trendsARead-onlyIdempotent
Compare the most recent N-day window against the prior N days for a metric: change, percent change and direction (up/down/flat). Also returns daysAvailable and windowSatisfied: if windowSatisfied is false the file does not hold enough history for the window you asked for, and the comparison is over less data than requested. Logged point events inside the compared span are listed as segmentBoundaries.
| Name | Required | Description | Default |
|---|---|---|---|
| metric | Yes | ||
| window | No | days per window (default 7) | |
| excludeTravelDays | No | Drop days on which a timezone change landed (health-days.json): those days were not 24 hours long, so their totals are stretched or shortened by the clock. The answer reports how many days were excluded and why. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only and non-destructive behavior. The description adds useful behavioral context beyond annotations: windowSatisfied can be false when not enough history exists, and comparisons then run over less data than requested. It also discloses that segmentBoundaries lists logged point events in the span.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, opening with the main action and expected outputs. It adds technical details about windowSatisfied and segmentBoundaries without excessive filler. It is slightly dense but every sentence contributes semantic value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining return data, which it does well: change, percent change, direction, daysAvailable, windowSatisfied, and segmentBoundaries. It does not fully address possible error/precondition cases or clarify metric validity, but for a read-only idempotent trend tool the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, with window and excludeTravelDays already documented in the input schema. The description adds a general 'N-day window' concept but does not explain the required metric parameter or add meaning for excludeTravelDays beyond the schema. It compensates only partially for the undocumented metric parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it compares the most recent N-day window against the prior N days for a metric and returns change, percent change, and direction. This distinguishes it from more generic query tools, but it does not explicitly contrast it with the closely named sibling compare_periods, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied rather than stated: an agent can see it is meant for window-over-window trend comparisons. However, there is no explicit guidance about when not to use it, when to prefer compare_periods or get_health_metrics instead, or what prerequisite conditions apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workoutsARead-onlyIdempotent
Query the workouts cache with {activityType (a name like Running, or a raw HealthKit id like 37), start, end} filters and pagination ({limit} default 50 max 200, {cursor} from a previous nextCursor). Records are returned exactly as stored, including the newer optional keys (avgHeartRate, maxHeartRate, running dynamics, cycling power, intervals, hasRoute) when the app exported them; older caches simply lack those keys and nothing is fabricated. Also returns summary {count, byActivityType} over everything that matched.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | YYYY-MM-DD | |
| limit | No | Workouts per page (default 50, max 200). | |
| start | No | YYYY-MM-DD | |
| cursor | No | Opaque cursor from a previous call's nextCursor. | |
| activityType | No | Activity name (e.g. Running) or raw HealthKit activity id (e.g. 37). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent, and the description adds meaningful behavioral detail: records are returned exactly as stored, optional newer keys may be absent, nothing is fabricated, and the summary applies over all matches. This is precisely the extra non-obvious behavior agents benefit from.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long enough to capture filters, pagination, caching behavior, optional fields, and summary semantics, but every clause contributes. The core query action and paging semantics are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter read-only tool with no output/output schema, this description covers the important call/response semantics: which filters are allowed, how pagination works, what shape the records take, and what the summary provides. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all five parameters with examples, defaults, and format. The description restates them compactly and adds only marginal grouping/narrative value, so it earns the baseline 3 for a schema with high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete action ('Query'), a specific resource ('the workouts cache'), and enumerates filters and pagination. The scope is clearly workout data, which distinguishes it from sibling metric/trend/period tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: this is for querying raw cached workout records within date/activity/filter bounds with pagination. It does not explicitly name alternatives or when not to use it, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsARead-onlyIdempotent
Logged context events from health-events.json: medication starts, habit changes, doctor visits, life events, shift blocks, episodes, travel, and any type a newer app adds. Optional {type, tag, start, end} filters; a range event matches a window it overlaps. Sorted ascending by date. Returns available:false when the file was never exported; absence means nothing was exported, not that nothing happened.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | YYYY-MM-DD | |
| tag | No | Match events carrying this tag. | |
| type | No | Event type, e.g. medication, habit, visit, life, shift, episode, travel, other. Unknown types pass through and can be filtered by their stored string. | |
| start | No | YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and idempotent hints; the description adds substantial beyond-schema detail: start/end range semantics, ascending sort order, how unknown types pass through, and the available:false semantics that distinguish an untouched dataset from an empty one. These are exactly the edge behaviors an agent needs to reason about correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, information-dense, and front-loaded with the tool's core purpose before moving into filters and edge cases. Every sentence contributes unique, non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description covers source, filter behavior, ordering, overlap semantics, unknown types, and the absence of a meaningful available:false result. This is sufficient for an agent to confidently select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all four parameters with 100% coverage, so the baseline is 3. The description adds meaningful extra context by explaining that range filters allow overlap matching and by reinforcing that the type parameter is open to new app-defined types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it lists logged context events from health-events.json, enumerates the event types, and covers future types. This makes the tool clearly distinguishable from the metric, workout, and sleep siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use it — whenever a list of context events is needed — and describes the optional filters. It does not explicitly call out sibling alternatives or exclusion conditions, but the context signals and type enumeration make the target use case obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_metricsARead-onlyIdempotent
List every available Apple Health metric with its unit, day count, and date range. Use this to discover metric names before querying.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as readOnly and idempotent, so no safety contradiction exists. The description adds useful context about the listing including unit, day count, and date range, which goes beyond raw annotation data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main action and return content are front-loaded, and the usage guidance is immediately actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter discovery tool, the description fully covers what the agent needs: what will be listed, what fields are included, and when to use it. Sibling tool context supports the discovery-to-query flow, and nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so parameter semantics are inherently simple. The description clarifies what the returned listing contains, which is useful given no output schema is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific action (list), a clear resource (every available Apple Health metric), and the exact information included (unit, day count, date range). It clearly distinguishes this as a discovery tool from sibling querying tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'discover metric names before querying.' This gives clear usage context and implies this is a prerequisite step rather than an analysis tool, though it does not explicitly name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_health_dataARead-onlyIdempotent
Natural-language convenience: pass a question and get routed structured results. Prefer the specific tools above when you can, and call list_metrics first to see how much history exists, since this tool answers over whatever the file holds.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=true, openWorldHint=false, and idempotentHint=true, so the read-only and idempotent nature is established. The description adds one important behavioral fact: results are scoped to whatever data is currently in the file, and users should check list_metrics for the amount of history available. It doesn't explain routing behavior in detail (e.g., how ambiguity is handled), but the additional context about the underlying file scope is useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient passage that front-loads the core purpose and then adds practical usage guidance. No words are wasted; the routing concept, the preference for alternatives, and the prerequisite call are all packed into two sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
In the context of a simple one-parameter tool with handers that mark it read-only and idempotent, the main missing pieces for an agent would be the shape of the structured results and any question formatting limits. The instructions to check list_metrics and set expectations on available history partially fill the context gaps, and the description does not need to explain return values due to a lack of an output schema summary line. Still, the absence of any return-format hint keeps it from a 5, but against the overall simplicity it's fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. The description does explain the question parameter's role by saying pass a question and get routed structured results, which is some semantic content. But it doesn't give examples, constraints, or format guidance for a well-formed question, leaving the parameter meaning incomplete despite a 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool takes a natural-language question and returns routed structured results, and identifies it as a convenience tool with a specific purpose. It also explicitly distinguishes it from the specific tools by referring to them as alternatives, which helps differentiate it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to prefer specific tools when possible, and instructs calling list_metrics first to check the data history before using this tool. This gives an explicit usage context and a clear prerequisite. It doesn't list specific alternatives by name or state when-not conditions in detail, but the guidance provided is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools target clearly separate functions—listing, core queries, comparisons, exports, intraday, and singular domain areas like workouts or sleep. Minor boundary overlap exists between get_health_metrics/get_structured_export/query_health_data and between get_trends/compare_periods, but each has a distinct primary purpose that an agent can generally select by intent.
All tools follow a consistent lowercase snake_case verb_noun pattern (get_, list_, compare_, correlate_, query_), with no exceptions. The verbs are specific and match the resource or action they perform, making the naming predictable and reliable.
14 tools is well within the ideal 3-15 range for a domain-specific server. Each tool covers a meaningful aspect of health data export and analysis, and the count feels appropriately scoped rather than padded or trivially thin.
The tool surface comprehensively covers the promised health-export domain: metric discovery and retrieval, aggregations, trends, period comparisons, exports, intraday data, workouts, sleep, events, profile, cycle context, and even correlation. There are no obvious dead ends or missing operations that would block a reasonable health-data workflow.
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 Connectors
Private Apple Health metrics and workout detail for ChatGPT, Claude, and any MCP client.
Hosted MCP server exposing US hospital procedure cost data to AI assistants
Collect Apple Health data from your wearables through the Context app and query it via MCP
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- AlicenseAqualityAmaintenanceAn MCP server that allows users to query and analyze their Apple Health data using SQL and natural language, utilizing DuckDB for fast and efficient health data analysis.23491564MIT
- AlicenseAqualityCmaintenanceA Model Context Protocol server that enables seamless interaction between LLM-based agents and Apple Health data, allowing users to query, analyze, and manage health records through natural language commands.7259MIT
- AlicenseNot gradedqualityAmaintenanceRead-only MCP server that exposes Apple Health data (steps, workouts, sleep, etc.) from a local SQLite store, allowing AI agents to query health metrics without sending data to hosted services.4Apache 2.0
- AlicenseNot gradedqualityCmaintenanceHosted MCP server that syncs health data from Apple Health, Fitbit, Oura, and Google Health Connect, enabling Claude and ChatGPT to query workouts, sleep, nutrition, and recovery in plain English with interactive charts.1MIT
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/PhilipAD/health-export-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server