Skip to main content
Glama

Garmin → Claude MCP server

Analyze your own Garmin Connect data — activities, sleep, HRV, Body Battery, training readiness — right inside Claude Desktop.

A fully local, read-only MCP server that lets you analyze your own Garmin Connect data in Claude Desktop. The server runs as a local child process of Claude Desktop and talks to it over stdio.

Guiding principles

  • 100% local — nothing is hosted or exposed to the network (stdio).

  • Read-only — there is no write endpoint to Garmin.

  • No third party — the only network contact is Garmin. No telemetry, no external logging.

  • Passwordless at runtime — the password is never stored; after the one-time login only local tokens are used.

Related MCP server: Garmin Health MCP Server

Requirements

  • Node.js ≥ 20 (tested with Node 22 LTS), npm.

  • A Garmin Connect account.

Setup (4 steps)

# 1) Install dependencies
npm install

# 2) Milestone test: does the client get through Garmin's Cloudflare protection?
npm run smoke
#    Expectation: "Status 200" and "Challenge: no".

# 3) One-time interactive login (prompts for email, hidden password, MFA if enabled)
npm run login
#    Creates ~/.garmin-mcp/tokens.json (mode 0600). The password is NOT stored.

# 4) Compile TypeScript to build/
npm run build

Connecting Claude Desktop

Claude Desktop → Settings → Developer → Edit Config. Add the server with its absolute path (claude_desktop_config.json):

{
  "mcpServers": {
    "garmin": {
      "command": "node",
      "args": ["/absolute/path/to/garmin-mcp/build/mcp/server.js"]
    }
  }
}

Then restart Claude Desktop. Try it in chat, e.g.:

"Am I logged in to Garmin? Use whoami." "Show me my daily summary and my recent activities."

Updating

git pull
npm install      # dependencies may have changed
npm run build    # build/ is not part of the repo

Then restart Claude Desktop. It runs the server as a child process, and a running instance keeps the code it loaded at startup — so an update only takes effect after a restart.

Your login survives an update: ~/.garmin-mcp/tokens.json is untouched and the path in claude_desktop_config.json stays the same. Only re-run npm run login if a tool actually reports 🔒 Not logged in.

Available tools

13 read-only tools. Date parameters are YYYY-MM-DD (default = today); ranges default to the last ~4 weeks. Several tools take a metrics[] / include[] selector, so one tool covers many data types (this keeps the tool list small for good tool selection). Long time series in responses are truncated to stay compact.

Tool

Description

whoami

Connection check + account profile

get_daily_health

Daily wellness for a date — metrics[]: summary, sleep, stress, heart_rate, hrv, spo2, respiration, hydration, steps, floors, intensity_minutes, body_battery, body_battery_events, stats_and_body

get_training

Training for a date — metrics[]: readiness, morning_readiness, status, vo2max, fitness_age

get_fitness

Fitness/performance — metrics[]: race_predictions, cycling_ftp, lactate_threshold, personal_records, endurance_score, hill_score, resting_heart_rate, weekly_intensity_minutes (startDate/endDate)

get_weight

Body weight & composition over a range (include_raw also returns weigh-ins)

get_steps_history

Step totals over a range — granularity: daily or weekly

get_activity

One activity by activityId — include[]: summary, splits, weather, details, hr_zones, exercise_sets

list_activities

Recent activities, or by date range/type (limit/startDate/endDate/type)

get_devices

Paired Garmin devices

get_user_profile

User profile & settings (units, preferences)

get_goals

Goals (status: active/future/past, limit)

get_workouts

Saved workouts (limit)

get_scheduled_workouts

Scheduled workouts / calendar (year/month)

How it works

The server registers each Garmin data method as an MCP tool and talks to Claude Desktop over stdio. Every call goes through a generic connectapi() request to connectapi.garmin.com with a bearer token, sent via cycletls so the TLS fingerprint looks like a real browser (Garmin sits behind Cloudflare).

Authentication happens once (npm run login): a login cascade — mobile iOS JSON login first, the classic widget/CSRF flow as fallback — yields a CAS service ticket, which is exchanged in Garmin's DI-OAuth2 flow for an access + refresh token. The tokens are cached locally and the access token is refreshed automatically on expiry; your password is never stored.

Security model

  • The password is never stored — it is only used for the one-time login.

  • Tokens live at ~/.garmin-mcp/tokens.json with file mode 0600 (only you can read them).

  • The access token is renewed automatically via the refresh token when it expires.

  • Read-only: there is no code path that changes anything on Garmin.

  • No telemetry, no external logging. Diagnostics go to stderr only (never over the stdio MCP channel).

Architecture (layers)

  • src/http/impersonate.ts — TLS impersonation via cycletls (JA3 fingerprint) + cookie jar, so Garmin's bot protection lets us through.

  • src/http/smoke.ts — milestone test against sso/embed.

  • src/garmin/auth.ts — login cascade (mobile iOS JSON login → widget/CSRF fallback) + MFA + DI-OAuth2 ticket exchange + refresh.

  • src/garmin/tokens.ts — local token cache (0600).

  • src/garmin/client.ts — generic connectapi() + typed, read-only data methods.

  • src/mcp/server.ts — MCP server and tool registration; served over stdio via serveStdio (MCP TypeScript SDK v2), which answers both 2025-era clients such as Claude Desktop and the 2026-07-28 protocol revision.

  • src/cli/login.ts — one-time interactive login.

Development

npm run build     # tsc -> build/
npm test          # unit tests for the pure helpers (no network, no credentials)
npm run smoke     # milestone test against Garmin's Cloudflare (needs network)
npm run login     # one-time interactive login (needs your credentials)
npm start         # run the built server directly (normally Claude Desktop does this)

CI (.github/workflows/ci.yml) runs npm ci, npm run build and npm test on Node 22. build doubles as the type-check. smoke and login are deliberately excluded — they need live Garmin access and real credentials, and would be flaky.

npm test covers the pure helpers only (trimLongArrays, decodeJwtExp, toSearchParams) and never imports the MCP SDK, so a green test run says nothing about tool registration. After changing tools or upgrading dependencies, probe the server over stdio. No Garmin credentials are needed — registration and argument validation both happen before any authentication:

npm run build
printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
  | node build/mcp/server.js

Expect an initialize reply plus a tools/list reply containing all 13 tools with their input schemas. To also confirm that argument validation still bites, add one more line to the printf above — it should come back as a tool result with "isError": true and an Input validation error: … text, not as a login error:

'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_activity","arguments":{"activityId":"not-a-number"}}}' \

Dependencies are updated by Dependabot (.github/dependabot.yml, weekly). The npm updates arrive as one grouped PR that can include major versions, so read its package.json diff before merging, and run the stdio probe above rather than trusting a green build alone.

Maintenance & risks (named honestly)

This uses Garmin's unofficial internal API, ported from the open-source Python package python-garminconnect. Expected breakage points and how to fix them:

  • Unofficial API — endpoint paths can change. On errors, compare the paths in src/garmin/client.ts against the current python-garminconnect source.

  • JA3 / User-Agent — on a 403 or a "Just a moment …" Cloudflare page, update the JA3/User-Agent pair in src/http/impersonate.ts to a current Chrome (both together).

  • Client ids — the DI-OAuth2 client ids (GARMIN_CONNECT_MOBILE_ANDROID_DI_*) rotate; update the list in src/garmin/auth.ts on auth errors.

  • garth is discontinued — the previously common auth library garth is no longer maintained; the authoritative reference is python-garminconnect.

  • Keep the token folder private — ~/.garmin-mcp/ holds valid session tokens; don't share it, don't commit it.

  • Terms of service — access via the unofficial API may be in tension with Garmin's terms of service. Intended for private personal use with your own data.

Troubleshooting

  • 403 or a "Just a moment …" page — Garmin's Cloudflare is blocking the TLS fingerprint. Update the JA3/User-Agent pair in src/http/impersonate.ts to a current Chrome (both together), then re-run npm run smoke.

  • 🔒 Not logged in / session expired — run npm run login again.

  • ⏳ rate limited (HTTP 429) — Garmin is throttling; wait a bit and retry.

  • First run is slow / cycletls errors — cycletls downloads a small Go helper binary on first use; make sure it can execute and isn't blocked by the OS.

  • Calls hang right after an update — the previous server process may have left its cycletls Go helper behind. Check with pgrep -fl cycletls and clear it with pkill -f cycletls; the next call starts a fresh one.

Re-login

If tools report 🔒 Not logged in (token expired/invalid):

npm run login

License

MIT © Marcel Fortmann

Disclaimer

This is an unofficial, community project. It is not affiliated with, endorsed by, or sponsored by Garmin. Garmin® and Garmin Connect™ are trademarks of Garmin Ltd. or its subsidiaries.

Available Tools

13 tools
get_activityA

Data for a single activity by activityId. Pick via include: summary, splits, weather, details (GPS/HR/power streams), hr_zones, exercise_sets.

NameRequiredDescriptionDefault
includeNoWhich parts to return. Default: [summary].
activityIdYesThe numeric activityId (from list_activities).

TDQS

A3.6/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 usefully discloses that 'details' returns GPS/HR/power streams (a hint about payload size and content) and names the selectable sections, but it says nothing about permissions, error behavior, or response structure. Some value beyond the schema, but not rich behavioral context.

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 compact sentences with zero waste. The core purpose is front-loaded, and the include enumeration follows immediately, making it easy to scan.

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 simple read tool with two well-described parameters, no output schema, and no annotations, the description covers purpose and section selection adequately. It lacks explicit return-shape or edge-case guidance, but nothing essential for correct invocation is missing.

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 100%, so the schema already documents both parameters and the default for include. The description repeats the include options and adds a parenthetical clarifying 'details (GPS/HR/power streams),' which is helpful but marginal; the baseline of 3 is appropriate when the schema does most of the work.

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/resource pair: 'Data for a single activity by activityId,' which clearly distinguishes it from the list-oriented sibling list_activities. It does not explicitly name any siblings or contrast itself with them, so it falls short of the 5 anchor.

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 'single activity by activityId' and the include-selection sentence, but the description never states when to call this instead of list_activities or other siblings, nor does it mention prerequisites or exclusions. Adequate but with a clear gap in explicit routing guidance.

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

get_daily_healthB

Daily wellness metrics for a date. Pick one or more via metrics: summary, sleep, stress, heart_rate, hrv, spo2, respiration, hydration, steps, floors, intensity_minutes, body_battery, body_battery_events, stats_and_body.

NameRequiredDescriptionDefault
dateNoDate in YYYY-MM-DD format. Default: today.
metricsNoWhich daily metrics to return. Default: [summary].

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full disclosure burden, yet it only enumerates metric names. It says nothing about read-only semantics, what happens when a metric is unavailable for a date (empty object vs. omitted vs. null), units, or any auth/rate-limit constraints.

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?

The purpose is front-loaded in the first clause, which is good, but the second sentence is a 14-value enum dump that duplicates the schema verbatim and consumes most of the description's length without adding information.

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?

For a two-parameter, no-output-schema read tool this is adequate to select and call: the agent knows the date format from the schema and what metric groups exist. It is incomplete on availability/empty-data behavior, which matters when requesting many metrics for an arbitrary date.

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 100%, so both `date` and `metrics` are documented in the schema; the baseline of 3 applies. The description re-lists the enum values but adds no meaning the schema lacks — it never explains what distinguishes `summary` from `stats_and_body`, or how selecting multiple metrics composes the response.

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 names a specific verb+resource: retrieving daily wellness metrics for a given date, and the `metrics` list makes the surface of returned data concrete. It does not differentiate itself from siblings like get_steps_history, get_activity, or get_weight, which overlap conceptually with the steps/floors/heart_rate metrics offered here.

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?

"Pick one or more via `metrics`" gives clear guidance on how to invoke the tool but no guidance on when to choose it over get_steps_history, get_activity, or get_weight. Usage is implied by the resource 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_devicesA

Garmin devices paired to the account (model, firmware, last sync).

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description must carry the burden. It indicates a read-only retrieval of device information, but does not disclose any potential limitations, authentication requirements, or response size constraints.

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?

A single sentence that is clear, direct, and contains no unnecessary words. Every element conveys meaning.

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 zero parameters and no output schema, the description adequately covers the tool's purpose and expected return fields. It could be improved by mentioning the scope (all paired devices) and potential limitations.

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?

No parameters exist, so schema coverage is 100%. The description adds value by listing the output fields (model, firmware, last sync), which is helpful for the agent. Baseline for 0 parameters is 4.

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?

Clearly states the tool returns Garmin devices paired to the account, with specific fields (model, firmware, last sync). This distinguishes it from sibling tools like get_weight or get_user_profile which focus on different data.

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 usage when a list of paired devices is needed, but does not explicitly state when to use this tool versus alternatives or provide any exclusion criteria.

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

get_fitnessA

Fitness/performance metrics. Pick via metrics: race_predictions, cycling_ftp, lactate_threshold, personal_records (all latest, date-agnostic), and endurance_score, hill_score, resting_heart_rate, weekly_intensity_minutes (over the given date range).

NameRequiredDescriptionDefault
endDateNoEnd date (YYYY-MM-DD). Default: today.
metricsNoWhich metrics to return. Default: [race_predictions, personal_records].
startDateNoStart date (YYYY-MM-DD). Default: ~4 weeks ago.

TDQS

A3.7/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 usefully discloses that some metrics are latest/date-agnostic while others apply over a date range, but it does not cover permissions, read-only behavior, or return format.

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 short, front-loaded, and every phrase contributes to explaining the available metrics and their date behavior. There is no redundant or filler text.

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 detailed input schema and absence of output schema, the description provides enough context to call the tool correctly by metric name. It could go further in explaining return structure or read-only safety, but the core information needed for invocation 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?

Schema coverage is 100%, so the schema already documents the parameters. The description adds value by grouping the enum values into date-agnostic metrics and date-range metrics, which is semantic information not present in the schema itself.

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 identifies the resource as fitness/performance metrics and enumerates the specific metrics available. It distinguishes metric types by date behavior, but it does not explicitly differentiate this tool from siblings such as get_training or get_daily_health.

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 explains how to select metrics via the `metrics` parameter and which metrics are date-agnostic versus date-range based. However, it does not state when to use get_fitness instead of related sibling tools or provide exclusions.

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

get_goalsC

Goals filtered by status (active, future, or past).

NameRequiredDescriptionDefault
limitNoMax goals (1-50). Default: 30.
statusNoGoal status. Default: active.

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, but it discloses nothing about read-only safety, ordering, pagination, or what 'future'/'past' mean relative to today. It adds no behavioral context beyond the filter values.

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 wasted words, but it is an incomplete sentence fragment rather than a front-loaded statement of what the tool returns or how to use it. Brevity here comes at the cost of clarity.

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?

For a simple two-parameter, no-required-input read tool with a fully documented schema and no output schema, the schema supplies most of what an agent needs. Still, the description leaves usage context and return behavior unstated, and there are no annotations to compensate.

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 100%, so both parameters (limit 1-50 default 30, status default active) are already fully documented. The description's parenthetical enum merely restates schema content and adds no semantics beyond it.

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 resource (goals) and the filtering dimension (status with enum values), but is a noun-phrase fragment with no verb such as 'list' or 'retrieve'. It distinguishes the resource from health/fitness siblings only implicitly, by virtue of the word 'Goals'.

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 call this tool versus alternatives, nor any mention of defaults, exclusions, or prerequisites. The only hint is the parenthetical status list, which the schema already provides.

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

get_scheduled_workoutsB

Scheduled workouts / calendar for a month (defaults to the current month).

NameRequiredDescriptionDefault
yearNoYear, e.g. 2026. Default: current year.
monthNoMonth 1-12. Default: current month.

TDQS

B3.1/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 burden. It implies a read operation via "get" but says nothing about permissions, whether past/future dates are treated differently, whether empty days are returned, or how results are structured — all of which matter for a calendar-style read.

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?

A single front-loaded sentence with zero filler, and the default-month behavior is placed where the reader needs it. Its brevity edges toward under-specification rather than being genuinely well-sized for the tool's role.

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?

The tool is simple (2 optional params, no nested objects), but with no output schema and no annotations, the description should say what the response looks like (per-day entries, planned vs. completed workouts). That gap leaves an agent unprepared to interpret results.

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 100%, so year and month semantics plus defaults are already fully documented in the schema. The description's "defaults to the current month" merely restates the schema default and adds no new parameter meaning, so baseline 3 applies.

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 concrete resource and scope: the scheduled-workouts calendar for a single month. The verb is only implied by the name ("get"), and it never explicitly distinguishes itself from the sibling get_workouts, so an agent must infer that this returns planned sessions rather than completed ones.

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 phrase "for a month" plus the current-month default implies the usage context (fetch a calendar view for a given period). However, there is no explicit when-to-use guidance and no mention of get_workouts or get_training as alternatives, leaving the agent to guess about overlap with siblings.

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

get_steps_historyA

Step totals over a date range. granularity 'daily' (Garmin caps the span at 28 days) or 'weekly'. Default: daily, last ~4 weeks.

NameRequiredDescriptionDefault
endDateNoEnd date (YYYY-MM-DD). Default: today.
startDateNoStart date (YYYY-MM-DD). Default: ~4 weeks ago.
granularityNodaily or weekly. Default: daily.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral load; it does disclose the Garmin 28-day cap for daily granularity and the default window, which is genuinely useful. However it never states that this is a read-only operation, what happens when the span exceeds the cap (error vs. truncation), or anything about the shape of the returned totals.

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 with zero filler; the primary subject lands first and the granularity constraint and defaults follow. Nothing could be removed without losing information.

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 simple zero-required-parameter read with full schema coverage, this covers resource, granularity options, cap, and defaults. The only meaningful gap is the absence of an output schema combined with no description of the returned structure (per-day/per-week points, units), which an agent would have to discover at call time.

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 100%, so all three parameters and their defaults are already documented in the schema, establishing the baseline of 3. The description only adds the 28-day cap tied to the granularity enum, restating the daily default that the schema already provides.

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 concrete resource (step totals) and a scope (over a date range), so an agent knows exactly what is returned. It doesn't name the closest sibling (get_daily_health), which likely also surfaces step data, so differentiation from siblings is left 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 Guidelines3/5

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

The defaults ('daily, last ~4 weeks') imply when this tool is a good fit for a broad recent trend, but there is no explicit when-to-use / when-not-to-use guidance and no mention of get_daily_health as an alternative for single-day detail.

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

get_trainingC

Training metrics for a date. Pick via metrics: readiness, morning_readiness, status, vo2max, fitness_age.

NameRequiredDescriptionDefault
dateNoDate in YYYY-MM-DD format. Default: today.
metricsNoWhich training metrics to return. Default: [readiness, status, vo2max].

TDQS

C2.9/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 disclosure burden. It says nothing about whether this is a read-only fetch, what the response shape is, how missing data for a date is handled, or whether readiness and morning_readiness differ — all material for a metrics tool.

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, front-loaded with the resource and followed by the selector. The only waste is the enumerated metric list, which duplicates the schema enum verbatim.

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?

For a two-optional-parameter read tool with a fully documented schema, the description covers the basics. It still leaves open what each metric value contains and whether all requested metrics are guaranteed to return data for a given date.

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 100% and both parameters already document format, defaults, and the enum. The description's metric list restates the schema enum rather than adding semantics (e.g., what 'morning_readiness' returns versus 'readiness'), so the baseline 3 applies.

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 ('Training metrics for a date') and enumerates the selectable metric families, so an agent knows exactly what comes back. It does not distinguish itself from siblings like get_fitness or get_daily_health, which likely overlap on training/health data.

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 only usage cue is 'Pick via `metrics`', which is a parameter instruction rather than when-to-use guidance. Nothing says when to call this instead of get_fitness or get_daily_health, nor any prerequisite or exclusion.

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

get_user_profileA

User profile & settings: units, preferences, activity level, etc.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are present, so the description carries full burden. It hints at a read operation but does not confirm safety or disclose any prerequisites, error conditions, or side effects. The behavioral traits are inadequately communicated.

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 one sentence, efficiently conveying the purpose without redundancy. It uses a list format with examples for clarity, and every word serves a purpose.

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?

With no output schema, the description partially compensates by listing example data categories. However, it could be more explicit about the full return structure. Given the tool's simplicity and sibling diversity, this is nearly adequate.

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?

There are no parameters, so baseline is 4. The description adds value by listing the categories of data returned (units, preferences, activity level), which helps the agent understand the output content.

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?

The description clearly states the tool retrieves user profile and settings including units, preferences, and activity level. It is specific and distinguishes itself from sibling tools like whoami (basic identity) and get_weight (specific metric).

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 usage for getting profile/settings data but does not explicitly state when to use this tool versus alternatives like get_daily_health or get_training. No exclusion criteria or alternative suggestions are provided.

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

get_weightA

Body weight & body composition (weight, BMI, body-fat %) over a date range. Set include_raw for the individual weigh-in entries too. Default range: the last ~4 weeks.

NameRequiredDescriptionDefault
endDateNoEnd date (YYYY-MM-DD). Default: today.
startDateNoStart date (YYYY-MM-DD). Default: ~4 weeks ago.
include_rawNoAlso include individual weigh-in entries. Default: false.

TDQS

A3.6/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 behavioral burden. It does disclose important behavior: the default window is ~4 weeks and the default response is aggregated rather than raw entries (implied by include_raw). It omits whether this is read-only, what the aggregation granularity is, and the response shape.

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 tight sentences with zero filler, front-loaded with what is returned and followed by the key option and default. Nothing is wasted.

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?

All three parameters are optional and fully documented in the schema, and the description supplies the defaults and the aggregation-vs-raw distinction. Without an output schema, a bit more on the return shape would help, but the essentials for correct invocation are present.

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 100%, so the baseline is 3. The description reinforces include_raw's purpose and the default date window, but adds no format details or edge-case handling (e.g., empty ranges) beyond the schema.

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 implied (retrieve) and a concrete resource: body weight and body composition metrics (weight, BMI, body-fat %) over a date range. The metrics listed distinguish it from generic siblings like get_daily_health or get_fitness, though it never explicitly contrasts with them.

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?

Provides useful context — default range is the last ~4 weeks, and include_raw is the flag for per-weigh-in detail — which implies usage. However, it gives no explicit guidance on when to prefer this over siblings such as get_daily_health, get_fitness, or get_user_profile, leaving the agent to infer.

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

get_workoutsC

Saved workouts on the account.

NameRequiredDescriptionDefault
limitNoMax workouts (1-100). Default: 50.

TDQS

C2.5/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full behavioral burden and it largely does not: nothing about read-only nature, ordering, pagination beyond the limit param, or error behavior. The only cue is the plural noun implying a list, which is minimal disclosure for an unannotated tool.

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?

The description is a five-word fragment: nothing wasted, but also nothing front-loaded or structured, and it is under-specified rather than genuinely concise. Brevity here reflects missing content rather than disciplined editing.

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 unannotated tool with no output schema, the description should at least say what a workout record contains or how results are returned. It delivers only a resource label, leaving key expectations for the agent to discover by calling the tool.

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?

With a single optional parameter at 100% schema description coverage, the schema already fully documents 'limit' with its range and default. The description adds no additional meaning about the parameter, so the baseline of 3 applies.

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 resource ('saved workouts') and implies retrieval, but supplies no verb and no scope, so the agent must infer that this is a read/list operation. It gains some differentiation from the sibling get_scheduled_workouts by saying 'saved', but that distinction is never made explicit.

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 tool, when to prefer a sibling such as get_scheduled_workouts or get_training, or what prerequisites exist. The agent is left to infer usage entirely from the resource noun.

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

list_activitiesA

List activities. Without dates: the most recent ones (use limit=1 for the last activity). With startDate/endDate and/or type: activities in that range, optionally filtered by type (e.g. running, cycling, swimming).

NameRequiredDescriptionDefault
typeNoFilter by activity type, e.g. 'running', 'cycling'.
limitNoMax activities (1-50). Default: 10.
endDateNoEnd date (YYYY-MM-DD). Default: today.
startDateNoStart date (YYYY-MM-DD). Default: ~4 weeks ago.

TDQS

A3.9/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 disclosure burden. It usefully reveals the ordering behavior (most recent first when no dates) and the fallback semantics of the date filter, but says nothing about permissions, whether results are read-only, pagination/truncation at the 50-item cap, or what fields come back.

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 sentences, both load-bearing, with the two operating modes laid out in parallel and the no-date case presented first. No filler or restatement of the tool name.

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 4-optional-param, fully schema-documented list tool with no output schema, the definition covers the main decision points (mode selection, filtering, limit trick). Remaining gaps are return-shape and read-only guarantees, which are minor given all parameters are already documented.

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 100%, so the baseline is 3, but the description adds genuine semantic value: it explains the conditional interaction between date params and type ('and/or'), and supplies a concrete usage pattern for limit (limit=1 for the last activity) that the schema only describes as 'Max activities'.

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 opens with a specific verb+resource ('List activities') and immediately scopes it by describing the two operating modes (recent vs. date-range). It implicitly separates itself from the singular sibling get_activity, though it never names 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 Guidelines4/5

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

It gives concrete when-to-use guidance for each mode: omit dates to get the most recent activities, pass startDate/endDate and/or type to get a range, and use limit=1 to fetch just the last activity. It stops short of naming the alternative tool (get_activity) for single-record retrieval, so an agent must infer that boundary.

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

whoamiA

Check the Garmin connection and return the logged-in account profile (display name, full name).

NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations provided. Description discloses read-only nature and return fields, but does not mention error behavior, authentication requirements, or what happens if not connected.

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?

Single clear sentence with no unnecessary words. Efficient and front-loaded.

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?

Adequate for a simple parameterless tool. Additional details about error handling could improve, but current description is sufficient for use.

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?

No parameters exist, schema coverage is 100%. Description confirms no input needed, adding minimal value beyond schema but sufficient.

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?

Clearly states it checks Garmin connection and returns account profile (display name, full name). Distinct from sibling tools that focus on specific data (weight, fitness, etc.).

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?

Implies usage for verifying connection and basic profile, but does not explicitly guide when to use over get_user_profile (which might overlap). No exclusions 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. 10 tool updatesv2.0.0
    • Changedget_activity1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_daily_health1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_fitness1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_goals1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_scheduled_workouts1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_steps_history1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_training1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_weight1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_workouts1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_activities1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 10 tool updatesv1.1.1
    • Addedget_activity
    • Changedget_daily_health1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_fitness1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedget_goals
    • Addedget_scheduled_workouts
    • Addedget_steps_history
    • Changedget_training1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_weight1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Addedget_workouts
    • Addedlist_activities
  3. 7 tool updatesv1.0.0
    • First observedget_daily_health
    • First observedget_devices
    • First observedget_fitness
    • First observedget_training
    • First observedget_user_profile
    • First observedget_weight
    • First observedwhoami

TDQS

B3.4/5.0

Scored across 13 tools

Disambiguation4/5

Most tools are clearly separated by domain (daily health, training, fitness, weight, steps, activities, workouts, devices). Some overlap exists, such as steps and heart-rate metrics appearing in both get_daily_health and related history/fitness tools, and whoami vs get_user_profile could be slightly confusing, but the descriptions make the intended boundaries mostly clear.

Naming Consistency4/5

The tool names are consistently snake_case and nearly all use a get_ verb prefix, with list_activities as a sensible variant. whoami is the only clear naming outlier, but it is a conventional and readable exception.

Tool Count5/5

With 13 tools, the server is well within a reasonable range and each tool maps to a distinct Garmin data area. The grouping is not bloated, and no tool feels redundant purely from a count perspective.

Completeness4/5

The surface covers the main read-only Garmin domains: health, training, fitness, body composition, steps, activities, goals, workouts, scheduled workouts, devices, and profile. Minor gaps such as retrieving individual workout or goal details may exist, but core workflows appear covered and agents can work around them.

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
  • F
    license
    Not graded
    quality
    D
    maintenance
    Connects Garmin watch data to Claude Desktop, allowing users to ask natural language questions about their health and activity data from Garmin Connect.
    -