Skip to main content
Glama
mo-debugs

Samsung Health Analytics MCP

by mo-debugs

Samsung Health Analytics MCP

Ask Claude about your Samsung Health data. Get the trends the Samsung Health app does not show you.

The Samsung Health app shows you today and this week. Your export holds months of data, but nothing in the app answers questions like these:

  • How has my sleep changed month by month this year?

  • Did my habits change after I moved, changed jobs or started training?

  • When in the day do I actually move?

  • What happens to my sleep and heart rate when I travel?

This repo loads your export into a local DuckDB database and gives Claude an MCP server to query it. Claude builds a one-page dashboard artifact first, then answers your questions.

What you get

  • Month-by-month trends for steps, active time, sleep, sleep score, deep sleep, sleep interruptions, sleeping heart rate and HRV.

  • Any two periods side by side (before/after a move, a new job, a training block), with effect sizes, so small noise is not reported as change.

  • Trips detected automatically from the timezone your phone reported. No location data needed. Each trip is compared with the 30 home days before it, and travel days are left out of the comparisons.

  • A 24-hour movement clock showing when in the day you walk.

  • A dashboard artifact with three actions for the next 30 days, written by Claude from your numbers.

Related MCP server: Apple Health Chat MCP

How it works

Samsung Health app
  | Settings > Download personal data
  v
export.zip ---> data/ (gitignored, stays on your machine)
                  |
                  v
        +------ dev container ------+
        |  ingest -> health.duckdb  |
        |  MCP server (stdio)       |
        +---------------------------+
                  ^  docker exec (.mcp.json)
                  |
            Claude Code
              |  1. ingest_export
              |  2. health-dashboard skill -> artifact
              v  3. your questions

Only aggregates (averages, counts, comparisons) reach the conversation. The raw export never leaves your machine, and the server opens the database read-only for queries.

Quick start

You need Docker and Claude Code.

  1. Export your data: Samsung Health app > profile > Settings > Download personal data. Copy the folder or zip to your computer.

  2. Clone and open Claude Code in the repo:

    git clone https://github.com/mo-debugs/samsung-health-analytics-mcp
    cd samsung-health-analytics-mcp
    claude
  3. Say: "Set up the health MCP." Claude builds the dev container (a few minutes the first time) and asks you to reconnect the server with /mcp.

  4. Say: "My export is at ~/Downloads/.zip." Claude copies it into data/, loads it and asks what you want to compare.

  5. Claude builds your dashboard. Then ask anything:

    • "Compare March with April."

    • "Which month did I sleep best, and what was different?"

    • "Show my unusual days for resting heart rate."

    • "How did my last trip affect my sleep?"

Refresh monthly: download a new export and say "Here is my new export, refresh my dashboard."

Without Docker

Install it as a Claude Code plugin instead (needs uv). Data is then stored in ~/.samsung-health/.

/plugin install samsung-health-analytics --marketplace mo-debugs/samsung-health-analytics-mcp

MCP tools

Tool

What it does

ingest_export

Load an export zip or folder (replaces the previous load)

set_periods

Save the two periods to compare

overview

Date range and data coverage per metric

monthly_trends

Monthly averages with month-over-month change

compare_periods

Two periods side by side, saved or ad hoc date ranges

trips

Trips from timezone changes, and the travel effect

hourly_profile, weekday_profile

When you move, by hour and weekday

sleep_timing

Bedtime, wake time, split nights, consistency

rolling_baseline

Days that were unusual for you (z-score vs your last 28 days)

detect_locations

Timeline of timezone runs, to spot moves

workouts

Exercise sessions by month and type

schema, run_sql

Read-only SQL for anything else

dashboard_payload, render_dashboard

Data for the report, and the rendered HTML

Notes and limits

  • Steps use Samsung's merged daily total (phone and watch combined), so they are not double counted.

  • Travel detection: a day counts as away when its timezone covers less than 35% of the surrounding 90 days. Daylight saving and permanent moves are handled. A trip longer than about a month starts to look like a move, so its first days may be counted as home.

  • Timezone is not location. Two countries in the same timezone look the same. Claude asks you to name your trips.

  • Samsung changes its export format between app versions. The ingester reads columns by name and skips files it cannot find. If something breaks, open an issue with the file name (never your data).

  • This is wellness data, not medical advice.

Development

uv sync
uv run pytest                                     # pipeline test on a synthetic export
uv run shealth-ingest path/to/export.zip          # CLI ingest
uv run shealth-dashboard --story story.json       # render the dashboard without Claude

Credits

Created by Mohammed Sarfarazuddin. If you use or build on this work, please credit it with a link back to this repository.

Feel free to connect on LinkedIn. Based in Riyadh? Feel free to reach out! I am on my quest to explore the best coffee place in Riyadh :)

License

MIT

Available Tools

16 tools
compare_periodsA

Compare two periods. Either names from set_periods (defaults: the first two), or ad hoc ranges a_range/b_range like "2025-03-01..2025-03-31" (period_a/period_b then become their labels). Returns mean/median/n per period, delta %, Cohen's d and a plain verdict per metric. Travel days excluded by default.

NameRequiredDescriptionDefault
a_rangeNo
b_rangeNo
metricsNo
period_aNo
period_bNo
home_onlyNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does useful work: it discloses the returned statistics (mean/median/n, delta %, Cohen's d, plain verdict) and the default exclusion of travel days. What it never states is that this is a read-only, side-effect-free operation, nor whether the comparison itself has any prerequisites such as ingested data or configured periods.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the core action and with no filler. The parenthetical about period_a/period_b becoming labels is slightly compressed and requires a second read, but every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description substitutes well for the absent output schema by enumerating return values, and it explains default behavior. However, for a six-parameter tool with zero schema documentation, omitting the metrics filter and never saying what valid period names look like leaves the definition only minimally sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does for most inputs: a_range/b_range get an explicit format example ('2025-03-01..2025-03-31'), period_a/period_b are explained as labels in ad hoc mode, and the default of the first two named periods is given. The metrics parameter is never mentioned at all, leaving one of six inputs entirely undocumented, and the travel-day note is not tied to the home_only flag by name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb and resource (compare two periods) and the rest clarifies how periods are selected. It references set_periods as the source of named periods, which helps position it among siblings, but it does not distinguish itself from monthly_trends or rolling_baseline, which are plausible alternatives for time-based comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly lays out the two invocation modes — named periods from set_periods (with the default being the first two) or ad hoc ranges — which is exactly the decision an agent must make before calling. It stops short of saying when this tool should be preferred over monthly_trends or rolling_baseline, so there is no true alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dashboard_payloadA

Everything the dashboard renders, including precomputed signals and trips. Read this before writing the story.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose one real behavioral trait: the payload is precomputed (`signals`, `trips`), signaling derived values that may lag the underlying data. It does not explicitly confirm this is a read-only operation, nor does it warn about payload size or latency for an aggregate endpoint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with the payload scope front-loaded and no filler. The trailing instruction is slightly cryptic – "the story" is never defined in the tool surface – which costs it a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a zero-argument aggregate endpoint with no output schema, so the return shape is invisible until invocation; the description hints at two keys (`signals`, `trips`) but not the rest of the structure. Reasonably adequate for a simple no-param call, but thin given the absent output contract.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero parameters and 100% coverage, so there is nothing for the description to disambiguate. Baseline 4 applies for a no-argument tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource precisely as the aggregate of everything the dashboard renders, which implicitly distinguishes it from piecemeal siblings like `overview`, `trips`, and `monthly_trends`. It lacks an explicit verb ("returns"), and it does not address the naming collision where `trips` is both a sibling tool and a field inside this payload.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Read this before writing the story" gives an implied sequencing hint – call this first when composing narrative output. However, it never states alternatives or when NOT to use it, so an agent cannot tell from the description alone whether this supersedes `overview` / `monthly_trends` or merely wraps them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

detect_locationsB

Timeline of contiguous UTC-offset runs: homes and trips. Use it to suggest periods (e.g. a move).

NameRequiredDescriptionDefault
min_daysNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses the detection basis (contiguous UTC-offset runs) and output categories (homes and trips), but it does not explicitly confirm read-only behavior, non-mutation, or data-access constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded, and contains no filler. The first sentence describes the output and the second gives usage, though the phrasing is somewhat dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return-value details need not be in the description. However, the description leaves min_days unexplained and, without annotations, does not cover behavioral constraints or alternatives sufficiently for a fully self-contained definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, min_days, has 0% schema description coverage and is not mentioned in the description. Its name is fairly intuitive, but the definition does not explain how the threshold affects detected runs or the default of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete output: a timeline of contiguous UTC-offset runs split into homes and trips. It is specific enough to understand the resource, but it does not explicitly distinguish this tool from sibling tools such as trips or set_periods.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The sentence 'Use it to suggest periods (e.g. a move)' gives a clear use case for the tool. It does not state when not to use it, prerequisites, or alternatives, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hourly_profileC

Average steps for each hour of the day (0-23), per period. Shows when you move.

NameRequiredDescriptionDefault
periodNo
home_onlyNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full burden and mostly does not carry it. It never confirms this is a read-only aggregation, never says what happens when period is omitted (null default), and never mentions that the default home_only=true silently filters the data — a behaviorally material default.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler, and the metric plus grouping are front-loaded. It is arguably trimmed below usefulness, but there is no wasted phrasing to cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with zero schema description coverage, no annotations, and no output schema, the description leaves critical gaps: the meaning of home_only, the accepted period format, and the granularity of the result (per-period hourly buckets). An agent could call it, but not confidently predict the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and only partly does: "per period" implies period defines the aggregation window but gives no format or accepted values (including what null means). The home_only parameter — the one that most changes results — is not referenced at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific metric (average steps), a specific grouping (hour of day, 0-23), and a scoping qualifier (per period). The tabular shape is clear enough to distinguish it from weekday_profile or monthly_trends without further inspection, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Shows when you move" is a hint at the use case but not a directive: there is no statement of when to pick this over weekday_profile, overview, or compare_periods, and no prerequisites or exclusions. The agent must infer the choice from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ingest_exportA

Load a Samsung Health export (.zip or extracted folder) into the local database, replacing the old one. Takes about 10 seconds. Re-run whenever the user downloads a fresh export.

NameRequiredDescriptionDefault
pathYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description does real work: it discloses the destructive replace-the-old-database behavior, the ~10 second cost, and the re-run trigger. It omits failure/validation behavior (bad zip, partial import, whether old data survives a failed load), which matters for an unannotated destructive write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and input format, followed by cost and trigger. Nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter destructive tool with no annotations and no output schema, the description covers what it does, its cost, and when to call it. Missing are return/verification signals and error handling, which would complete the picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the 'path' parameter has no description, so the description must compensate. It does, clarifying the expected input shapes (.zip file or extracted folder), which the bare 'string' schema does not convey. Path resolution (absolute vs relative) remains unstated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (load/ingest) and a specific resource (Samsung Health export as .zip or extracted folder) with the destination (local database). Distinct from every sibling, which are read-only analytics/query tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear trigger condition: 'Re-run whenever the user downloads a fresh export.' No explicit alternatives or exclusions are named, but no sibling tool overlaps with ingestion, so the gap is minor.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

overviewC

Date range, data coverage per metric, available metrics and the periods being compared.

NameRequiredDescriptionDefault

No parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It lists some content the tool surfaces, but says nothing about whether it is read-only, whether it is cheap or expensive, what triggers it, or how results are shaped. For a zero-annotation, zero-output-schema tool this is thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is very short with no padding, but it is a telegraphic fragment rather than a front-loaded statement of what the tool does. Brevity here comes at the cost of clarity rather than from efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and no parameters, the description is the only signal available and it delivers a partial field list without stating the tool's action or the conditions for using it. An agent would have to guess that this is an orientation/metadata call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters (0 params, 0 required), so the schema baseline of 4 applies; there is nothing for the description to disambiguate. It does not mislead about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a noun-phrase inventory ("Date range, data coverage per metric, available metrics and the periods being compared") with no verb, so it never explicitly says the tool returns a dataset-level overview. It does, however, imply a metadata/summary role that distinguishes it from analytical siblings like monthly_trends or compare_periods. Purpose is inferable but not stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus alternatives — notably `schema`, `compare_periods`, or `dashboard_payload`, all of which could plausibly serve a similar orientation role. The agent must infer that this is a 'call first to understand the data' tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_dashboardA

Render the single-file dashboard with the story you wrote from the payload. actions: 3 items of {title, detail, metric, target}, each grounded in a payload number. headline: one sentence, the most important finding. subtitle: one line of context. callouts: labels on the 24h clock, e.g. [{"hour": 6, "text": "Morning run"}], only for causes the user confirmed. travel_note: one or two sentences about the user's travel, from trips. trip_labels: [{"start": "2025-08-02", "label": "Lisbon"}] keyed by trip start date; only labels the user confirmed or that the timezone makes unambiguous. Returns the file path; set return_html=True when the client cannot read local files (e.g. Claude Desktop).

NameRequiredDescriptionDefault
actionsYes
calloutsNo
headlineNo
subtitleNo
return_htmlNo
travel_noteNo
trip_labelsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it states that the tool returns a file path and when to use return_html for clients that cannot read local files. It adds guardrails such as grounding actions in payload numbers and only using confirmed callouts/trip labels, though it omits file overwrite behavior or file location details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by compact parameter-specific guidance and return behavior. Every sentence adds useful constraints or examples, and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a seven-parameter render tool with no output schema and no annotations, the description is fairly complete: it explains parameter formats, data grounding rules, and return behavior. It could be richer about where the file is written and whether existing files are overwritten, but the core call contract is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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. It documents all seven parameters, including exact action count and fields, example shapes for callouts and trip_labels, and the purpose of return_html, adding substantial meaning beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: render the single-file dashboard with the story from the payload. It is clearly distinct from data-query siblings such as dashboard_payload, though it does not explicitly name the alternative tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is used after composing a story from the payload, and it gives a conditional for return_html when the client cannot read local files. It does not explicitly state when to use this versus dashboard_payload or other output tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rolling_baselineB

Each day's value against your own trailing baseline, with a z-score. |z| > 2 is unusual for you.

NameRequiredDescriptionDefault
metricNosteps
window_daysNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does add useful behavioral meaning by explaining the z-score threshold for unusual values. However, it does not state whether the tool is read-only, what data source it uses, or any access constraints, leaving operational transparency incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no wasted language, and the core concept plus the interpretation threshold are front-loaded. It is appropriately sized for a simple analytics tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and has an output schema, so the description need not explain return shape. Still, for a two-parameter tool with 0% schema description coverage and no annotations, the description leaves important invocation details and sibling differentiation unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain the two parameters. It only vaguely implies a daily metric and a trailing baseline window, without clarifying what `metric` accepts, what `window_days` controls, or what the defaults mean.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly communicates that the tool computes each day's value against a personal trailing baseline and returns a z-score. It does not explicitly distinguish this from siblings such as monthly_trends or compare_periods, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an interpretation rule for the output (|z| > 2 is unusual), but it does not say when to use this tool versus alternatives like monthly_trends or compare_periods. There are no exclusions or context-setting instructions for selecting this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_sqlB

Run a read-only DuckDB query. Main table: daily. Others: hourly_steps, exercise, sleep_sessions, weight, day_tz, day_home.

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden; it does state the operation is read-only, which is the single most important safety fact for a SQL tool. However it is silent on row limits, the default limit of 200, timeouts, error behavior on invalid SQL, and whether any statement other than SELECT is rejected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the read-only constraint and the main table front-loaded before the supporting table list. Every clause gives the agent information it could not get from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value explanation is unnecessary, and the table inventory covers the hardest part of using a raw-SQL tool. The remaining gap is the undocumented `limit` parameter and the absence of routing guidance against the specialized siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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; it partially does by enumerating the available tables, which is essential semantic context for constructing the `query` argument. It says nothing at all about the `limit` parameter (its default 200, whether it can be raised, or what it does to wrapped queries), leaving half the surface undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Run a read-only DuckDB query') and immediately names the primary table plus six secondary tables, which tells an agent exactly what domain it is querying. It is distinguishable from the analytics siblings (overview, monthly_trends, trips), though it never explicitly frames itself as the raw-SQL escape hatch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use raw SQL versus the many purpose-built siblings (overview, sleep_timing, hourly_profile, etc.), and no stated prerequisites, cost, or row-limit warnings. The agent must infer that this is the fallback for questions the specialized tools cannot answer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

schemaA

Tables and columns available to run_sql.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. It states the content the tool exposes but does not explicitly confirm read-only behavior, side effects, or whether the result is cached or live schema metadata.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no redundant or wasted wording. It communicates the core resource immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity, zero parameters, and lack of an output schema, the description is almost complete. It could add a brief note on return format or usage sequencing, but the essential purpose is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to explain. The baseline score of 4 applies because no additional parameter guidance is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource clearly: tables and columns available for SQL execution. It also ties the schema to the sibling tool run_sql, though it does not use a direct verb like 'returns' or 'lists' and 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Mentioning 'available to run_sql' implies that this tool should be consulted before writing SQL, but it does not explicitly state when to call it, when not to, or what alternative exists. Usage is inferred rather than prescribed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_periodsA

Save the periods to compare, e.g. [{"name": "Before", "start": "2025-01-01", "end": "2025-06-30"}, {"name": "After", "start": "2025-07-01"}]. end empty means today. Optional tz_offsets (["+01:00"]) overrides automatic travel detection for that period. Pass [] to go back to the 90-day default.

NameRequiredDescriptionDefault
periodsYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does well: it discloses that periods are saved, that an empty end means today, that tz_offsets overrides automatic travel detection, and that [] restores the 90-day default. It leaves out overwrite semantics, return behavior, and error conditions, so it is not fully complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action, followed by a concrete example and then the key default/reset behaviors. Every sentence adds useful information, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter configuration tool with no output schema and no annotations, the description supplies the essential examples, defaults, and reset behavior. Minor gaps remain around whether saved periods overwrite prior periods and whether tz_offsets belongs inside each period object, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the schema only shows a generic periods array, so the description must compensate. It does so by showing the expected object fields (name, start, end), explaining the empty-end default, and documenting optional tz_offsets and the reset value. It still does not formally state which fields are required within each period object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: save periods used for comparison. The example makes the intended data shape clear. However, it does not explicitly distinguish this configuration tool from the sibling compare_periods tool, leaving the relationship to be inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'Save the periods to compare' and by the reset behavior 'Pass [] to go back to the 90-day default.' There is no explicit statement of when to call this versus compare_periods or the dashboard/reporting siblings, and no when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sleep_timingC

Bedtime, wake time, sleep hours, split nights and bedtime consistency (std dev in minutes) per period.

NameRequiredDescriptionDefault
home_onlyNo

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It usefully defines bedtime consistency as a standard deviation in minutes, but it never states that this is a read/computation, what data is required, or how 'per period' works when the schema exposes no period parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one compact, front-loaded sentence with no filler, and the metric list is efficiently presented. It is a fragment rather than a fully structured definition, but it avoids waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool, listing returned metrics is helpful. Still, with no annotations, no output schema, and no explanation of home_only or period handling, an agent lacks enough context to invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, home_only, is neither explained nor mentioned, and schema description coverage is 0%. The phrase 'per period' suggests a period input, but no such parameter exists, making the input semantics particularly unclear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the sleep metrics reported (bedtime, wake time, sleep hours, split nights, consistency), so the resource is identifiable. However, it is a bare noun phrase with no verb and no boundary against siblings such as overview, monthly_trends, or compare_periods, leaving differentiation to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool instead of siblings like overview, monthly_trends, compare_periods, or rolling_baseline. It also gives no prerequisites or exclusions, only an implied scope of sleep timing per period.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tripsB

Trips detected from the phone's timezone (no location data needed), each compared with the 30 home days before it, plus the overall travel effect on steps, sleep and heart rate.

NameRequiredDescriptionDefault
min_daysNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses the detection method (timezone-based) and comparison baseline (30 home days before each trip), but omits data requirements, permissions, and return structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no wasted words and front-loads the core purpose. It could be slightly clearer if the comparison and output clauses were structured separately, but it remains appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The core analysis is described, but important gaps remain: min_days is unexplained, no data prerequisites are stated, and there is no indication of what the response looks like despite having no output schema. An agent would need to infer usage and parameter behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, min_days, has 0% schema description coverage and is never mentioned in the description. The description therefore fails to compensate for the low schema coverage and leaves the parameter's meaning unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific analytical resource: trips detected from phone timezone, each compared to 30 prior home days, with travel effects on steps, sleep, and heart rate. It implicitly distinguishes itself from detect_locations by saying no location data is needed, though it does not name that sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as detect_locations or other trend tools. It also does not state prerequisites like ingested data or timezone availability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

weekday_profileC

Average of a metric per weekday (Mon..Sun), per period. Useful for weekend effects (Sat/Sun vs Fri/Sat).

NameRequiredDescriptionDefault
metricNosteps
home_onlyNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full disclosure burden, and it discloses very little: it does not say what 'per period' means, where periods come from, how the average is computed (mean of daily values? weighted?), what the result looks like, or what happens with missing days. Only the aggregation intent is conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core operation front-loaded and the use case second; nothing is wasted. It is brief to the point of under-specification rather than verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an analytical tool with two undocumented parameters, no annotations, and no output schema, the description leaves key questions open: which periods are used, and what home_only filters. It is not sufficient on its own to call this tool confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 and it does not. It mentions 'a metric' but never enumerates valid metrics, and the home_only boolean parameter is never mentioned at all despite materially changing the data source.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific computation (average of a metric) over a specific dimension (weekday Mon..Sun) and scope (per period), which distinguishes it from hourly_profile and monthly_trends. It stops short of naming a sibling explicitly, so it is clear but not maximally differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gives a concrete analytic use case (weekend effects, Sat/Sun vs Fri/Sat), which is genuine usage context. However, it never states when to prefer this over hourly_profile or monthly_trends, nor any prerequisites such as periods needing to be set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

workoutsC

Recorded exercise sessions grouped by month, period and type.

NameRequiredDescriptionDefault
endNo
startNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses that results are grouped by month, period, and type, but says nothing about read-only behavior, authentication, pagination, defaults, or how the start/end parameters affect the result set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no filler and the grouping dimensions are front-loaded. It is appropriately sized, though its terseness contributes to the gaps in parameter and usage guidance rather than compensating for them.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, but the description still leaves start/end semantics, usage context, and basic behavioral expectations unaddressed. For a two-parameter data retrieval tool with no annotations and zero schema description coverage, it is not complete enough to guide reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description never mentions the start or end parameters. With two undocumented parameters and no compensating explanation in the description, an agent cannot tell whether they are date bounds, period identifiers, or something else.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource (recorded exercise sessions) and the grouping dimensions (month, period, type), but it is a noun phrase with no action verb, so it does not explicitly state what the tool does with them. An agent can infer retrieval, but the purpose remains implicit rather than clearly stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as trips, monthly_trends, or overview. The name and description imply it returns workout data, but no conditions, prerequisites, or exclusions are provided.

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.

  1. 16 tool updatesv0.1.0
    • First observedcompare_periods
    • First observeddashboard_payload
    • First observeddetect_locations
    • First observedhourly_profile
    • First observedingest_export
    • First observedmonthly_trends
    • First observedoverview
    • First observedrender_dashboard
    • First observedrolling_baseline
    • First observedrun_sql
    • First observedschema
    • First observedset_periods
    • First observedsleep_timing
    • First observedtrips
    • First observedweekday_profile
    • First observedworkouts

TDQS

B3.2/5.0

Scored across 16 tools

Disambiguation4/5

Each tool targets a distinct analysis surface (trends, periods, trips, sleep, workouts, SQL). There is mild overlap between overview and dashboard_payload (both summarize the dataset), and between trips and detect_locations (both derive travel), but descriptions make the split between summary/payload and analysis/raw-timeline reasonably clear.

Naming Consistency3/5

All names are snake_case and readable, but the convention is mixed: several are verb_noun (ingest_export, set_periods, render_dashboard, compare_periods, run_sql) while others are bare nouns (overview, trips, workouts, schema, sleep_timing). The inconsistency is minor but visible across 16 tools.

Tool Count4/5

16 tools is just over the comfortable band but justified by a genuinely broad analytics domain (ingestion, overview, trends, profiles, comparisons, travel, SQL escape hatch, dashboard). No single tool looks trivially redundant, though the overview/dashboard_payload pair could likely merge.

Completeness4/5

Coverage is strong: ingestion, schema inspection, raw SQL, period definition, trends, comparisons, profiles, sleep, baselines, trips, workouts, and dashboard output. Minor gaps exist around exporting analysis results or persistent saved analyses, but agents can work around them via run_sql.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables Claude Desktop to access and analyze Garmin wearable health data including sleep, HRV, Body Battery, and activity metrics. Users can query their health trends, track recovery, and generate interactive HTML dashboards using natural language.
    9
    6
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables Claude to answer natural language questions about your Apple Health data by analyzing local CSV exports, supporting metrics like steps, heart rate, sleep, and more.
    6
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides Claude with real-time access to local health data including sleep, recovery, strain, and workouts from WHOOP and Apple Health, enabling informed context-aware interactions.
    6
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables Claude clients to read Oura Ring sleep, heart rate, readiness, and activity data; log, delete, and query home glucose, ketone, weight, blood pressure, and nutrition readings; and ingest Apple Health data via Health Auto Export.
    33 npm
    MIT