Apple Health MCP
Apple Health MCP is a local-first MCP server that reads your Apple Health export (export.xml/export.zip) and exposes your health data to AI agents, with all processing staying on your machine and no cloud sync.
Setup & Status: Check connection status, get a personalized quickstart, view capabilities and agent manifest, and run a demo.
Data Discovery: Scan the export to see available record types, date ranges, freshness, and perform privacy audits.
Summaries: Generate daily and weekly wellness briefs covering steps, sleep, heart rate, workouts, and more; also provide normalized wellness context for recommendation engines.
Raw Data Access: Query specific health records (activity, heart, sleep, workouts, body measurements, HRV, etc.) with filtering, aggregation, and configurable privacy modes (summary, structured, raw).
Import Management: Automatically watch a folder for new exports and re-import the latest; clear caches as needed.
User Profile: Manage a shared Delx Wellness profile (preferences, goals, safety flags) and follow an onboarding flow.
Agent Integration: Provide machine-readable manifests and privacy guardrails so AI agents understand capabilities and local-only privacy posture.
Privacy & Performance: Defaults to summary privacy mode; memoizes queries for near-instant repeat results.
Provides tools to access and analyze Apple Health data from exported files (export.xml/export.zip), enabling AI agents to query activity, sleep, heart rate, workouts, and more.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Apple Health MCPsummarize my last 7 days of activity"
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.
⚡ One-command install with Delx Wellness for Hermes:
npx -y delx-wellness-hermes setup— preconfigures this connector and the other 8 in a dedicated Hermes profile.Or wire it standalone into Claude Desktop / Cursor / ChatGPT Desktop — see the install section below.
HTTP (v2 stateless)
Default is stdio. Optional Streamable HTTP — no session id, JSON responses, loopback only:
npx -y apple-health-mcp-unofficial --http
# GET http://127.0.0.1:3000/health
# POST http://127.0.0.1:3000/mcp (sessionless)Env: APPLE_HEALTH_MCP_HOST, APPLE_HEALTH_MCP_PORT, APPLE_HEALTH_MCP_TRANSPORT=http.
Local-first MCP server that reads your Apple Health export and exposes it to AI agents.
Unofficial project. Not affiliated with, endorsed by or supported by Apple Inc. Apple Health is a trademark of Apple Inc. This package reads exports you generate yourself from the Apple Health app.
No live HealthKit access. This connector reads
export.xml/export.zipfiles exported from your iPhone. A native iOS HealthKit bridge is a separate future component.
Built by David Mosiah for people who use Claude, Cursor, Hermes, OpenClaw or other MCP-compatible agents to think about long-term health and activity trends — without copy-pasting numbers from the Health app.
Part of Delx Wellness, a registry of local-first wellness MCP connectors.
If this connector helps your agent workflow, please star the repo. Stars make the project easier for other AI builders to discover and help Delx keep shipping local-first wellness infrastructure.
Related MCP server: Fitbit MCP
Why this exists
Apple Health is the most complete personal health dataset most people own — years of activity, heart rate, sleep, workouts, body measurements, even ECGs. But Apple does not expose a public cloud API. The data lives on the iPhone behind HealthKit, and the only practical way to bring it off-device today is the Health Export feature inside the Health app.
This package reads that export locally — either the raw export.xml, the unzipped folder, or the export.zip — and exposes Apple Health through the Model Context Protocol. No tokens, no OAuth, no cloud sync. The export never leaves your machine.
Setup in 60 seconds
1. Export your Apple Health data on iPhone:
Health app → tap your profile picture → Export All Health DataWait a few minutes. AirDrop or transfer the zip to this machine.
2. Configure and verify:
npx -y apple-health-mcp-unofficial setup --export-path /path/to/export.zip
npx -y apple-health-mcp-unofficial doctorOr let the CLI find the newest local export in Downloads, Desktop or Documents, copy it into managed local storage, and save that path:
npx -y apple-health-mcp-unofficial setup --auto-importSupported export paths:
/path/to/export.zip/path/to/apple_health_export/(unzipped folder)/path/to/export.xml(raw export file)
Keep it fresh — watch a folder (no macOS needed):
Apple Health is a manual export, so the usual pain is that your data goes stale the moment you stop re-running setup. Point the connector at a folder you drop new exports into:
npx -y apple-health-mcp-unofficial setup --watch-path /path/to/health-exportsNow every time you export from your iPhone and drop the new export.zip (or export.xml, or unzipped apple_health_export/) into that folder, the connector auto-promotes the newest one to be the active export — on server startup and live while it runs — and refreshes the cached summaries. You can also trigger a re-scan on demand with the apple_health_reimport tool. This is the cross-platform recurring-refresh path; a fully live HealthKit bridge still needs a native macOS/iOS component.
Then add this to your MCP client config:
{
"mcpServers": {
"apple_health": {
"command": "npx",
"args": ["-y", "apple-health-mcp-unofficial"]
}
}
}For Claude Desktop, run setup --client claude --export-path /path/to/export.zip and the snippet is written for you.
Try it with your agent
Three things to ask first:
Use apple_health_connection_status to check setup, then run apple_health_daily_summary.
Give me a 5-line wellness brief for today.Call apple_health_data_inventory first. What Apple Health signals and date ranges
are available in this export?Call apple_health_weekly_summary with response_format=json. Compare steps,
sleep, workouts and heart signals across the last 7 days.Use the apple_health_weekly_review prompt, days=14.
Find the biggest habit pattern and suggest one experiment.Data availability
This package parses Apple Health exports from the Health app. When this README says raw, it means the upstream XML record fields — not raw HealthKit data.
Data | Available | Notes |
Activity (steps, distance, energy, exercise) | ✓ | Standard |
Heart rate (resting + samples) | ✓ | Recorded HR samples and resting HR |
Sleep analysis + sleep stages | ✓ | When iPhone/Watch logs sleep |
Workouts + sport metadata | ✓ | All |
Body measurements (weight, BMI, body fat) | ✓ | When the user logs them |
HRV (SDNN) + breathing rate | ✓ | When Watch supports them |
ECG records | ✓ (metadata) | Apple Watch ECG events; raw waveform requires PDF export |
Live HealthKit access | — | Apple does not expose a public live API |
iCloud Health sync | — | Not exposed by export files |
Tools
Start with these:
apple_health_connection_status— verify export path before reading dataapple_health_data_inventory— discover available record types, date coverage, sources count and stale export riskapple_health_daily_summary— daily wellness brief from export dataapple_health_weekly_summary— weekly comparison and habit signals
Diagnostics
apple_health_capabilities,apple_health_agent_manifest,apple_health_privacy_audit
Records
apple_health_list_records— bounded records bytype(e.g.HKQuantityTypeIdentifierStepCount),start,end,limit.limitcaps the returned list only: in the defaultsummaryprivacy mode theaggregateblock (count_by_type,units,date_range,numeric) is computed over every record matching the filter, andtruncated/limit_applied/matched_counttell you whether the list itself was cut. The statistics live undernumeric(numeric.min/numeric.max/numeric.sum/numeric.average/numeric.count), not at the top ofaggregate— see What a payload looks likeapple_health_list_workouts— bounded workouts bystart,end,limit. Same contract:limitcaps the returned list only, and insummaryprivacy mode theaggregatetotals (count_by_activity,date_range,total_duration_minutes,total_distance,distance_units,total_energy_kcal,workout_count) cover every workout matching the filter, withtruncated/limit_applied/matched_countreporting whether the list was cut
Keeping data fresh
apple_health_reimport— re-scan the watch folder (APPLE_HEALTH_WATCH_PATH) and promote the newest export, refreshing summaries; passcheck_only: trueto preview without promoting
What a list call costs
limit bounds the output, not the work. In the default summary privacy mode the aggregate has to describe every matching record, so the scan cannot stop at the cap — it streams export.xml to the end. Narrowing with type, start or end does not shorten it: a match could still sit in the last byte, so the file is read in full either way.
Measured on synthetic exports (Node 23, macOS, warm page cache), for one apple_health_list_records call in summary mode:
export.xml | first call, summary mode | same call repeated | same call, |
84 MB (353k records) | ~3.0 s | <1 ms | ~1 ms |
336 MB (1.4M records) | ~11.3 s | <1 ms | ~2 ms |
Roughly 33 ms per MB, linear in file size. A cold first read of a large export — before the OS has the file cached — costs noticeably more (~29 s was observed for 336 MB).
Practical guidance:
Identical repeat queries are free. Results are memoized in memory per export file, keyed on path + size + mtime. Promoting a new export (or
apple_health_reimport) invalidates them, so a stale export is never served.apple_health_daily_summary,apple_health_weekly_summaryandapple_health_data_inventoryshare a separate snapshot cache and were already paying one full parse; they are not affected by this.Need a quick page rather than statistics?
privacy_mode: "structured"or"raw"stops the scan atlimitand returns in about a millisecond — at the cost of returning individual records instead of an aggregate.apple_health_list_workoutsreaches the end of the file in every mode, because workouts are sparse: an export rarely holds enoughWorkoutelements to fill even the default page of 50.incremental_cache: trueis never memoized — it advances a persistent per-category cursor, so each call must actually run.
What a payload looks like
Synthetic values, real shape. npm run test:readme-contract calls the actual server against the repo fixture and fails if any key below stops existing — or if the server starts returning a key this section does not show.
{
"source": "apple_health_export",
"type": "HKQuantityTypeIdentifierHeartRate",
"privacy_mode": "summary",
"count": 50,
"limit_applied": 50,
"truncated": true,
"matched_count": 2847,
"records": [],
"aggregate": {
"count_by_type": { "HKQuantityTypeIdentifierHeartRate": 2847 },
"units": ["count/min"],
"date_range": {
"first": "2026-04-01T03:12:00.000Z",
"last": "2026-04-30T23:41:00.000Z",
"first_date": "2026-04-01",
"last_date": "2026-04-30"
},
"numeric": { "count": 2847, "sum": 202137, "average": 71, "min": 48, "max": 174 }
},
"aggregate_scope": "all_matching_records",
"disclosure": "summary_mode_omits_individual_records_aggregate_covers_all_matching_records"
}records is empty in summary mode by design — the aggregate replaces the individual samples. count still reports how many records the scan paged in; matched_count is the full match set the aggregate covers.
{
"source": "apple_health_export",
"privacy_mode": "summary",
"count": 12,
"limit_applied": 50,
"truncated": false,
"matched_count": 12,
"workouts": [],
"aggregate": {
"count_by_activity": {
"HKWorkoutActivityTypeRunning": 8,
"HKWorkoutActivityTypeTraditionalStrengthTraining": 4
},
"date_range": {
"first": "2026-04-02T21:10:00.000Z",
"last": "2026-04-29T22:05:00.000Z",
"first_date": "2026-04-02",
"last_date": "2026-04-29"
},
"total_duration_minutes": 486.5,
"total_distance": 62.4,
"distance_units": ["km"],
"total_energy_kcal": 5820,
"workout_count": 12
},
"aggregate_scope": "all_matching_workouts",
"disclosure": "summary_mode_omits_individual_workouts_aggregate_covers_all_matching_workouts"
}Prompts
apple_health_daily_review— daily wellness review with non-medical framingapple_health_weekly_review— weekly habit signals and trend comparison
Resources
apple-health://capabilities,apple-health://agent-manifestapple-health://inventory,apple-health://summary/daily,apple-health://summary/weekly
Privacy & security
Apple Health exports are highly sensitive personal health data. Keep them local.
Never commit
export.xml/export.zipto GitHub, paste raw exports into chat, or upload them to issues.The export path is read-only; the MCP never modifies your export.
APPLE_HEALTH_PRIVACY_MODEdefaults tosummaryfor this connector (more conservative than other Delx Wellness connectors) since the dataset is rich and sensitive. In summary mode, low-level list tools return aggregates instead of individual records. Raw record dumps are opt-in.This is not medical advice. The server exposes data you exported yourself for personal AI workflows, not diagnosis or emergency monitoring.
Configuration
APPLE_HEALTH_EXPORT_PATH=/path/to/export.zip # or export.xml or apple_health_export/
APPLE_HEALTH_PRIVACY_MODE=summary # summary | structured | raw
APPLE_HEALTH_TIMEZONE=America/Fortaleza # local-day summaries; defaults to UTC unless setup saves a timezone
APPLE_HEALTH_WATCH_PATH=/path/to/health-exports # optional: auto-reimport the newest export dropped heresetup writes these settings into ~/.apple-health-mcp/config.json with 0600 permissions.
setup --auto-import scans common local folders for the newest Apple Health export and copies it to ~/.apple-health-mcp/exports/ with 0600 permissions. This automates the local import step after you transfer the export from the iPhone. Fully live HealthKit sync still requires a separate native bridge; this Node MCP intentionally reads local exports only.
setup --watch-path <dir> (or APPLE_HEALTH_WATCH_PATH) makes the connector treat a folder as a drop zone. On startup, while running (via filesystem events), and whenever the apple_health_reimport tool is called, it promotes the newest Apple Health export found there — export.xml, export.zip, an apple_health_export/ directory, or any *apple*health*.zip — to be the active export and clears the snapshot + incremental caches so the next summary reflects the new data. apple_health_connection_status reports the watch folder state and warns when a newer export is waiting.
Hermes / remote setup
npx -y apple-health-mcp-unofficial setup --client hermes --export-path /path/to/export.zip
npx -y apple-health-mcp-unofficial doctor --client hermes
hermes mcp test apple_healthAfter Hermes config changes, use /reload-mcp or hermes mcp test apple_health. Don't restart the gateway for normal export access.
If the Hermes server runs on a different machine than your iPhone, transfer the export there and point --export-path at it. The export file should be chmod 600.
Requirements
Node.js 20+
An Apple Health export from your iPhone (Health app → profile → Export All Health Data)
Development
git clone https://github.com/davidmosiah/apple-health-mcp.git
cd apple-health-mcp
npm install
npm test
npm run buildTest with MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.jsOptional local HTTP transport:
APPLE_HEALTH_MCP_TRANSPORT=http APPLE_HEALTH_MCP_PORT=3000 node dist/index.js
curl http://127.0.0.1:3000/healthLinks
npm: https://www.npmjs.com/package/apple-health-mcp-unofficial
Delx Wellness registry: https://github.com/davidmosiah/delx-wellness
Connector quality standard: https://github.com/davidmosiah/delx-wellness/blob/main/docs/connector-quality-standard.md
Apple Health export how-to: https://support.apple.com/guide/iphone/share-health-and-fitness-data-iph27f6325b2/ios
See also
The full Delx Wellness connector library:
Provider | Package | Repo |
WHOOP | ||
Oura | ||
Garmin | ||
Strava | ||
Fitbit | ||
Withings | ||
Apple Health | ||
Polar | ||
Nourish (nutrition) |
One-command setup for Hermes — preconfigures every connector above plus wellness skills + onboarding: delx-wellness-hermes.
📧 Contact & Support
📨 support@delx.ai — general questions, integration help, partnerships
🐛 Bug reports / feature requests — GitHub Issues
🐦 Updates — @delx369 on X
🌐 Site — wellness.delx.ai
License
MIT — see LICENSE.
Disclaimer
This software is provided as-is. It is not a medical device, does not provide medical advice, and should not be used for diagnosis, treatment or emergency monitoring. Always consult qualified professionals for medical concerns.
Skill or MCP
Same package, two doors. MCP registers tools on stdio/HTTP. The skill can drive the same tools through the CLI when the client has no MCP:
npx -y apple-health-mcp-unofficial call apple_health_connection_status --json '{}'Copy skill/SKILL.md into your agent skills dir.
Available Tools
18 toolsapple_health_agent_manifestApple Health Agent ManifestBRead-onlyIdempotent
Machine-readable install, runtime and privacy guidance for AI agents operating Apple Health export data.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | generic | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds context by specifying it provides guidance on install, runtime, and privacy. However, it does not elaborate on behavioral traits like response size or caching, so value is moderate.
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?
A single, well-structured sentence that conveys the core purpose without extraneous 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?
Given the simple input schema and annotations, the description is minimally adequate but lacks guidance on usage and parameter details. For a tool in a complex ecosystem, more completeness is expected.
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% and the description does not mention or explain the two parameters ('client', 'response_format'). The agent must infer meaning from enum values alone, which is insufficient for correct invocation.
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 the tool provides 'install, runtime and privacy guidance for AI agents operating Apple Health export data,' which is a specific verb-resource combination. It distinguishes from sibling tools by being a manifest file rather than a data query or mutation 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?
No explicit guidance on when to use this tool versus its many siblings. The description implies it's for initial setup or configuration, but there is no mention of alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_capabilitiesApple Health MCP CapabilitiesBRead-onlyIdempotent
Explain supported Apple Health export data, unavailable live HealthKit access, privacy modes and recommended agent workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive, which covers the safety profile. The description adds useful context about the topics covered (e.g., privacy modes, recommended workflow), but does not disclose additional behavioral traits such as rate limits or data freshness. Given the annotation coverage, a score of 3 is appropriate.
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 sentence that efficiently summarizes the tool's purpose, listing key topics. It is concise and front-loaded with the verb "explain." However, it could be slightly better structured (e.g., bullet points) for readability.
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?
The description lists the main topics covered (export data, unavailable live access, privacy modes, agent workflow), which is adequate for an informational tool. However, it does not specify the output format or guarantee completeness, and with no output schema, the agent lacks full context on what to expect.
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 input schema has one parameter (response_format) with enum values and a default, but schema description coverage is 0%. The description does not mention the parameter at all, so it fails to add meaning beyond what the schema provides. This leaves the agent without guidance on how to use the parameter effectively.
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 the tool explains Apple Health export data, unavailable live HealthKit access, privacy modes, and recommended agent workflow. It uses a specific verb ("explain") and identifies the resource, and among the sibling tools, this is the only one focused on capabilities explanation, providing clear 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 description does not provide any guidance on when to use this tool versus alternatives like apple_health_onboarding or apple_health_privacy_audit. It lacks explicit context on prerequisites or exclusions, leaving the agent to infer the appropriate usage scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_clear_incremental_cacheClear Apple Health Incremental Import CacheADestructiveIdempotent
Manually clear the incremental import cache at ~/.apple-health-mcp/incremental-cache.json. The cache tracks the latest parsed timestamp per HealthKit category so subsequent apple_health_list_records calls (with incremental_cache: true) skip already-seen records. Use this when you want to force a full re-parse without changing the export file. The cache also auto-invalidates when the export file mtime changes. Gated by explicit_user_intent: true (requires explicit user intent to wipe local cache).
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Clearly describes destructive action (wipes local cache) and gated by explicit_user_intent. This adds context beyond annotations like destructiveHint and idempotentHint. No contradictions.
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?
Single paragraph with front-loaded purpose, followed by context. Four sentences with no wasted words, though slightly longer than minimal.
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?
Covers cache purpose, file path, auto-invalidation, and user intent requirement. No output schema, but behavior is simple and described well. Lacks explanation of what happens after clearing.
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 0%, but description does not mention the single parameter 'response_format' or its enum values (markdown/json). Agent gets no guidance on output format beyond 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?
Clear verb 'clear' with specific resource 'incremental import cache' and file path. Explanation of cache purpose and when to use distinguishes from siblings like listing or importing records.
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 states use case: 'force a full re-parse without changing the export file.' Mentions auto-invalidation hinting when not needed, but no explicit alternative tool named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_connection_statusApple Health Connection StatusARead-onlyIdempotent
Check local Apple Health export path, Node version, privacy mode and Hermes client posture without reading full export data.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | generic | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, so the safety profile is clear. The description adds useful context about not reading full export data, which is a behavioral constraint beyond 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?
Single, concise sentence that front-loads the purpose and key details without waste. Every word adds 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?
For a simple status tool with 2 optional parameters and no output schema, the description covers what it checks but omits details on return format or that it produces a report. It is adequate but missing some completeness.
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. However, the description does not explain the two parameters ('client' and 'response_format') at all, leaving their purpose and valid values unclear.
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?
Description states specific verb 'Check' and lists precise items (export path, Node version, privacy mode, Hermes client posture). It also explicitly says it does not read full export data, distinguishing it from data-reading siblings like 'apple_health_list_records'.
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 implies when to use (to check status before other operations) and what not to use it for (reading data), but does not explicitly mention alternative tools or provide when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_daily_summaryApple Health Daily SummaryARead-onlyIdempotent
Build a daily wellness summary from local Apple Health export data. It is not live HealthKit and not medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD local date. Defaults to today in the configured timezone. | |
| timezone | No | IANA timezone, e.g. America/Fortaleza. Defaults to APPLE_HEALTH_TIMEZONE or UTC. | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds only a disclaimer ('not medical advice') and mentions local data source, but no additional behavioral traits beyond what annotations provide.
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 two concise sentences with no wasted words. The first sentence immediately states the purpose, and the second adds important caveats. Excellent structure.
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 tool's simplicity and the annotations covering safety and idempotency, the description provides sufficient context. It clarifies the data source and limitations. The absence of an output schema is acceptable for a summary 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?
Schema description coverage is 67% (likely all three parameters have descriptions in the schema). The description does not add parameter-specific meaning beyond what the schema already provides. 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 clearly states that the tool builds a daily wellness summary from local Apple Health export data. It distinguishes from live HealthKit and medical advice, and among siblings there is a weekly summary variant, making the purpose specific and unambiguous.
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 implies when to use (for a daily summary) and warns that it is not live HealthKit, providing context. However, it does not explicitly state when not to use or how it compares to alternative tools like apple_health_weekly_summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_data_inventoryApple Health Data InventoryARead-onlyIdempotent
Scan the local Apple Health export once and report available record types, workouts, date coverage, freshness and safe next calls.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Optional ISO date/time upper bound. | |
| start | No | Optional ISO date/time lower bound. | |
| timezone | No | IANA timezone, e.g. America/Fortaleza. Defaults to APPLE_HEALTH_TIMEZONE or UTC. | |
| privacy_mode | No | ||
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. The description adds behavioral context: it scans a local export once, reports freshness and safe next calls, implying stateful behavior despite idempotency. No contradictions.
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?
Single sentence of 20 words, front-loaded with action ('Scan the local Apple Health export once'), no redundant words, every part adds 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?
The description lists all key outputs (record types, workouts, date coverage, freshness, safe next calls) and hints at the one-time nature. No output schema exists, but description adequately sets expectations. Could mention the response_format parameter briefly, but not essential.
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 60%, so baseline is 3. The description adds no parameter-specific details beyond what the schema already provides (start/end/timezone have descriptions). Parameters with enums are not elaborated in description.
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?
Description explicitly states the action ('Scan the local Apple Health export once and report...') and lists specific outputs (record types, workouts, date coverage, freshness, safe next calls). Clearly distinguishes from siblings like apple_health_list_records or apple_health_list_workouts.
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?
Description notes the tool is for a one-time initial scan and mentions it provides 'safe next calls,' guiding subsequent actions. While it doesn't explicitly exclude alternatives or state when not to use, the context is clear given the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_demoApple Health DemoARead-onlyIdempotent
Returns realistic example payloads of apple_health_daily_summary, apple_health_weekly_summary, and apple_health_wellness_context with Apple-Watch-style values, so agents see the contract before parsing a real export.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true; description adds context that it returns example data, not modifying real data. No contradictions.
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?
Single sentence front-loads key purpose. Could be improved by including parameter info, but overall efficient.
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?
Covers main purpose for a simple demo tool, but missing parameter documentation reduces completeness. No output schema, but description is adequate.
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?
Description does not mention the response_format parameter despite 0% schema coverage. Parameter has enum and default but should be explained in description.
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?
Description clearly states the tool returns realistic example payloads for specific summary types. Uses specific verb 'Returns' and resource 'example payloads', distinguishing it from sibling tools that provide real 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?
Implicitly suggests use for testing/understanding contract before real parsing. Does not explicitly state when not to use, but context with sibling tools makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_export_freshnessApple Health Export FreshnessARead-onlyIdempotent
Check how recently the local Apple Health export file/directory was written. Returns mtime, days_since_export, an is_stale flag, and a recommendation. Considered stale if the export is older than 30 days, or older than 7 days with no recent records (the inventory's latest-record date is also older than 7 days). Use before relying on apple_health_daily_summary or apple_health_wellness_context to confirm the export is fresh.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds the staleness algorithm (30 days or 7 days with no recent records), which is beyond what annotations provide. No contradictions.
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 sentences, front-loaded with purpose and returns, then staleness logic, then usage. No unnecessary words; every sentence adds 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?
Given the simple tool, the description covers purpose, return values, staleness criteria, and usage context. No output schema needed as description explains output. Annotations cover behavioral traits. 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%, but the only parameter (response_format) is self-explanatory from its enum and default in the schema. The description does not mention it, but the schema is sufficient. 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 clearly states the tool checks export freshness, returns mtime, days_since_export, is_stale flag, and recommendation. It specifies staleness criteria, making the purpose distinct from sibling tools like apple_health_daily_summary.
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 to use this tool before relying on apple_health_daily_summary or apple_health_wellness_context to confirm export freshness, providing clear when-to-use and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_list_recordsList Apple Health RecordsARead-onlyIdempotent
List bounded records from a local Apple Health export.xml. Use type/start/end filters to keep output small. limit caps the returned LIST only: in summary privacy mode (the default) the aggregate block (count_by_type, units, date_range, numeric) is computed over every record matching the filter, and truncated/limit_applied/matched_count say whether the list itself was cut. The statistics are nested under numeric (numeric.count/sum/average/min/max), not at the top of aggregate. COST: because the aggregate must cover every match, summary mode reads the whole export file on each new query — roughly 33 ms per MB of export.xml (~3 s for 84 MB, ~11 s for 336 MB), and type/start/end do not shorten it. Repeating an identical query is served from an in-memory cache and returns instantly. For a cheap bounded page with no full-file scan, pass privacy_mode 'structured' or 'raw', which stop at limit.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Optional ISO date/time upper bound. | |
| type | No | Apple Health record type, e.g. HKQuantityTypeIdentifierStepCount. | |
| limit | No | ||
| start | No | Optional ISO date/time lower bound. | |
| privacy_mode | No | ||
| response_format | No | markdown | |
| incremental_cache | No | When true and `type` is set, skip records already seen in a previous call (per-category cache at ~/.apple-health-mcp/incremental-cache.json). Cache auto-invalidates when the export file mtime changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the full-file scan cost model (~33 ms per MB, ~3 s for 84 MB), in-memory caching of identical queries, the fact that `limit` caps only the returned list and not the aggregate, and the nested `numeric` statistics shape. This far exceeds the bar set by readOnlyHint/idempotentHint and does not contradict them.
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?
Dense and front-loaded: purpose and the critical `limit` caveat come first, followed by cost and mode guidance. Slightly long, but every sentence carries operational weight — the COST block, caching note, and mode routing all earn their 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?
For a complex tool with 7 parameters and no output schema, the description is thorough. It covers the return shape (truncated/limit_applied/matched_count and nested numeric stats), the cost model, caching, and mode behavior. Little an agent needs to call it correctly 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?
Schema description coverage is only 57%, leaving limit, privacy_mode, and response_format undocumented in the schema. The description compensates by explaining `limit` semantics (caps the list only, not the aggregate), the three privacy modes and their behavior, and the aggregate block's nested structure. This is meaningful value added beyond 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?
States a specific verb and resource: 'List bounded records from a local Apple Health export.xml.' It is distinguishable from siblings like apple_health_list_workouts (workouts only) and apple_health_daily_summary (aggregated view) by focusing on raw record listing with type/start/end filters. However, it never names a sibling explicitly, leaving the agent to infer the distinction.
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?
Offers explicit mode-selection guidance — 'For a cheap bounded page with no full-file scan, pass privacy_mode "structured" or "raw"' — and spells out the cost tradeoff of summary mode versus the cached repeat-query path. It does not explicitly exclude sibling tools (e.g., when to prefer list_workouts), so the alternative-routing guidance is intra-tool rather than cross-tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_list_workoutsList Apple Health WorkoutsARead-onlyIdempotent
List bounded workouts from a local Apple Health export.xml. limit caps the returned LIST only: in summary privacy mode (the default) the aggregate block (count_by_activity, date_range, total_duration_minutes, total_distance, distance_units, total_energy_kcal, workout_count) is computed over every workout matching the filter, and truncated/limit_applied/matched_count say whether the list itself was cut. COST: this call reads the whole export file on each new query — roughly 33 ms per MB of export.xml (~3 s for 84 MB, ~11 s for 336 MB) — and start/end do not shorten it. Workouts are sparse in an export, so even non-summary modes usually reach the end of the file. Repeating an identical query is served from an in-memory cache and returns instantly.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Optional ISO date/time upper bound. | |
| limit | No | ||
| start | No | Optional ISO date/time lower bound. | |
| privacy_mode | No | ||
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, non-destructive. The description goes far beyond by disclosing the cost of reading the whole file per query (with timing estimates), caching of identical queries, that start/end do not shorten the read, and that limit only caps the list not the aggregate. This is exceptional transparency about performance and semantics, fully complementing 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 long but every sentence earns its place. It is front-loaded with the primary purpose, then systematically covers limit semantics, cost, and caching. The structure is logical and efficient, with no filler or repetition.
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 5 optional parameters, no output schema, and rich behavioral nuances, the description covers all critical aspects: purpose, parameter effects, performance cost, caching, and what the aggregate block returns. An agent can safely call this tool and interpret the response without additional clarification.
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 only 40% (end and start). The description significantly compensates by detailing the `limit` parameter's exact effect (caps the list, not the aggregate) and explaining the aggregate block fields and truncation indicators. It does not explain privacy_mode or response_format beyond their enums, but the default mention of summary mode adds context. Overall, it adds substantial meaning beyond 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 clearly states it lists workouts from a local Apple Health export.xml, specifying the resource and source. It distinguishes the tool from siblings like apple_health_list_records by focusing on workouts, and the detail about privacy modes and aggregate behavior makes its purpose unmistakable.
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 provides clear context on when to use it (to list workouts from an export) and important usage constraints (bounded list, cost implications, caching behavior). It does not explicitly name alternative sibling tools or say 'use X instead', but the purpose and cost notes effectively guide usage without confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_onboardingDelx Wellness Onboarding FlowARead-onlyIdempotent
Return the 11-question onboarding flow plus the current profile state and missing fields. Read-only — does NOT persist anything. Pair with apple_health_profile_update once the user answers. Cross-connector: the same profile is shared by every Delx Wellness MCP (whoop, garmin, oura, fitbit, strava, polar, withings, apple-health, samsung-health, google-health, nourish, cycle-coach, cgm, air).
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Onboarding locale. Defaults to en. | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description reinforces 'Read-only — does NOT persist anything' and adds context about returning 11 questions, profile state, missing fields, and cross-connector sharing, adding value beyond 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 sentences with no wasted words. First sentence states core purpose, second reinforces safety, third gives pairing guidance and cross-connector note. Front-loaded and efficient.
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 simple read-only tool with two optional parameters and no output schema, the description adequately covers what is returned (onboarding flow, profile state, missing fields) and how to use it (pair with update). Minor omission: no description of response format differences, but overall sufficient.
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 50% (locale described, response_format missing). The tool description adds no parameter information, failing to compensate for the gap. The response_format enum values 'markdown' and 'json' are not explained, leaving ambiguity.
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 the tool returns the 11-question onboarding flow plus current profile state and missing fields. It specifies the verb 'return' and resource, and distinguishes from siblings like apple_health_profile_get by including the onboarding flow.
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 advises pairing with apple_health_profile_update after user answers, providing clear usage context. Lacks explicit when-not-to-use guidance, but the pairing instruction sufficiently differentiates from alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_privacy_auditApple Health Privacy AuditARead-onlyIdempotent
Return the local privacy and export-file posture without revealing health data.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds the important behavioral constraint 'without revealing health data', which is not captured in annotations, enhancing transparency about privacy preservation.
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?
Single sentence that is front-loaded with the core purpose. No wasted words, every phrase 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 simple parameter set, rich annotations, and no output schema, the description sufficiently covers the tool's purpose and safety. Lacks detail on return format but that is partially addressed by the response_format parameter.
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 has 0% description coverage, so description should compensate. However, the sole parameter (response_format) with enum and default is self-explanatory. Description adds no additional meaning beyond the schema, justifying a baseline score of 3.
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 the tool returns 'the local privacy and export-file posture', a specific verb-resource pair. It distinguishes from siblings by emphasizing 'without revealing health data', contrasting with tools like apple_health_data_inventory that might expose 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 implies usage for privacy audits without exposing data but provides no explicit guidance on when to use this versus sibling tools like apple_health_export_freshness or apple_health_data_inventory. No when-not-to-use or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_profile_getGet Delx Wellness ProfileARead-onlyIdempotent
Read the shared Delx Wellness profile from ~/.delx-wellness/profile.json. Returns preferred name, goals, devices, training/nutrition/exercise/agent preferences and safety flags. NEVER contains OAuth tokens or API secrets — this connector is local-export and has no cloud auth, but the profile contract is the same across every Delx Wellness MCP. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint; description adds useful safety context (no OAuth secrets, no cloud auth) that goes beyond annotations. No contradictions.
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?
Description is two sentences, front-loaded with purpose. The second sentence contains multiple pieces of information but remains efficient. Slightly verbose with the security detail but still concise.
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?
Covers main purpose, readability, safety, and lists returned fields. Although no output schema, the description adequately describes return values. Does not mention how the response_format parameter affects output.
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 only parameter (response_format) is not mentioned in the description. With 0% schema description coverage, the description fails to add meaning beyond the schema for this 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?
Clearly states the tool reads the Delx Wellness profile from a specific local file path. Differentiates from siblings like apple_health_profile_update by emphasizing read-only nature.
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?
Provides context about security (no OAuth tokens, local-export) and declares read-only, which helps guide usage. However, does not explicitly state when not to use or reference alternatives beyond the read-only hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_profile_updateUpdate Delx Wellness ProfileA
Persist a partial patch to ~/.delx-wellness/profile.json. Requires explicit_user_intent=true (otherwise returns USER_ACTION_REQUIRED). Rejects secret-like fields (oauth, token, secret, password, cookie, refresh, api_key, session) at write time. Use to record preferred name, goals, devices, training context, nutrition context, exercise preferences, agent preferences, and safety flags.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | Partial WellnessProfileDocument patch. Top-level keys: profile, goals, devices, training, nutrition, preferences, safety, notes. | |
| response_format | No | markdown | |
| explicit_user_intent | No | Must be true to persist. Prevents accidental writes from agent inference. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations false, the description carries the full burden. It discloses that the tool is a partial patch operation, requires explicit_user_intent, and rejects secret-like fields at write time. It does not mention idempotency or success/failure responses, but still provides substantial transparency beyond the raw schema.
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 sentences, each adding distinct value: action and file, requirement and constraint, usage examples. No wasted words, and the most important information is 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?
Given no output schema and three parameters (one nested), the description covers purpose, usage, and key behaviors. It doesn't mention return format or success/failure handling, which is a minor gap, but overall it is sufficiently complete for an agent to use correctly.
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 meaning beyond the schema by explaining that the 'patch' parameter is used for recording specific fields (preferred name, goals, etc.) and by stating that secret-like fields are rejected. The 'explicit_user_intent' parameter is reinforced. Schema coverage is 67%, so the description compensates 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 uses a specific verb ('persist a partial patch') and resource ('~/.delx-wellness/profile.json'), clearly distinguishing it from sibling tools like apple_health_profile_get. It also lists the kinds of data to record, making the purpose unambiguous.
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 a critical usage condition ('Requires explicit_user_intent=true') and a constraint ('rejects secret-like fields'), and provides examples of when to use it. It doesn't explicitly state when not to use it or list alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_quickstartApple Health QuickstartARead-onlyIdempotent
Personalized 3-step setup walkthrough for the human user. Adapts to current state (is APPLE_HEALTH_EXPORT_PATH set? does the export file exist and parse?). Call this first when the user asks 'how do I connect Apple Health?'. This connector is local-first and never touches Apple servers or cloud APIs.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant value beyond annotations by detailing adaptive behavior based on the current state (e.g., APPLE_HEALTH_EXPORT_PATH existence/parse validity) and emphasizing the local-first, server-free nature. This complements the annotations (readOnlyHint, idempotentHint) without contradiction.
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 extremely concise—two sentences that front-load the core purpose and immediately follow with critical usage guidance and behavioral traits. Every sentence is essential and well structured.
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 tool's low complexity (single optional param, no output schema, clear purpose), the description covers all necessary context: purpose, usage scenario, state adaptation, and privacy guarantee. It is fully complete for an agent to understand when and why to invoke 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?
With only one simple parameter (response_format) that has a clear enum and default, the schema already defines it adequately. While the description does not mention the parameter, the lack of need is justified by the parameter's simplicity and self-explanatory nature. No additional explanation is necessary.
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 the tool's purpose ('Personalized 3-step setup walkthrough for the human user') and identifies the resource ('Apple Health connection'). It also distinguishes from siblings by specifying to call it first when the user asks about connecting Apple Health.
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 to call this tool first when the user asks 'how do I connect Apple Health?', providing clear context. However, it does not mention when not to use it or suggest alternative tools, which could be helpful given the presence of sibling tools like apple_health_connection_status and apple_health_onboarding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_reimportReimport Apple Health Export from Watch FolderAIdempotent
Re-scan the configured watch folder (APPLE_HEALTH_WATCH_PATH or setup --watch-path <dir>) for a newer Apple Health export. If a newer export.xml/export.zip/apple_health_export directory is found, it is promoted to the active export, the in-memory snapshot cache and incremental cache are cleared, and subsequent summaries reflect the new data. With check_only=true, only report what would happen without promoting. This is the cross-platform recurring-refresh path — the native HealthKit bridge needs macOS and is separate. Requires explicit user intent when promoting a new export (force or non-check_only); check_only is read-only inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | When true, re-promote the newest export in the folder even if it already matches the active export (forces a cache refresh). | |
| check_only | No | When true, report the watch-folder status without promoting a new export. | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, which the description supports by detailing state changes: 'promoted to the active export, the in-memory snapshot cache and incremental cache are cleared.' It also explains check_only behavior and force parameter effects. No contradictions; the description adds valuable behavioral context beyond 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 paragraph containing all necessary information without excessive verbosity. It could benefit from bullet points or clearer separation of behaviors, but it is efficiently written and front-loaded with the core action.
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 tool has 3 parameters and no output schema, the description covers scanning, promotion, cache clearing, force, check_only, and distinguishes from the native bridge. It also mentions the setup path and required permissions. For its complexity, it is fully 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 coverage is 67%, and the description adds meaning: for 'force' it explains 're-promote the newest export... even if it already matches the active export (forces a cache refresh)'; for 'check_only' says 'report the watch-folder status without promoting a new export.' The 'response_format' is already described in schema. The description compensates well for the missing schema descriptions.
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 the tool's action: 'Re-scan the configured watch folder... for a newer Apple Health export.' It specifies the resource (watch folder) and the verb (re-scan and promote). It distinguishes from siblings by noting it's the 'cross-platform recurring-refresh path' and that the native HealthKit bridge is separate, avoiding confusion.
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 provides usage context: 'the cross-platform recurring-refresh path — the native HealthKit bridge needs macOS and is separate.' It also indicates when not to use it: 'Requires explicit user intent when promoting a new export (force or non-check_only); check_only is read-only inspection.' It doesn't explicitly enumerate alternatives but gives clear guidance on intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_weekly_summaryApple Health Weekly SummaryBRead-onlyIdempotent
Build a weekly wellness summary from local Apple Health export data. It is not live HealthKit and not medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| end_date | No | YYYY-MM-DD local end date. Defaults to today in the configured timezone. | |
| timezone | No | IANA timezone, e.g. America/Fortaleza. Defaults to APPLE_HEALTH_TIMEZONE or UTC. | |
| privacy_mode | No | ||
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behaviors. The description adds context that the tool uses locally exported data (not live API) and includes a disclaimer about non-medical advice, which goes beyond annotation information.
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 two sentences: the first states the core action, the second adds disclaimers. It is front-loaded, concise, and contains no unnecessary words.
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 5 optional parameters and no output schema, the description does not explain what the summary includes (e.g., metrics), how parameters like privacy_mode or response_format affect output, or prerequisites like requiring an export. The annotations cover safety but leave functional details 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?
Schema coverage is low (40%), with only end_date and timezone having descriptions. The tool description does not mention any parameters or their meanings, failing to compensate for the gaps in schema documentation.
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 the tool builds a weekly wellness summary from local Apple Health export data, with disclaimers about not being live HealthKit or medical advice. However, it does not explicitly differentiate from sibling tools like apple_health_daily_summary or apple_health_wellness_context, though the name implies a weekly scope.
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 implies usage for local export data and weekly periods, and disclaims live HealthKit and medical advice. However, it provides no explicit when-to-use or when-not-to-use guidance, nor mentions alternatives like daily_summary for single-day needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_health_wellness_contextApple Health Wellness ContextBRead-onlyIdempotent
Normalize local Apple Health export sleep, workout and activity data into the shared wellness_context shape for recommendation engines.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD local date. Defaults to today in the configured timezone. | |
| notes | No | ||
| soreness | No | ||
| timezone | No | IANA timezone, e.g. America/Fortaleza. Defaults to APPLE_HEALTH_TIMEZONE or UTC. | |
| injury_flags | No | ||
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds context about data transformation into a specific shape, which is valuable but does not disclose any additional behavioral traits such as side effects or prerequisites. With annotations covering the core safety profile, this is adequate.
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 sentence that concisely conveys the core purpose without extraneous information. It is front-loaded with the verb and resource. However, it could be more structured by adding parameter hints or usage 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?
Given 6 optional parameters, no output schema, and a moderate-complexity tool, the description is minimally adequate. It explains the high-level purpose but lacks details on the output shape, normalization logic, and parameter roles. For an agent to use it effectively, more context is needed.
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 only 33% (only date and timezone have descriptions). The tool description does not mention any parameters or explain their semantics, leaving the agent to rely only on the schema. Since coverage is low, the description should compensate but does not.
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 the action (Normalize) and the specific resource (local Apple Health export sleep, workout and activity data) and the outcome (shared wellness_context shape for recommendation engines). It distinguishes itself from sibling tools by mentioning the specific output format, but it does not explicitly differentiate from similar transformation tools like apple_health_daily_summary.
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 does not provide any guidance on when to use this tool versus alternatives, nor does it specify prerequisites or exclude conditions. An agent has no context to decide between this and apple_health_daily_summary or other sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
18 tool updates
v0.5.0- First observed
apple_health_agent_manifest - First observed
apple_health_capabilities - First observed
apple_health_clear_incremental_cache - First observed
apple_health_connection_status - First observed
apple_health_daily_summary - First observed
apple_health_data_inventory - First observed
apple_health_demo - First observed
apple_health_export_freshness - First observed
apple_health_list_records - First observed
apple_health_list_workouts - First observed
apple_health_onboarding - First observed
apple_health_privacy_audit - First observed
apple_health_profile_get - First observed
apple_health_profile_update - First observed
apple_health_quickstart - First observed
apple_health_reimport - First observed
apple_health_weekly_summary - First observed
apple_health_wellness_context
TDQS
Scored across 18 tools
Each tool has a clearly distinct purpose, from listing records and workouts to summaries, profile management, and meta-inspection (privacy audit, capabilities, freshness). Even closely related tools like quickstart and onboarding are differentiated: quickstart is a 3-step setup walkthrough, while onboarding is an 11-question flow paired with profile updates. No two tools appear to do the same thing.
All tools share the 'apple_health_' prefix and snake_case convention, creating a strong recognizable pattern. However, there is a mix of verb_noun names (list_records, profile_get, clear_incremental_cache) and noun-only names (capabilities, quickstart, demo, export_freshness), which breaks strict consistency but remains predictable and readable.
18 tools is on the high end of the acceptable range for a health data connector, but each tool addresses a distinct aspect of the domain—setup, status, privacy, data listing, summaries, profiles, cache management, and reimport. The count feels justified given the breadth of functionality, though it could be streamlined by consolidating some meta/status tools.
The tool surface covers the core lifecycle of working with Apple Health export data: onboarding, listing, summaries, wellness context, profile management, freshness checks, and cache/reimport operations. Minor gaps exist (e.g., no direct tool for specific metric queries like heart rate or steps beyond list_records with filters), but agents can achieve these via the available tools. Overall, it supports the primary workflows without dead ends.
Maintenance
Related MCP Connectors
- SomviaOAuthapp.somvia
Private Apple Health metrics and workout detail for ChatGPT, Claude, and any MCP client.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Collect Apple Health data from your wearables through the Context app and query it via MCP
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Related MCP Servers
- AlicenseBqualityAmaintenanceA local-first MCP server that enables AI agents to read user-authorized Google Health API v4 data from Fitbit, Pixel Watch, and partners via OAuth, with tokens never leaving the machine.261,09753MIT
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Fitbit activity, sleep, heart-rate, HRV, SpO2 and weight data.33854MIT
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Withings body, sleep, activity and heart data.23765MIT
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Garmin sleep, HRV, Body Battery, stress, training readiness and activities, keeping tokens on your machine.4271911MIT