garmin-mcp
Provides tools for reading Garmin Connect data (activities, splits, heart-rate zones, daily health metrics, sleep) and for creating and scheduling structured workouts so they sync to a Garmin watch.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@garmin-mcpwhat should I run on Thursday based on my last three runs?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 | bashThat 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 sessionThen 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 |
| Runs, rides and workouts: distance, duration, pace per km and mile, average and max HR, HR zones, cadence, training effect |
| One activity in detail: per-split distance, pace, HR and cadence, plus full heart-rate time-in-zone |
| Steps, distance, calories, resting/min/max HR, body battery, stress, intensity minutes |
| Sleep stages with durations and percentages, sleep score, overnight HRV, resting HR |
| Structured workouts saved in the account |
| Builds a structured workout and adds it to Garmin Connect |
| Puts a workout on a date, which is what syncs it to the watch |
| 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.pyDrives 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.checkThe 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 toolscreate_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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| sport | No | running | |
| steps | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| end_date | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| workout_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
8 tool updates
v0.1.0- First observed
create_workout - First observed
get_activities - First observed
get_activity_details - First observed
get_connection_status - First observed
get_daily_summary - First observed
get_sleep_data - First observed
list_workouts - First observed
schedule_workout
TDQS
Scored across 8 tools
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.
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.
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.
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
Related MCP Connectors
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Garmin data in Claude: 135 tools — activities, sleep, HRV, training, workouts. Free, open source.
Log meals, water, and weight to Garmin Connect from Claude or ChatGPT.
Related MCP Servers
- AlicenseBqualityAmaintenanceConnects Claude Desktop to Garmin Connect, enabling natural language queries of fitness activity data, health metrics, sleep analysis, workout management, and device information with 94 available tools.1101MIT
- FlicenseNot gradedqualityBmaintenanceConnects Claude to Garmin Connect data for personalized running coaching, including morning readiness checks, post-run analysis, weekly reviews, and goal tracking.-
- FlicenseNot gradedqualityCmaintenanceConnects Garmin watch data to Claude Desktop, allowing users to ask natural language questions about their health and activity data from Garmin Connect.-
- AlicenseBqualityAmaintenanceEnables users to analyze their own Garmin Connect data—activities, sleep, HRV, Body Battery, training readiness—directly inside Claude Desktop.132MIT