Garmin Connect Workouts MCP
This server lets you manage Garmin Connect workouts through natural language and structured MCP tools.
Create structured workouts for running, cycling, and swimming with explicit steps and repeat blocks.
Set intensity targets: pace ranges, heart-rate zones, exact bpm, cycling power, and cadence.
Build swim workouts with strokes, equipment, and pool length.
List, fetch, update, and delete existing workouts.
Schedule workouts onto the Garmin Connect calendar.
Check authentication status and authenticate interactively via browser.
Workouts show real rep counters for intervals instead of duplicated steps.
Provides tools for creating, listing, retrieving, updating, deleting, and scheduling structured workouts in Garmin Connect, with support for pace, heart-rate, power, and cadence targets as well as repeat blocks.
Click on "Install 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 Connect Workouts MCPCreate a 10 min warmup, 5x1km at 4:00/km, 10 min cooldown"
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 Connect Workouts MCP
An MCP (Model Context Protocol) server that turns natural-language workout descriptions into structured workouts in Garmin Connect. Describe a session in plain English and the calling model builds a typed step-by-step workout that this server encodes into Garmin's workout API format and creates directly in your account.
Features
Pace, heart-rate, power and cadence targets - pace ranges, HR zones 1-5, explicit bpm ranges, cycling power, and cadence, all encoded against Garmin's real
workoutTargetTypetable.Real repeat blocks -
5x1kmbecomes a single repeat group, not five duplicated steps, so the watch shows an actual rep counter.Swim workouts - per-step strokes (freestyle, backstroke, breaststroke, fly, drill, individual medley, or any stroke) and equipment (fins, kickboard, paddles, pull buoy, snorkel), plus a workout-level pool length in meters or yards.
Full workout lifecycle - create, list, get, update, delete, and schedule workouts onto the Garmin Connect calendar.
Structured input, not text parsing - the server never parses free text itself; every duration and target is an explicit, unit-tagged field, so there's nothing for a string like "10 min" to be silently misread as.
Related MCP server: Garmin Workouts MCP Server
Quick Start
Claude Code
claude mcp add garmin-workouts npx garmin-connect-workouts-mcpClaude Desktop
Add to your configuration file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"garmin-workouts": {
"command": "npx",
"args": ["-y", "garmin-connect-workouts-mcp"]
}
}
}Then restart Claude Desktop.
Authentication
Garmin Connect's web client authenticates with session cookies plus a CSRF token, not a password grant this server could hold on to. So the first time you create a workout (or whenever the session has expired):
The server checks the stored session with a cheap authenticated request.
If it's missing or rejected, run the
authenticate_garmintool. It opens a real browser window atconnect.garmin.comfor you to log in normally.Once login completes, the session is captured and stored at
~/.config/garmin-connect-workouts-mcp/auth.jsonwith600permissions (owner read/write only).
No password is ever stored - only the resulting session cookies and CSRF
token. Garmin sessions expire, so you may be prompted to re-authenticate
between sessions; the server detects this automatically and tells you when
to run authenticate_garmin again. The login browser uses a persistent,
isolated profile under ~/.config/garmin-connect-workouts-mcp/browser-profile/
so Garmin can remember the device across logins - it never touches your
personal browser profile.
Tools
Tool | Description |
| Create a structured workout with steps, targets, and repeat blocks. |
| List workouts in the Garmin Connect account. |
| Fetch the full structure of one workout. |
| Replace an existing workout's contents, keeping its id. |
| Delete a workout. |
| Put a workout on the Garmin Connect calendar for a date. |
| Check whether the stored Garmin session still works. |
| Authenticate with Garmin Connect (opens a browser). |
Usage Examples
"Create a 30 minute easy run in zone 2"
"10 min warmup zone 3, then 5x1km threshold intervals at 4:00/km with 2 min rest between, then 10 min cooldown zone 2"
"8x400m at 5k pace with 60 second recovery, then check what workouts I already have scheduled this week"
"Update workout 123456 to add a 5 minute cooldown, then schedule it for next Monday"
"Create a 25m pool swim: 200m warmup any stroke, 4x100m freestyle with 30s rest using a kickboard, 100m breaststroke cooldown"
How targets work
A stated pace is treated as the fast edge of a range: Garmin stores pace
as a range, not a single point, so 4:00/km on its own becomes a
4:00-4:10/km range, widened by 10 seconds. Give both fast and slow
explicitly for a narrower or different range.
Development
pnpm install
pnpm test # vitest: encoders + golden-file tests against real captured payloads
pnpm run build # compile TypeScript to dist/
pnpm run dev # run the server directly with tsxTests validate the workout encoders (targets, durations, repeat nesting) against fixtures captured from Garmin's own web client, so payload shape regressions get caught before they reach a real account.
Disclaimer
This is an unofficial, third-party project. It is not affiliated with, endorsed by, or sponsored by Garmin Ltd. or any of its affiliates, and it talks to Garmin Connect's web API by reverse-engineering the same requests the official web client makes. It may stop working if Garmin changes that API. Use at your own risk, and at your own responsibility for the workouts and data you send to your account.
Acknowledgements
Thanks to garmin-workouts-mcp by Charles Frisbee for the original idea of driving Garmin Connect workouts through MCP.
License
MIT
Available Tools
8 toolsauthenticate_garminA
Authenticate with Garmin Connect by opening a real browser window at connect.garmin.com for you to log in normally, then capture and store only the resulting session cookies and CSRF token (never your password). Run this whenever check_garmin_auth reports no valid session, or any other tool returns its 'not authenticated' message. Requires a local display; will not work in a headless-only environment.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations limited to a title, the description carries the full burden and does well: it discloses that a real browser window opens, the user logs in normally, and only session cookies and CSRF token are captured and stored, never the password. It also warns about the headless-environment limitation, which is an important behavioral constraint beyond what the schema or annotations convey.
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 well-structured: first sentence states what the tool does, second specifies exactly when to use it, and third gives the key environmental restriction. Every sentence adds distinct value 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 zero-parameter tool with no output schema, the description provides complete operational context: what happens, what is stored, when to invoke it, and what environment it requires. No critical calling information is missing, and the sibling context reinforces the role without needing further detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the input schema is empty and there is nothing for the description to clarify. The baseline for zero-parameter tools is 4, and the description appropriately avoids inventing parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Authenticate with Garmin Connect'), names the exact resource (connect.garmin.com), and explains the mechanism (opening a real browser window and capturing session cookies/CSRF token). It also differentiates itself from the sibling workout tools by positioning itself as the authentication step tied to check_garmin_auth.
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 explicitly states when to run this tool: whenever check_garmin_auth reports no valid session or another tool returns a 'not authenticated' message. It also gives a clear environmental prerequisite and exclusion—requires a local display and will not work headless—which is valuable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_garmin_authARead-onlyIdempotent
Probe whether the stored Garmin Connect session is still valid, using a cheap authenticated request rather than a local expiry check (Garmin's session cookie does not carry a reliable expiry). Use this first when unsure whether the other tools will work. Returns a message telling you to run authenticate_garmin if the session is missing or has expired; never throws.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds valuable context beyond those: it uses a 'cheap authenticated request' rather than a local expiry check, explains why Garmin's session cookie lacks reliable expiry, and states the tool 'never throws.' This is useful behavioral detail the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It fronts the core purpose, then provides rationale and usage direction. Every sentence contributes necessary information about when and how to use the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only check tool with idempotent annotations and no output schema, the description is complete. It explains the purpose, the execution strategy, the failure mode, and the recommended next step. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty, so there is no parameter ambiguity. The description appropriately omits parameter details, and the baseline for a zero-parameter tool is a 4.
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 tool as a probe for Garmin Connect session validity, using the specific verb 'Probe' and a distinct resource (stored session state). It also differentiates itself from the sibling tools by framing it as a preliminary check before 'whether the other tools will work.'
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 explicitly says 'Use this first when unsure whether the other tools will work,' giving a direct when-to-use instruction. It also names the alternative path, 'run authenticate_garmin if the session is missing or has expired,' making the decision clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_garmin_workoutA
Create a new structured workout in Garmin Connect from typed steps: durations, pace/HR/power/cadence targets, repeat blocks for intervals, and swim-specific stroke/equipment/pool-length fields. Use to add a workout; to change one that exists, use update_garmin_workout instead. Returns the new workoutId and a Connect link. Returns a re-auth message, not an exception, if no valid session exists. Example: [{kind:'step', intensity:'warmup', duration:{type:'time', value:10, unit:'min'}}, {kind:'repeat', iterations:5, steps:[...]}].
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workout name, shown in Garmin Connect and on the device. | |
| sport | No | Sport for this workout: running, cycling, or swimming. Governs which target types apply and whether stroke/equipment/poolLength are used. Defaults to running. | running |
| steps | Yes | The ordered list of steps and repeat blocks that make up the workout, in the order they should be performed. | |
| poolLength | No | Swimming only - pool length for this workout, e.g. 25. Only valid when sport is 'swimming'. | |
| poolLengthUnit | No | Swimming only - unit for poolLength. Defaults to 'm' when poolLength is given without a unit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry only a title (no readOnly/destructive/idempotence hints), so the description bears the full behavioral burden. It discloses the return payload (workoutId and a Connect link) and a distinctive error mode (re-auth message rather than an exception for missing sessions). It does not cover idempotency or name-uniqueness behavior, but for a create action the mutating side effect is self-evident.
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: purpose, then routing, then return value, then error behavior, then example. Every sentence earns its place and there is no filler. The example makes it moderately long, but that length is justified by the nested complexity of the steps 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?
With no output schema, the description supplies return values and auth-failure behavior, and the schema covers all parameters at 100%. The only notable gap is not pointing the agent to the authenticate_garmin sibling when the re-auth message is received; otherwise the definition is complete for a complex, write-side tool with minimal annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema through a concrete step/repeat-block example and a summarizing list of target types, which materially helps an agent construct the deeply nested 'steps' parameter correctly.
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 a specific verb and resource ('Create a new structured workout in Garmin Connect') and enumerates the content scope: durations, pace/HR/power/cadence targets, repeat blocks, and swim-specific fields. It explicitly names the sibling it is not, update_garmin_workout, so an agent can route correctly without inspecting schemas.
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?
'Use to add a workout; to change one that exists, use update_garmin_workout instead' is explicit when-to-use and when-not-to-use with a named alternative. The create-vs-update decision is the key routing ambiguity among the siblings, and it is resolved directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_garmin_workoutADestructive
Permanently delete a workout from Garmin Connect by workoutId. This is irreversible - there is no undo or trash. Use list_garmin_workouts or get_garmin_workout first to confirm you have the right workoutId. If no valid session exists, returns a message asking you to run authenticate_garmin rather than throwing.
| Name | Required | Description | Default |
|---|---|---|---|
| workoutId | Yes | The numeric Garmin workout id, as returned by create_garmin_workout or listed by list_garmin_workouts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though destructiveHint is already set, the description adds important behavioral context: the operation is irreversible, there is no undo or trash, and it returns an authentication prompt instead of throwing an error when no session exists. These details go beyond the annotation and meaningfully inform agent behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The core action is front-loaded, followed by the irreversibility warning and the necessary preconditions/fallback behavior. Every sentence earns its place.
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 one-parameter destructive tool with no output schema, the description covers the purpose, the irreversible side effect, the recommended confirmation step, and the authentication failure behavior. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter workoutId is fully documented in the schema with its type and origin. The description mainly reinforces using the right ID by listing sources, but does not need to add more because schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Permanently delete'), a specific resource ('workout from Garmin Connect'), and the key identifier ('by workoutId'). It is clearly distinguishable from sibling tools like update_garmin_workout or schedule_garmin_workout.
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?
It explicitly instructs the agent to use list_garmin_workouts or get_garmin_workout first to confirm the workoutId, which is actionable pre-use guidance. It also explains what happens when no valid session exists and directs the agent to authenticate_garmin, covering the main failure path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_garmin_workoutARead-onlyIdempotent
Fetch the complete stored structure (all steps, targets, repeat blocks) of one workout by its workoutId, as raw JSON. Use this to inspect a workout, or to get its full contents before calling update_garmin_workout, which replaces the entire workout rather than patching it. Read-only. If no valid session exists, returns a message asking you to run authenticate_garmin rather than throwing.
| Name | Required | Description | Default |
|---|---|---|---|
| workoutId | Yes | The numeric Garmin workout id, as returned by create_garmin_workout or listed by list_garmin_workouts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint and idempotentHint as true, so the description's 'Read-only' is redundant. However, it adds the no-session behavior ('returns a message asking you to run authenticate_garmin rather than throwing') and clarifies that the full structure includes steps, targets, and repeat blocks, which is not covered by annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff. The core purpose is front-loaded, the update sibling relationship is placed second, and the auth note is last. Every clause earns its place, and the text is compact yet 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 single-parameter read tool with no output schema, the description covers the return format (raw JSON with full structure), the exact use case, and the behavior when authentication is missing. Nothing an agent needs to decide whether or how to call it is left out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the workoutId parameter is already described as the numeric Garmin workout id from create/list. The description only repeats 'by its workoutId' without adding new meaning (e.g., format, validation, or source). Therefore, a baseline 3 is appropriate.
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 verb 'Fetch' with the resource 'complete stored structure of one workout' and specifies the components (steps, targets, repeat blocks) and output format (raw JSON). It also differentiates from siblings by naming update_garmin_workout and authenticate_garmin, so an agent can distinguish it from list or delete operations without opening the schema.
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?
It explicitly says 'Use this to inspect a workout, or to get its full contents before calling update_garmin_workout' and warns that update replaces rather than patches. It also addresses the auth edge case by mentioning authenticate_garmin as the alternative when no valid session exists. This gives clear when-to-use and a conditional fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_garmin_workoutsARead-onlyIdempotent
List workouts stored in the Garmin Connect account, most recent first, with each workout's name, sport, and workoutId. Use this to find a workoutId to pass to get_garmin_workout, update_garmin_workout, delete_garmin_workout, or schedule_garmin_workout. Read-only. If no valid session exists, returns a message asking you to run authenticate_garmin rather than throwing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of workouts to return, most recent first. Defaults to 20, capped at 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses ordering (most recent first), the returned fields, and a non-throwing auth failure mode. This gives the agent useful behavioral expectations that the annotations alone do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states the core behavior, the second explains the workflow purpose and sibling relationship, and the third covers the auth edge case. Information is front-loaded and every sentence earns its place.
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 read-only listing tool with one documented parameter, the description is complete: it names the output fields, ordering, and failure behavior. There is no output schema, so the explicit return-field list is valuable and sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional limit parameter is fully described in the schema with default, maximum, and semantics, so the 100% schema coverage earns the baseline. The description adds no additional detail about the parameter, but none is needed because the schema already carries that burden.
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: list workouts stored in the Garmin Connect account, and adds concrete details (most recent first, returning name/sport/workoutId). It references the sibling tools by name, making clear this is the list/index operation versus get/update/delete/schedule, so an agent can disambiguate immediately.
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?
It explicitly states the intended use: find a workoutId to pass to get_garmin_workout, update_garmin_workout, delete_garmin_workout, or schedule_garmin_workout. It also handles the auth precondition by saying that an invalid session produces a prompt to run authenticate_garmin rather than failing, which routes the agent to the correct alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_garmin_workoutA
Put an existing workout on the Garmin Connect calendar for a specific date, so it appears as a planned session and can sync to a device. Requires a workoutId already created via create_garmin_workout or found via list_garmin_workouts - this tool does not create workouts. If no valid session exists, returns a message asking you to run authenticate_garmin rather than throwing.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Calendar date to schedule the workout on, in YYYY-MM-DD format, e.g. '2026-09-15'. | |
| workoutId | Yes | The numeric Garmin workout id, as returned by create_garmin_workout or listed by list_garmin_workouts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only a title, so the description carries the behavioral burden. It discloses the scheduling side effect, the sync-to-device outcome, the prerequisite that the workout must already exist, and the non-throwing auth-failure behavior. It does not mention whether scheduling on a date replaces an existing scheduled workout, but it covers the most important behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences: purpose and outcome, prerequisite and exclusion, and error behavior. Every sentence contributes unique information and there is no filler or repetition of schema content.
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-parameter tool with no output schema, the description covers purpose, prerequisites, expected result, and failure behavior. It could ideally state the successful return value or confirmation format, but nothing essential for invoking it correctly appears to be 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 100%, with both parameters clearly documented in the schema itself. The description adds useful context about where the workoutId comes from, but does not need to add more parameter detail. A baseline 3 is appropriate because the schema does the heavy lifting.
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: 'Put an existing workout on the Garmin Connect calendar for a specific date.' It clearly states the outcome, that it schedules rather than creates, and distinguishes itself from create/list tools. This is exactly the kind of precise purpose statement an agent needs.
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 explicitly states the precondition that a workoutId must already exist from create_garmin_workout or list_garmin_workouts, and explicitly says 'this tool does not create workouts.' This gives clear when-to-use and when-not-to-use guidance, and points to the relevant upstream sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_garmin_workoutAIdempotent
Replace the entire contents (name, sport, steps, pool settings) of an existing workout, identified by workoutId, keeping its id. This is a full overwrite, not a partial patch - fields you omit are dropped. Call get_garmin_workout first to see the current contents before changing them. If no valid session exists, returns a message asking you to run authenticate_garmin rather than throwing.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Workout name, shown in Garmin Connect and on the device. | |
| sport | Yes | Sport for this workout: running, cycling, or swimming. Governs which target types apply and whether stroke/equipment/poolLength are used. | |
| steps | Yes | The ordered list of steps and repeat blocks that make up the workout, in the order they should be performed. | |
| workoutId | Yes | The numeric Garmin workout id, as returned by create_garmin_workout or listed by list_garmin_workouts. | |
| poolLength | No | Swimming only - pool length for this workout, e.g. 25. Only valid when sport is 'swimming'. | |
| poolLengthUnit | No | Swimming only - unit for poolLength. Defaults to 'm' when poolLength is given without a unit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several behavioral traits beyond the annotations: this is a full overwrite, fields omitted are dropped, the workout id is preserved, and invalid sessions produce an authentication-prompt message rather than an exception. These details are not conveyed by the annotations or schema. There is no contradiction with the idempotentHInt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The core action and overwrite semantics are front-loaded, followed by the critical warning and the auth-failure behavior. Every sentence carries useful 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 description is strong given the rich input schema and workflow guidance. It covers overwrite semantics, the need to fetch first, and authentication failure behavior. Minor gaps remain: it does not describe what a successful update returns, and it does not say what happens if the workoutId does not exist. These are not fatal, but they leave some ambiguity for an agent without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds the important semantic that omitted fields are dropped, which affects how optional parameters like poolLength and poolLengthUnit are interpreted. Otherwise it does not add much per-parameter meaning beyond the schema's own descriptions, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Replace the entire contents ... of an existing workout, identified by workoutId, keeping its id.' It clearly distinguishes this from create_garmin_workout by emphasizing full overwrite on an existing workout and explicitly says it is not a partial patch. An agent can immediately tell this tool from its siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context and a concrete prerequisite: 'Call get_garmin_workout first to see the current contents before changing them.' It also warns that omitted fields are dropped, telling the agent to include all desired fields. It does not explicitly name create_garmin_workout as the alternative for new workouts, but the 'existing workout' language makes the intended use apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct action on a distinct resource: CRUD operations on workouts, list/get, schedule, auth status, and login. The only pair that could seem close—check_garmin_auth vs authenticate_garmin—is clearly separated by probe vs. act descriptions.
All tools follow a consistent verb_garmin_<noun> pattern (create/list/get/update/delete/schedule_garmin_workout, check/authenticate_garmin). The verb is always first and snake_case is uniform, making the set predictable.
Eight tools is well-scoped for a workout-management MCP: five for CRUD/list, one scheduling action, and two for authentication lifecycle. No redundant or unnecessary tools.
The workout lifecycle is fully covered with create, list, get, update, and delete, and schedule and auth handle adjacent needs. Minor gaps exist—there is no unschedule/calendar-view counterpart to schedule_garmin_workout—but agents can accomplish the core workflows without dead ends.
Maintenance
Related MCP Connectors
List, fetch, create, edit (replace), delete and schedule structured workouts on Garmin Connect (runn
Your AI writes training plans that arrive as structured workouts on iPhone and Apple Watch.
Read your workouts, history, and stats; create and schedule new workouts. Writes are additive only.
AI cycling coach: training plans, workouts, nutrition, strength training, Strava, Garmin and Wahoo.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables creation of Garmin Connect workouts using natural language descriptions. Supports multi-sport workouts with heart rate zones and automatic sync to Garmin devices.3312ISC
- AlicenseNot gradedqualityDmaintenanceEnables creation, management, and scheduling of Garmin Connect workouts from natural language descriptions, plus viewing activities, calendar data, and weather information from completed workouts.27MIT
- AlicenseAqualityCmaintenanceEnables building and uploading structured workouts to Garmin Connect using YAML or natural language, supporting running, cycling, and strength with zones and circuits.243MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to read Garmin activities and create/schedule structured workouts and multi-week training plans on Garmin Connect, syncing to the user's watch.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/slaat/garmin-connect-workouts-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server