ownmetrics-mcp
Provides read-only access to your own Garmin Connect data through Garmin's Personal API, including sleep, HRV, stress, Body Battery, heart rate, activities, body metrics, and account/key status.
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., "@ownmetrics-mcpCheck my Garmin connection, then summarize my sleep and HRV for the last week."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ownmetrics-mcp
Ask Claude, ChatGPT or any MCP-capable AI app about your own Garmin data: sleep, HRV, stress, Body Battery, heart rate, activities and more. It uses Garmin's official Personal API, runs on your own computer, and is read-only.
Unofficial project. Not affiliated with, endorsed by or supported by Garmin. "Garmin" and "Garmin Connect" are trademarks of Garmin Ltd. or its subsidiaries. Results are informational, not medical advice.
Status: v0.1 (preview). The nine data tools below work today. Insight tools (weekly training summary, period comparisons, trends, FIT analysis) are next.
What you can ask
"How did I sleep this week? Which night was worst, and why?"
"Show my HRV for the last 30 days. Is it trending down?"
"What were my stress and Body Battery like yesterday?"
"List my runs this month with distance and average pace."
"Break down my last long ride: power, heart rate, training effect."
"How has my resting heart rate changed since September?"
"Is my Garmin connection working?"
Related MCP server: Garmin Connect MCP
Set up in about 10 minutes
You need a Garmin Connect account and an AI app that supports MCP servers (Claude Desktop, Claude Code, ChatGPT desktop, Cursor and others).
1. Install uv (one time)
uv runs Python tools without any manual setup.
macOS / Linux: open Terminal and run
curl -LsSf https://astral.sh/uv/install.sh | shWindows: open PowerShell and run
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
2. Create your Garmin Personal API key
Sign in to Garmin Connect on the web and open Settings → Personal API.
Select Create Key, read and accept Garmin's terms, and choose how long the key lasts (30 days to a year; your choice).
Copy the key. Garmin shows it only once.
3. Save the key
uvx --from git+https://github.com/badisbenhamida/ownmetrics-mcp ownmetrics-mcp authPaste the key when asked (it stays hidden). It is checked with Garmin, then saved to
~/.config/garmin/connect-personal-api-key, readable only by you.
4. Add it to your AI app
Claude Desktop: Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"ownmetrics": {
"command": "uvx",
"args": ["--from", "git+https://github.com/badisbenhamida/ownmetrics-mcp", "ownmetrics-mcp"]
}
}
}Restart Claude Desktop.
Claude Code:
claude mcp add ownmetrics -- uvx --from git+https://github.com/badisbenhamida/ownmetrics-mcp ownmetrics-mcpOther apps: use command uvx with the same arguments as above.
Then ask: "Check my Garmin connection, then summarize my sleep and HRV for the last week."
Tools
Tool | What it returns |
| One day: steps, distance, floors, heart rate, stress, Body Battery, calories, intensity minutes, sleep |
| Per night: hours, deep/light/REM/awake, score, Garmin's feedback, heart rate, respiration |
| Per night: HRV last-night and weekly average, 5-minute high, status, baseline |
| Per day: stress level, time in each stress band, Body Battery high/low/charged/drained |
| One day: resting, min, max, 7-day resting average; your heart rate zones |
| Activities in a date range, optionally by type, with duration, distance, heart rate |
| One activity: pace, speed, power, cadence, training effect and load, splits |
| Weigh-ins, BMI, body fat, hydration; Pulse Ox and fitness age |
| Whether your key works, a warning in its final day, which data areas respond |
Every field name carries its unit (resting_hr_bpm, distance_km, sleep_score_0_100).
Where Garmin has no value, the field says "not recorded", never zero.
What Garmin's Personal API does not provide
Read-only: nothing can be sent to your watch or written to Garmin Connect.
Not available: training readiness, training status, acute/chronic load, VO2 max, gear and devices. The tools say "not provided by Garmin's Personal API" rather than guessing.
Questions are limited to 90 days at a time; the server splits requests to stay within Garmin's own limits.
Privacy and security
Runs on your computer. Talks only to Garmin. No database, no telemetry.
Your AI app sends tool results to its AI model, under that provider's terms.
Your key never appears in tool results, logs or errors.
Delete the key in Garmin Connect at any time to cut off access instantly.
Details: PRIVACY.md · THREAT_MODEL.md · Report vulnerabilities: SECURITY.md
Use of Garmin's API is subject to Garmin's terms: your key is personal to you and must not be shared.
Troubleshooting
"Garmin rejected your Personal API key": it expired or was deleted. Create a new one and run step 3 again. Garmin emails a reminder about a week before a key expires.
The AI app doesn't see the tools: restart the app fully. On macOS, if
uvxisn't found, use its full path (runwhich uvxin Terminal) as thecommand.Check the connection yourself:
uvx --from git+https://github.com/badisbenhamida/ownmetrics-mcp ownmetrics-mcp status
How it's built
This project is built with spec-driven development. SPEC.md holds numbered requirements and the non-negotiable rules; every requirement traces to tests in TRACEABILITY.md, which CI regenerates and checks on every change. Contributions follow the same path: see CONTRIBUTING.md.
Built on Garmin's official connect-personal-api-python client and the Model Context Protocol Python SDK.
License
Available Tools
9 toolsget_account_statusARead-onlyIdempotent
T9. Check the Garmin connection: whether the key works, granted scopes, a warning if the key expires within a day, which data areas respond, and what Garmin does not provide. Use this first when something fails. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, but the description adds real value beyond them: it describes the diagnostic payload, warns about keys expiring within a day, and gives interpretation rules ('not recorded' means missing, never zero). The 'informational, not medical advice' framing is useful caution but the sentence about unrecorded fields is the genuinely load-bearing piece.
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: what it checks, when to call it, then how to read the results. The only wasted token is the opaque 'T9.' prefix, which carries no meaning for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and no parameters, the description only needs to supply interpretation context, which it does: it explains the expiry warning and the 'not recorded' semantics that an agent would otherwise misread as zero. Nothing required for correct invocation or result reading is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline applies. No misleading claims are made about inputs.
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 ('Check the Garmin connection') and enumerates exactly what the check reports: key validity, granted scopes, expiry warning, responding data areas, and Garmin's gaps. This is clearly distinguishable from the sibling data-fetching tools (get_sleep, get_heart_rate, etc.), which return measurements rather than connection diagnostics.
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 explicit routing guidance: 'Use this first when something fails,' which tells the agent this is the diagnostic entry point before retrying data calls. It does not name a specific alternative or state when not to use it, but given the siblings are all domain data getters, the exclusion is nearly self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_activityARead-onlyIdempotent
T7. Details of one activity by id: duration, distance, pace, speed, heart rate, power, cadence, training effect and load, splits and structured workout steps. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes | Activity id from list_activities. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive safety, but the description adds genuinely non-obvious semantics: missing fields read as 'not recorded' rather than zero, and results are informational not medical. Both prevent real misinterpretation of the returned data. It does not discuss rate limits or payload size, so not a 5.
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?
Front-loaded with the core action, then the field inventory, then two short caveats that each earn their place. The leading 'T7.' tag is unexplained internal notation that adds no meaning for an agent calling the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't restate return structure, yet it helpfully signals the field categories and, critically, how to interpret absent values. Combined with read-only/idempotent annotations and a fully documented single parameter, nothing needed to call this 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?
One parameter at 100% schema coverage, and the schema itself explains the id comes from list_activities. The description's 'by id' adds nothing beyond the schema, so this sits at the baseline 3 for well-documented schemas.
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 ('Details of one activity by id') and enumerates exactly what comes back (duration, pace, heart rate, splits, workout steps), which clearly separates it from the sibling list_activities. An agent knows immediately this is the single-record detail fetch.
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 'one activity by id' phrasing plus the schema note tying the id to list_activities gives clear usage context: list first, then fetch details here. It stops short of naming alternatives explicitly or stating when not to use it (e.g., for aggregate ranges), so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_body_metricsARead-onlyIdempotent
T8. Body metrics over a date range: weigh-ins (kg), BMI, body fat, hydration; plus Pulse Ox (SpO2) and fitness age as of the end date. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Last date, YYYY-MM-DD (inclusive); at most 90 days after start. | |
| start | Yes | First date, YYYY-MM-DD (inclusive). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description still adds genuine behavioral context the annotations cannot: missing fields are reported as 'not recorded' rather than zero, and results are informational rather than medical advice - both directly shape how an agent should interpret and relay data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the metric list, then the date-range semantics, then the caveat. The only waste is the leading 'T8.' identifier, which carries no meaning for an agent choosing a tool.
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?
An output schema exists, so return values need not be spelled out, and the schema covers both parameters completely. Combined with a strong annotation set, the description supplies the one thing structured fields cannot - the 'not recorded' sentinel semantics - leaving little an agent would need that 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 coverage is 100% and both parameters are fully documented in the schema, including the inclusive YYYY-MM-DD format and the 90-day cap, so the baseline is 3. The description does add one useful nuance - that 'end' is also the snapshot date for SpO2 and fitness age - but that is a small increment over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete resource contents - weigh-ins in kg, BMI, body fat, hydration, SpO2 and fitness age - over a date range, which is far more specific than a generic 'get body metrics'. It does not explicitly differentiate itself from siblings like get_daily_overview or get_account_status, but the enumerated fields make the scope 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?
Usage is implied by the content ('body metrics over a date range', 'as of the end date') rather than stated. There is no explicit 'use this when...' or 'use X instead for...' guidance against the eight sibling tools, so an agent must infer that this is the body-composition/SpO2 source rather than, say, the sleep or HR one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_overviewARead-onlyIdempotent
T1. One day's overview: steps, distance, floors, resting/min/max heart rate, stress, Body Battery, calories, intensity minutes, sleep hours and sleep score. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date as YYYY-MM-DD, e.g. 2026-10-25. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, and the description adds genuinely useful context beyond them: results are informational only, and missing fields surface as 'not recorded' rather than zero. That prevents a real misinterpretation an agent would otherwise make. It doesn't mention timezone semantics or how partial days behave, keeping it short of a 5.
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 metric list is dense but front-loaded and the caveat sentences each earn their place. The leading 'T1.' token is wasted and unexplained, the only real structural blemish.
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?
An output schema exists so return shape needn't be explained, and the description still names the returned metrics plus the sentinel-value caveat. For a single-date read tool this is close to complete; only usage routing against siblings 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 coverage is 100% and the parameter has a format example, so the schema does the work. The description adds nothing about the date parameter, which is the correct baseline-3 outcome when the schema is fully documented.
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 resource (one day's overview) and enumerates exactly which metrics it aggregates, which implicitly distinguishes it from the single-metric siblings like get_sleep or get_heart_rate. It never names a sibling explicitly, and the opaque 'T1.' prefix adds no meaning.
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 word 'overview' implies this is the aggregate daily fetch rather than a targeted metric call, but the description never states when to prefer it over get_heart_rate/get_sleep or whether it should be the first call in a daily workflow. Usage is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_heart_rateARead-onlyIdempotent
T5. One day's heart rate (resting, min, max, 7-day resting average) and the user's heart rate zones. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date as YYYY-MM-DD, e.g. 2026-10-25. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavioral context: results are informational not medical, and missing Garmin fields are returned as the literal string 'not recorded' and must not be coerced to zero — a real correctness hazard the agent otherwise could not know.
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 tight sentences, front-loaded with the returned fields before the caveats. The only wasted element is the unexplained 'T5.' prefix, which costs a little clarity without earning space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it does cover the two things an agent must know: the informational disclaimer and the null-sentinel semantics. It does not address how the single date is interpreted (timezone/local day), a minor remaining gap for a daily-metric 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?
Only one parameter, and the schema already documents it fully at 100% coverage with format and example. The description's phrase 'one day's' usefully confirms the date is a single day rather than a range, but adds no further syntax or formatting meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (one day of heart rate data) and enumerates exactly what is returned (resting, min, max, 7-day resting average, plus heart rate zones), which distinguishes it from get_hrv and get_daily_overview. It does not explicitly name a sibling tool to route away from, and the leading 'T5.' token is opaque to an agent.
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?
'One day's heart rate' implies a single-date scope, and the 'not recorded' caveat tells an agent how to interpret results, but there is no explicit statement of when to prefer this over get_daily_overview or get_hrv. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hrvARead-onlyIdempotent
T3. Heart rate variability (HRV) per night over a date range: last-night average, weekly average, 5-minute high, status and personal baseline, in milliseconds. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Last date, YYYY-MM-DD (inclusive); at most 90 days after start. | |
| start | Yes | First date, YYYY-MM-DD (inclusive). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: values are in milliseconds, missing Garmin data is returned as 'not recorded' rather than zero, and results are informational not medical. It does not discuss rate limits or data latency.
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 compact sentences, front-loaded with the resource and scope, then the unit, then the interpretation caveats. The leading 'T3.' token is unexplained noise, but no sentence is redundant.
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?
An output schema exists, so return shape needn't be explained; the description instead supplies the two things an agent would otherwise get wrong — units and the 'not recorded' sentinel. Combined with full schema coverage and a complete annotation set, an agent has what it needs to call this 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?
Schema description coverage is 100%, including the 90-day maximum span on 'end', so the schema carries the parameter burden and baseline 3 applies. The description confirms the date-range framing and adds units for the returned values but contributes nothing about the start/end semantics that isn't already structured.
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 (get) and a specific resource (heart rate variability per night over a date range) and enumerates the returned measures (last-night average, weekly average, 5-minute high, status, personal baseline) in milliseconds. This is clearly distinguishable from siblings like get_heart_rate or get_sleep by resource. It stops short of explicitly naming a sibling to disambiguate against.
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?
Usage is implied by the resource and the date-range constraint, but there is no explicit when-to-use/when-not guidance relative to get_heart_rate, get_sleep, or get_daily_overview. The one instruction given ('never treat not recorded as zero') is about interpreting output, not about selecting the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleepARead-onlyIdempotent
T2. Sleep per night over a date range: hours, deep/light/REM/awake minutes, sleep score, Garmin's feedback, average heart rate, respiration and sleep stress. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Last date, YYYY-MM-DD (inclusive); at most 90 days after start. | |
| start | Yes | First date, YYYY-MM-DD (inclusive). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the description's real contribution is the data-quality contract: missing fields read 'not recorded' and must never be coerced to zero, plus the informational-not-medical caveat. That is genuine behavioral context an agent could otherwise get wrong, though it says nothing about pagination or the 90-day limit (left to the 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 dense sentences with the resource and date-range scope front-loaded, followed by the caveats. Only the unexplained 'T2.' prefix and the redundant field list (already implied by the output schema) keep it from a 5.
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?
An output schema exists, so the field enumeration is arguably redundant, but the description supplies what the schema cannot: the missing-data semantics and the not-medical-advice framing. Combined with complete parameter docs and full annotations, an agent has enough to call this 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?
Schema coverage is 100% and both parameters are fully documented there, including the inclusive YYYY-MM-DD format and the 90-day cap. The description adds only the loose phrase 'over a date range' and no format or boundary detail, so the baseline 3 applies.
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 resource (per-night sleep) and enumerates the exact metrics returned (stages, score, HR, respiration, stress), which implicitly separates it from get_hrv and get_stress_and_body_battery. It never explicitly names a sibling it is not, and the leading 'T2.' token is unexplained noise, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The domain makes usage fairly obvious, but there is no explicit statement of when to pick this over get_daily_overview or get_hrv, and no prerequisites. The only guidance given is interpretive ('not medical advice'), not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stress_and_body_batteryARead-onlyIdempotent
T4. Per day over a date range: average stress (0-100), minutes in each stress band, and Body Battery high, low, charged and drained. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Last date, YYYY-MM-DD (inclusive); at most 90 days after start. | |
| start | Yes | First date, YYYY-MM-DD (inclusive). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a safe, idempotent read, and the description adds meaningful behavioral context: results are informational, not medical advice, and missing Garmin fields are reported as “not recorded” rather than zero. That missing-data caveat is especially useful beyond what the 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 three short sentences and front-loads the metrics returned, with no wasted prose. The unexplained “T4.” prefix is slightly opaque, but otherwise the structure is 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?
Given the rich annotations, full parameter schema, and existing output schema, the description is close to complete: it adds the important null-handling rule and disclaimer. It still leaves cross-tool selection ambiguity unresolved, which keeps it from a 5.
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 100%, and the schema already documents the YYYY-MM-DD format and the 90-day maximum for end. The description only says “per day over a date range” and adds no syntax or constraint details beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource and the exact metrics returned: average stress, stress-band minutes, and Body Battery high/low/charged/drained over a date range. It is clear what the tool does, but it does not differentiate itself from siblings such as get_body_metrics or get_daily_overview.
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?
Usage is implied by “per day over a date range” and the listed metrics, so an agent can infer it retrieves daily stress and Body Battery data. However, there are no explicit when-to-use/when-not guidelines and no alternatives named, leaving ambiguity against related body-metric tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_activitiesARead-onlyIdempotent
T6. List activities in a date range, newest first, optionally filtered by Garmin activity type key (e.g. running, cycling, indoor_cycling, lap_swimming, strength_training). Returns ids for get_activity. Results are informational, not medical advice. Fields Garmin did not record say 'not recorded'; never treat them as zero.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Last date, YYYY-MM-DD (inclusive); at most 90 days after start. | |
| limit | No | Maximum activities, 1-100. | |
| start | Yes | First date, YYYY-MM-DD (inclusive). | |
| activity_type | No | Optional Garmin activity type key, e.g. 'running'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description doesn't need to repeat that. It instead adds genuinely non-obvious result behavior: newest-first ordering, and the crucial sentinel rule that unrecorded fields say 'not recorded' and must never be read as zero. The medical-advice disclaimer is boilerplate but sets expectations for informational data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with what the tool does and its ordering, then the downstream id hand-off, then data caveats. The 'T6.' prefix is meaningless noise to a calling agent, and the medical-advice line is filler, but nothing else wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return shape, and it correctly spends its words on usage and data-interpretation caveats instead. One gap: it omits the 90-day maximum span between start and end, which is a hard constraint an agent could violate, though the schema does document it.
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 100%, so the baseline is 3; the description earns an extra point by listing concrete example values for the otherwise unconstrained, enum-less activity_type string (running, cycling, indoor_cycling, lap_swimming, strength_training). That is meaningfully more than the schema's bare 'e.g. running'.
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 activities'), the scope (date range), ordering (newest first), and an optional filter with concrete activity-type keys. It also distinguishes itself from the sibling get_activity by declaring 'Returns ids for get_activity', so an agent knows this is the discovery step, not the detail step.
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 'Returns ids for get_activity' clause gives explicit downstream routing: use this to enumerate, then call get_activity for full details. It also implies date-range filtering as the primary selection mechanism. It stops short of naming when *not* to use it (e.g. fetching a single known activity), but the context is otherwise clear.
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.
9 tool updates
v0.1.0- First observed
get_account_status - First observed
get_activity - First observed
get_body_metrics - First observed
get_daily_overview - First observed
get_heart_rate - First observed
get_hrv - First observed
get_sleep - First observed
get_stress_and_body_battery - First observed
list_activities
TDQS
Scored across 9 tools
Most tools target clearly distinct data areas: stress/body battery, heart rate, sleep, HRV, activities, body metrics, and account status. The main overlap is that get_daily_overview aggregates heart rate, stress, Body Battery, and sleep, which can be confused with the dedicated metric tools, though the descriptions distinguish one-day summary from range-specific detail.
All tool names follow a consistent snake_case verb_noun pattern, using get_* for metric retrieval and list_* for collections. There are no mixed conventions or vague verbs.
Nine tools is well-scoped for a read-only Garmin health and fitness data server. Each tool covers a distinct data area or essential diagnostic function, and none appear redundant.
The surface covers core health metrics (sleep, HRV, heart rate, stress, Body Battery, body metrics), activity listing and detail retrieval, and account diagnostics. Minor gaps exist for specialized Garmin metrics like training readiness, VO2 max, or planned workouts, but core workflows are covered.
Maintenance
Related MCP Connectors
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Your Garmin, Oura, WHOOP, Hevy and 35 more fitness apps, queryable from your own AI.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceExposes personal Garmin wellness data through MCP tools for accessing summary, sleep, HRV, heart rate, stress, body battery, and historical data.MIT
- AlicenseBqualityDmaintenanceExposes personal Garmin Connect data to MCP-capable clients like Claude and Gemini. Enables querying daily stats, heart rate, sleep, activities, and managing workouts.16MIT
- FlicenseAqualityDmaintenanceProvides read-only access to your Garmin Connect health data, including sleep, HRV, body battery, stress, training readiness, and activities, through an MCP server.214-
- AlicenseNot gradedqualityCmaintenanceEnables LLMs and MCP clients to securely access your Garmin Connect health and running data, including daily wellness metrics, activity details, training status, and race predictions, for personalized coaching and analysis.MIT