Skip to main content
Glama

garmin-mcp

Ask Claude about your Garmin data, then have it write the session onto your watch.

A local MCP server that connects Claude Desktop to your own Garmin Connect account. It reads your runs, splits, heart-rate zones and daily health metrics — and, unlike the read-only Garmin integrations out there, it can build a structured workout and schedule it, so the answer to "what should I run on Thursday?" ends up on your wrist instead of in a chat log.

Everything runs as a local subprocess on your machine. No hosting, no server holding your credentials, no network exposure.

You:    My last three runs are all at the same effort. Give me something harder
        for Thursday, based on what my recent paces actually support.

Claude: [reads your activities and splits, then proposes]

        Thursday Threshold (running, about 52m 55s)
          warmup: 15m
        5 x
            interval: 1.00 km @ 4:00/km-4:10/km
            recovery: 1m 30s
          cooldown: 10m

        Create this and put it on Thursday?

Install

macOS, with Claude Desktop already installed:

curl -fsSL https://raw.githubusercontent.com/Bartolome69/garmin-mcp/main/scripts/bootstrap.sh | bash

That fetches the code to ~/garmin-mcp, installs a modern Python via uv, signs you in to Garmin, and registers the server with Claude Desktop. It's the only command most people need. Read it first if you'd rather — scripts/bootstrap.sh is short.

Then quit Claude Desktop completely (⌘Q) and reopen it.

git clone https://github.com/Bartolome69/garmin-mcp.git
cd garmin-mcp
./scripts/setup.sh          # venv + dependencies
./scripts/login.sh          # sign in to Garmin once, caches the session

Then register it with your MCP client. For Claude Desktop on macOS, ./scripts/install-claude-desktop.sh does it (with the app quit). For anything else, copy .mcp.json.example, fill in the absolute paths, and point your client at python -m garmin_mcp over stdio.

Related MCP server: Garmin Coach MCP

Tools

Tool

What it returns

get_activities(limit, start_date, end_date)

Runs, rides and workouts: distance, duration, pace per km and mile, average and max HR, HR zones, cadence, training effect

get_activity_details(activity_id)

One activity in detail: per-split distance, pace, HR and cadence, plus full heart-rate time-in-zone

get_daily_summary(date)

Steps, distance, calories, resting/min/max HR, body battery, stress, intensity minutes

get_sleep_data(date)

Sleep stages with durations and percentages, sleep score, overnight HRV, resting HR

list_workouts(limit)

Structured workouts saved in the account

create_workout(name, steps, sport, description)

Builds a structured workout and adds it to Garmin Connect

schedule_workout(workout_id, date)

Puts a workout on a date, which is what syncs it to the watch

get_connection_status()

Whether the server is signed in, which account (masked), and the state of the token cache

Dates accept YYYY-MM-DD, today, yesterday, tomorrow, or a signed offset like -7 or +3.

Writing workouts

create_workout takes an ordered list of steps. Each has a type (warmup, interval, recovery, rest, cooldown or repeat), exactly one of duration_seconds or distance_meters, and an optional target — either pace (minutes per km, as "4:05" or a range ["4:00","4:10"]) or hr ([150, 165]).

15 minute warmup, 5×1km at 4:05 with 90 second recoveries, 10 minute cooldown:

[{"type": "warmup", "duration_seconds": 900},
 {"type": "repeat", "times": 5, "steps": [
     {"type": "interval", "distance_meters": 1000, "pace": "4:05"},
     {"type": "recovery", "duration_seconds": 90}]},
 {"type": "cooldown", "duration_seconds": 600}]

A single pace is widened by 5 s/km either side, because Garmin alerts on a range and an exact target beeps constantly. Repeat groups don't nest. Creating a workout only saves it — schedule it on a date for it to reach the watch.

What it can and can't do to your account

Reading is unrestricted. Writing is deliberately additive only: the two write tools create and schedule, and there is no tool that deletes, overwrites or edits anything. The worst case is a workout you delete in the Garmin app.

Your password is read from the environment, sent straight to Garmin, and never written to disk. Only the session token Garmin issues is cached, at ~/.garmin-mcp/tokens.json, written 0600 inside a 0700 directory. No tool returns the password or the token — get_connection_status reports a masked address and the cache's age and permissions, nothing more. Logs go to stderr, so they never corrupt the MCP stream on stdout.

After the first sign-in the server runs off the cached token. Set GARMIN_EMAIL and GARMIN_PASSWORD in the server's environment if you want it to re-authenticate unattended when that token eventually expires; leave GARMIN_PASSWORD out and you'll re-run scripts/login.sh instead.

If it doesn't work

"Garmin is rate-limiting logins from this IP address (429)" — the most common failure, and it isn't your password: Garmin blocks by network address before it checks credentials. Office wifi, university networks and VPNs get hit hardest. Sign in once over a phone hotspot; afterwards the cached session is used instead.

"Garmin is asking for a multi-factor code" — the server can't prompt over stdio, so run ./scripts/login.sh in a terminal once. It handles the code and caches the session.

Claude can't see the tools — Claude Desktop loads its config at launch and writes its own copy back when it closes, so a change made while it's running disappears. Quit it fully, run ./scripts/install-claude-desktop.sh, reopen.

No sleep data — the watch wasn't worn overnight, or hasn't synced. Sleep, HRV and overnight body battery only exist if you sleep in it.

Development

.venv/bin/python tests/smoke_test.py

Drives the server over real stdio like an MCP client would, against a stubbed Garmin account — no network, no credentials. Covers every tool's response shape, workout construction, bad input, and the no-credentials startup path.

.venv/bin/python -m garmin_mcp.check

The same code path against your real account, printing what comes back. Useful for confirming a setup end to end.

Other MCP clients, and ChatGPT

Nothing here is Claude-specific: it speaks MCP over stdio, so any client that launches a local server will run it — Claude Code, Cursor, VS Code, Zed, Windsurf. Copy .mcp.json.example, fill in absolute paths, point the client at python -m garmin_mcp.

ChatGPT can't run this. Its connectors take a public HTTPS URL over SSE, because ChatGPT executes on OpenAI's servers and cannot start a process on your machine — there's no local-server option to enable. Using this from ChatGPT would mean hosting it publicly and holding users' Garmin credentials, which is exactly what this project avoids.

Alternatives

MissingMCP is a hosted Garmin connector — no install, works on Claude's web and mobile apps, which this doesn't. It's read-only, and because Garmin offers no OAuth you sign in with your Garmin password on their site. This project trades that convenience for keeping everything, credentials included, on your own machine, and for being able to write workouts.

Caveats

Not affiliated with Garmin. It uses the same private API the Garmin Connect website does, via garminconnect, because Garmin publishes no consumer OAuth API. That API can change without notice and take this with it.

MIT licensed. Built with Claude Code.

Available Tools

8 tools
create_workoutA

Create a structured workout in Garmin Connect.

Adds a new workout; it never edits or replaces an existing one. Use schedule_workout afterwards to put it on a date so it syncs to the watch.

Args: name: Name shown in Garmin Connect and on the watch. steps: Ordered list of steps. Each step is an object: - "type": warmup, interval, recovery, rest, cooldown, or repeat - exactly one of "duration_seconds" or "distance_meters" - optional target, either "pace" ("4:05", or ["4:00","4:10"] for a range, minutes per km) or "hr" ([150, 165] in bpm) A repeat looks like {"type": "repeat", "times": 5, "steps": [...]} and cannot contain another repeat. Example — 15 min warmup, 5x1km at 4:05 with 90s recoveries, 10 min cooldown: [{"type": "warmup", "duration_seconds": 900}, {"type": "repeat", "times": 5, "steps": [ {"type": "interval", "distance_meters": 1000, "pace": "4:05"}, {"type": "recovery", "duration_seconds": 90}]}, {"type": "cooldown", "duration_seconds": 600}] sport: running, cycling, swimming, walking or hiking. Defaults to running. description: Optional note stored with the workout.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
sportNorunning
stepsYes
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It discloses that the tool only creates new workouts, that repeat steps cannot nest repeats, and that the workout will not sync to the watch until scheduled. It stops short of describing failure responses or auth requirements, but the behavioral context is substantial.

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

Conciseness5/5

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

The description is front-loaded with purpose and mutation semantics, then proceeds through step specifications and a concrete example. Every sentence adds substantive value, and the example is long but necessary to fully explain an otherwise under-specified schema.

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

Completeness5/5

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

The description covers a complex nested-steps protocol: step types, duration/distance mutual exclusivity, target formats, repeat nesting constraint, sport defaults, and the required scheduling step. An output schema exists to document return values, so nothing essential for invoking the tool correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0% and the steps parameter is merely an array of objects with additionalProperties:true. The description fully compensates: it defines step types, duration/distance exclusivity, target pace/HR formats with examples, repeat structure, nesting limits, sport options, and defaults.

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 opens with a specific verb and resource: 'Create a structured workout in Garmin Connect.' It further distinguishes itself by clarifying 'it never edits or replaces an existing one' and by naming schedule_workout for the follow-up step, so an agent can readily separate creation from scheduling.

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

Usage Guidelines4/5

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

The description gives clear workflow guidance: use schedule_workout afterwards to put the workout on a date and sync it to the watch. It also states the tool is strictly additive, ruling out editing/replacing existing workouts. It does not explicitly enumerate alternatives for list/edit operations, but the context is strong enough for correct selection.

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

get_activitiesA

List recent runs and workouts with distance, duration, pace and HR zones.

Args: limit: Maximum activities to return (1-50). Defaults to 10. start_date: Optional first day of a date range, YYYY-MM-DD. end_date: Optional last day of a date range. Defaults to today when start_date is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 behavioral disclosure burden. 'List' implies a read operation, and it does disclose default limit and default end_date behavior, but it does not clarify what 'recent' means, how empty results are handled, or any pagination concerns. Adequate but not rich.

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 concise and front-loaded with the tool's purpose, followed by a clean Args block. Every sentence adds useful information, with no redundancy or filler.

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

Completeness4/5

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

For a simple list tool with three optional parameters and an output schema, the description covers the resource, metrics, defaults, and date constraints. It lacks a little context around sibling-tool relationships, but nothing essential is missing for correct invocation.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully document parameters. It explains all three: limit's range and default, start_date's format, and end_date's default dependency on start_date. This fully compensates for the schema gap.

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 uses a specific verb ('List') and identifies the resource ('recent runs and workouts') plus the returned metrics (distance, duration, pace, HR zones). It is clear, though it does not explicitly distinguish itself from sibling tools like list_workouts or get_activity_details.

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?

No guidance is given about when to use this tool versus its siblings. It explains parameter defaults and the date-range behavior, but that is operational detail rather than usage selection guidance.

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

get_activity_detailsA

Splits and heart-rate detail for one activity.

Args: activity_id: The activityId from get_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It conveys a retrieval operation via 'get' and 'detail', but it does not explicitly confirm read-only/side-effect-free behavior or mention auth or rate limits. This is adequate for a simple read tool but leaves the safety profile implicit.

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 compact: one purpose sentence followed by an Args section. It is front-loaded, contains no filler, and every clause contributes either to what the tool does or how to populate the parameter.

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 that an output schema exists, the description does not need to explain return structure. The single parameter is adequately explained and the tool's scope is clear. It would be more complete with explicit alternative routing and behavioral caveats, but for a one-parameter read tool it is sufficiently usable.

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

Parameters4/5

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

Schema description coverage is 0%, but the description compensates by explaining that activity_id is 'the activityId from get_activities', giving the agent a concrete source and meaning. It does not elaborate on formatting constraints, but with only one parameter this is sufficient for correct use.

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 the specific resource ('one activity') and the data returned ('splits and heart-rate detail'). The parameter note ties it to get_activities, clearly establishing this as a detail endpoint rather than a list or summary tool. It lacks an explicit verb like 'returns', which keeps it from being perfect.

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 only usage guidance is the parameter hint that activity_id comes from get_activities, which implies the proper workflow of first listing activities and then requesting details for one. It does not explicitly name alternatives or state when not to use it, so the guidance is implicit rather than explicit.

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

get_connection_statusA

Check whether the server is logged in to Garmin Connect.

Reports which credentials are present and whether the cached session is usable. Never returns the password or the cached token itself.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are present, so the description carries the full behavioral burden. It discloses what it reports (credentials present, cached session usability) and explicitly states it never returns password or token. This is meaningful security-relevant transparency for a status check.

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 no filler. The main purpose is front-loaded and the security caveat is concise and informative.

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

Completeness5/5

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

For a zero-parameter status check with an output schema, the description fully covers what the agent needs: what is being checked, what is reported, and what is intentionally not exposed. Nothing critical is missing.

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

Parameters4/5

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

The tool has zero parameters, so baseline 4 is appropriate. The description adds meaningful context about what the tool reports, though it does not need to explain parameters since none exist.

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

Purpose5/5

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

States a specific action and resource: checking whether the server is logged in to Garmin Connect. It is clearly distinct from sibling data-retrieval tools like get_daily_summary or get_activities.

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

Usage Guidelines4/5

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

The description makes the tool's purpose unmistakable: verify login status and credential/session usability. It does not explicitly say 'use before other tools' or name alternatives, but the context strongly implies when this status check is appropriate.

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

get_daily_summaryA

Daily health summary: steps, calories, resting heart rate and body battery.

Args: date: Day to report on. YYYY-MM-DD, 'today', 'yesterday' or an offset like '-3'. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. It provides useful context about the date parameter (accepted formats, default) but discloses nothing about side effects, permissions, or operational behavior. Given this is a read-only tool, the absence of a readOnlyHint is not exposed, but the description at least explains input behavior, which is moderate value.

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

Conciseness5/5

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

The description is two concise blocks: a one-sentence summary of the data returned, and a single-line parameter explanation. It is front-loaded with the primary purpose, and every word adds value. No superfluous content or repetition 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?

Given the tool's simplicity (one optional parameter) and that an output schema exists, the description covers the essential aspects: what data is returned and how to specify the date. It lacks any usage context or system prerequisites, but these are not critical for a basic read operation. The description is nearly sufficient on its own.

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

Parameters5/5

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

The schema only defines the parameter with a type and default, giving zero semantic coverage. The description thoroughly explains the date parameter with all accepted formats (YYYY-MM-DD, 'today', 'yesterday', offset) and the default behavior. This compensates completely for the schema's lack of detail.

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 resource ('daily health summary') and explicitly lists the contained metrics: steps, calories, resting heart rate, and body battery. This differentiates it from sibling tools like get_sleep_data or get_activities, which focus on single data types. No ambiguity about what the tool returns.

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?

No guidance is provided on when to use this tool versus siblings. The description does not mention alternatives, prerequisites, or exclusions. An agent would have to infer from the name and content that this is a general summary, but there is no explicit routing or condition stated.

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

get_sleep_dataA

Sleep stages and sleep score for a night.

Args: date: The date you woke up on. YYYY-MM-DD, 'today', 'yesterday' or an offset like '-3'. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 behavioral disclosure burden. It discloses a useful nuance: the date parameter is 'the date you woke up on,' and the default is today, which clarifies how sleep sessions are attributed across nights. However, it does not mention read-only guarantees, error behavior, or data-availability caveats, leaving the transparency incomplete 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.

Conciseness5/5

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

The description is short, front-loaded with the tool's purpose, and the parameter documentation is formatted clearly beneath it. There is no redundant prose; every sentence adds 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?

The tool has only one optional parameter and an output schema, so the description needs to cover little beyond parameter semantics and core outcome; both are present. A point is withheld because it does not clarify how this tool relates to the overlapping get_daily_summary sibling or what happens when no sleep data exists.

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

Parameters5/5

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

The input schema provides only a nullable string with a null default, but the description fully specifies the accepted formats: YYYY-MM-DD, 'today', 'yesterday', offsets like '-3', and the default of today. This completely compensates for the 0% schema description coverage.

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 output resource: 'Sleep stages and sleep score for a night.' It lacks an explicit verb such as 'retrieves' or 'returns,' and it does not distinguish itself from siblings like get_daily_summary, but the resource is specific enough that an agent can infer the core purpose.

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?

No guidance is provided for when to choose this tool over sibling tools such as get_daily_summary or get_activities. The only usage-related content is the date parameter explanation, which is parameter semantics rather than tool-selection guidance.

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

list_workoutsA

List structured workouts saved in the Garmin account.

Args: limit: Maximum workouts to return (1-100). Defaults to 20.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden. 'List' clearly signals a read-only retrieval and the limit parameter is documented, but there is no explicit mention of authentication, ordering, pagination, or the absence of side effects. No contradiction exists.

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 highly concise: a one-sentence purpose statement followed by a single parameter explanation. Every line earns its place and the core purpose is 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?

For a simple list operation with one optional parameter and an output schema, the description supplies the essential invocation details. It lacks explicit sibling routing, but that is already captured under usage guidelines; the remaining information is sufficient.

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

Parameters5/5

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

The schema only provides type and default for limit. The description adds meaningful semantics: 'Maximum workouts to return (1-100). Defaults to 20.' This fully documents the only parameter and compensates for the 0% schema description coverage.

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 clear verb and resource: 'List structured workouts saved in the Garmin account.' This distinguishes it from siblings like create_workout and schedule_workout, though it does not explicitly name any alternative.

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?

No guidance is provided about when to use this tool versus siblings such as get_activities, create_workout, or schedule_workout. The intended use is only implied by the first line, with no exclusions or alternative routing.

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

schedule_workoutA

Put an existing workout on a date in the Garmin calendar.

Scheduling is what makes a workout sync to the watch.

Args: workout_id: Id from create_workout or list_workouts. date: The day to schedule it on. YYYY-MM-DD, 'today', 'tomorrow', or an offset like '+3'.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
workout_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of disclosure. It does convey the essential effects: it schedules an existing workout and makes it sync to the watch, and it documents accepted date forms. However, it does not say whether scheduling overwrites an existing scheduled workout, whether it is idempotent, or whether any sync/connection requirement applies immediately.

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

Conciseness5/5

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

The description is two short purpose sentences followed by a minimal Args block; every sentence adds information. The key behavioral point is front-loaded and the parameter documentation is compact.

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 two-required-parameter tool with an output schema, nothing needed to invoke it is missing: both parameters are fully described and the workflow is stated. It falls just short of complete only because the duplicate-scheduling behavior is unspecified.

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

Parameters5/5

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

Schema coverage is 0%, but the description fully compensates: workout_id is traced to create_workout/list_workouts, and date is documented with concrete examples including YYYY-MM-DD, 'today', 'tomorrow', and '+3' offsets. This is far more useful than the bare schema properties.

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 first sentence names the exact action and object: putting an existing workout on a date in the Garmin calendar. This clearly separates it from list_workouts/create_workout and from the read-only Garmin data getters, and 'Scheduling is what makes a workout sync to the watch' reinforces why the operation exists.

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

Usage Guidelines4/5

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

The Args section explicitly tells the agent to source workout_id from create_workout or list_workouts, establishing the intended workflow. It does not say 'use this instead of X' or give an explicit when-not condition, but no sibling performs scheduling, so the guidance is adequate.

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. 8 tool updatesv0.1.0
    • First observedcreate_workout
    • First observedget_activities
    • First observedget_activity_details
    • First observedget_connection_status
    • First observedget_daily_summary
    • First observedget_sleep_data
    • First observedlist_workouts
    • First observedschedule_workout

TDQS

A4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct resource: daily health, sleep, performed activities, activity details, saved workouts, workout creation, scheduling, and connection status. The only related pairs (activities vs workouts, create vs schedule) are clearly differentiated by descriptions and workflow order.

Naming Consistency4/5

All names follow a readable snake_case verb_noun pattern and mostly align with intent. The only minor inconsistency is that get_activities returns a collection while list_workouts uses list_ for the same kind of operation.

Tool Count5/5

Eight tools is well-scoped for a Garmin health/fitness server: read coverage for daily stats, sleep, and activities, plus workout creation and scheduling. There are no redundant tools, and the count is appropriate without overwhelming an agent.

Completeness3/5

The read side is solid, but workout management has notable gaps: create, list, and schedule exist, but there is no update, delete, or unschedule for workouts. An agent cannot correct or remove a mistaken workout or scheduled date, which are common expected operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers