finalsurge-mcp
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., "@finalsurge-mcpBuild this week's workouts from Final Surge and show me the preview."
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.
finalsurge-mcp
A local MCP server that turns the coach's free-text workouts in Final Surge into structured workouts in the Final Surge builder. Final Surge then syncs them to the watch.
This project is not affiliated with Final Surge. It calls the undocumented endpoints of the Final Surge web app with your own account, and a change on their side can break it at any time.
Use it
Requirements: macOS, uv, Claude Desktop, and a Final Surge account linked to your watch.
git clone https://github.com/pavelzaitsau/finalsurge-mcp.git
cd finalsurge-mcp
uv sync
FS_EMAIL=you@example.com uv run finalsurge-mcp --set-passwordThe last command stores the Final Surge password in the macOS Keychain under the service finalsurge-mcp.
Add the server to ~/Library/Application Support/Claude/claude_desktop_config.json and restart Claude Desktop. Use the full path from which uv and the absolute path of the clone:
"finalsurge": {
"command": "/opt/homebrew/bin/uv",
"args": ["--directory", "/absolute/path/to/finalsurge-mcp", "run", "finalsurge-mcp"],
"env": { "FS_EMAIL": "you@example.com" }
}src/finalsurge_mcp/rules.md holds the author's own conventions: paces, heart rate and the coach's phrasing. Copy it, adjust it to your training, and point FS_RULES_FILE at your copy.
Then ask Claude: "Build this week's workouts from Final Surge and show me the preview."
Claude reads the rules, builds the steps and shows a preview with a preview_token. After approval, Claude saves the steps with that token. The watch receives the workout after the Final Surge app syncs.
Related MCP server: Garmin Workout Pipeline
What it does not do
It does not talk to the watch. Final Surge owns the sync to Apple Watch, Garmin and Coros.
It does not parse the coach's text. Claude converts the text, and the server rejects steps that break a hard rule. See ADR-0002.
It does not use a public API. Final Surge has none, and the server calls the endpoints of the web app. See the API notes.
It does not overwrite a workout that already has steps, unless the request says so. An overwrite keeps a backup that
restore_backupputs back.
Configuration
Setting | Default | Effect |
| none, required | Final Surge login, and the Keychain account name |
| Keychain | Password; overrides the Keychain entry. Avoid it in |
| none | Session token; skips the login |
| from the login or | Final Surge user key |
|
| Rules file returned to Claude |
|
| Token cache (mode 0600, tied to |
|
| API root |
A change to rules.md applies on the next call. A change to the Python code applies after a restart of Claude Desktop.
Tools
Tool | What it does |
| Lists calendar workouts with the coach's text |
| Returns |
| Returns past coach texts with the steps built by hand, and flags the ones that break the current rules |
| Returns the heart-rate zones of the Final Surge profile, for reference |
| Checks the steps, renders them and returns a |
| Writes the previewed steps to the builder and reads them back |
| Puts back the steps that an overwrite replaced |
| Returns the steps in the builder |
Troubleshooting
Symptom | Cause | Fix |
| Wrong password, or Final Surge asks for a captcha | Run |
A workout of the first day is missing | Final Surge excludes the start date of a range | Already handled; update the server if it reappears |
A rule change has no effect | The change is in Python code | Restart Claude Desktop |
| The server saves only today and later | Pick a current workout |
| The steps changed after the preview | Preview again and approve the new text |
| The save succeeded, the read-back failed | Call |
Development
scripts/check.shThe script runs the tests, the Markdown gate (markdownlint-cli2, through npx) and the docs style gate (vale). GitHub Actions runs the same script on every push and pull request.
Enable the commit-message hook once per clone:
git config core.hooksPath .githooksMore
Conversion rules: read before changing how Claude builds a workout.
Final Surge API notes: read when an endpoint stops working.
Decisions: read before changing the architecture.
Changelog: what changed in each version.
License
Available Tools
8 toolsget_examplesB
Recent workouts that already have a structured workout: coach text + the steps the athlete built. Examples flagged OLD STYLE break the current rules and must not be copied.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| days_back | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load; it does disclose a meaningful trait beyond the schema — that some returned items carry an OLD STYLE flag and are unsuitable as templates. It says nothing about ordering, whether results are truncated by the limit, or the read-only nature of the call, leaving those to inference.
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 short sentences with the positive definition first and the OLD STYLE warning second — no filler. The wording is slightly compressed ('coach text + the steps the athlete built') but still readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers what the tool returns conceptually. However, for a tool whose two numeric parameters are entirely undocumented, the definition is not fully sufficient to tune the call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and neither 'limit' nor 'days_back' is mentioned in the description, so their defaults (8 and 180) and effect are undocumented anywhere. The phrase 'recent workouts' only loosely gestures at a time window without clarifying that days_back controls it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('recent workouts that already have a structured workout') and the payload ('coach text + the steps the athlete built'), which is specific enough to distinguish it from list_workouts or get_structured_workout. It never states an explicit verb ('return', 'fetch'), so the agent infers retrieval from the 'get_examples' name rather than the prose.
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 directive is a data-quality caveat — entries flagged OLD STYLE 'must not be copied' — which tells the agent how to use the results but not when to pick this tool over siblings like list_workouts or get_structured_workout. The purpose (gathering reference examples) is implied rather than stated as a usage condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_parsing_rulesA
The athlete's conventions for turning coach text into steps. ALWAYS read before building steps.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description bears the behavioral burden; it signals a prerequisite read operation and implies a cheap, side-effect-free lookup. It does not state the freshness or volatility of the conventions, permissions needed, or what the rules look like beyond the output schema's own documentation.
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 short sentences with zero filler, and the mandatory-use directive is front-loaded immediately after the resource definition. Every word 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 zero-parameter read tool with an output schema already documenting return values, the definition covers what it returns and when to call it. The remaining gap is small: no mention of whether the conventions are athlete-specific at call time and no indication of what to do if the call fails.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter meaning for the description to add; the baseline of 4 for 0-param tools would apply. The description does not compensate with any note about implicit context (e.g. which athlete's conventions are returned), so it sits at a neutral minimum.
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 identifies a specific resource — the athlete's conventions for converting coach text into structured steps — which clearly separates it from siblings like get_zones or get_examples. It lacks an explicit verb (e.g. 'retrieves'), leaving the read action implied mainly by the tool name.
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?
'ALWAYS read before building steps' is a direct, unambiguous when-to-use instruction that ties this tool to the step-building workflow (preview_structured_workout / save_structured_workout). It does not name those siblings explicitly or describe any case where skipping it is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_structured_workoutC
Steps currently saved in the builder for a workout (compact form), or null.
| Name | Required | Description | Default |
|---|---|---|---|
| workout_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full behavioral burden. It discloses that the result reflects the currently saved builder state, returns a compact form, and can be null, but it does not state read-only behavior, permissions, or error conditions.
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 one short, front-loaded sentence with no wasted wording. Its brevity contributes to some ambiguity, but structurally it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of sibling tools that preview and save structured workouts, the definition is missing enough usage and parameter context for an agent to reliably select and call this tool. The output schema covers return values, but the description does not compensate for the gaps.
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 should explain the sole workout_key parameter. It only says 'for a workout,' which implies the parameter's purpose but does not clarify format, source, or expected values.
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 implies retrieval of saved workout steps and mentions compact form/null, but it does not explicitly state the verb or clearly distinguish this tool from sibling tools such as preview_structured_workout or save_structured_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?
There is no explicit guidance on when to use this tool versus the preview, save, or list sibling tools. The phrase 'currently saved' hints at reading persisted state, but the agent must infer that distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_zonesA
Heart-rate zones of the Final Surge profile, for reference only. Steps take heart rate in bpm ('hr').
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and 'for reference only' is the only behavioral signal, implying a side-effect-free read. That is useful but thin: nothing about whether zones are user-configurable, whether they vary by sport, or whether the call can fail for profiles lacking zone data. The presence of an output schema relieves the description of explaining return values.
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 short sentences with no filler, and the core purpose is front-loaded. The second sentence adds non-redundant cross-referential context rather than restating the first.
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 lookup with an output schema and no annotations, this is close to complete: purpose, read-only nature, and relevance to step heart-rate targets are all conveyed. A brief note on what the zone response covers (e.g., zone thresholds versus per-activity zones) would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The mention of 'hr' relates to workout step encoding rather than to any input, which is a helpful cross-reference but not strictly parameter semantics.
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 resource: heart-rate zones of the Final Surge profile. Combined with the tool name get_zones, the verb+resource pairing is unambiguous, and no sibling (list_workouts, get_parsing_rules, save_structured_workout, etc.) covers zones. It stops short of saying what a zone set contains (boundaries, sport, units), so it is clear but not fully specified.
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?
'For reference only' signals this is a lookup rather than a mutation, and the note that steps take heart rate in bpm ('hr') gives a concrete reason to call it when interpreting or authoring step targets. However, there is no explicit guidance on when to call this versus get_parsing_rules or get_examples, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workoutsB
List planned workouts in the Final Surge calendar (dates YYYY-MM-DD, inclusive).
Returns coach's text in description and whether the builder already has steps.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | ||
| start_date | Yes | ||
| only_unstructured | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden; it does disclose the return contents (coach text in `description`, a flag for whether the builder has steps) and clarifies that the date range is inclusive. It omits other behavioral facts an agent would want: that this is a read-only operation, whether results span all calendars or only the authenticated athlete's, and any ordering or result-count limits.
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 short sentences, front-loaded with the core purpose and followed by the format and return details, with no filler. The backtick reference to `description` is slightly terse but functional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description correctly avoids that. However, against a three-parameter tool with zero schema descriptions and no annotations, the undefined `only_unstructured` filter and the missing read-only/scope statement leave real gaps.
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 explain all three parameters. It covers the two date parameters well (YYYY-MM-DD, inclusive) but never explains `only_unstructured`; the phrase 'whether the builder already has steps' only obliquely hints that unstructured workouts exist as a concept. One of three parameters remains semantically undefined.
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 gives a specific verb (list) plus resource (planned workouts) scoped to the Final Surge calendar, which distinguishes it from get_structured_workout, which fetches a single workout's structure. It also fixes the date format, which an agent needs before calling. It stops short of naming siblings explicitly, so it is clear but not fully differentiated.
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?
There is no when-to-use or when-not-to-use guidance, and no mention of the natural alternatives in the sibling set (get_structured_workout, preview_structured_workout) or of what to do with the returned workouts. An agent must infer the discovery-then-fetch workflow entirely on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_structured_workoutA
Check compact steps against the hard rules and render a preview. Writes nothing. Step: {kind: warmup|active|rest|cooldown, ONE of distance_km|distance_m|minutes|seconds|time, ONE target: pace "4:30-4:40" (min/km) | hr "120-135" (bpm), optional short English note}. Repeat: {repeat: N, steps: [...]}. Read get_parsing_rules first. Show the text to the athlete; pass preview_token to save_structured_workout after the athlete approves.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| steps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the safety burden, and it does the most important part by stating 'Writes nothing' and framing the tool as a validation gate against 'hard rules'. It leaves some behavior implicit: it never says what a rule violation looks like (error text vs. partial preview) or that the preview_token is scoped/expiring. Strong but not complete for a zero-annotation 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?
Front-loaded with purpose and the no-write guarantee, then the step grammar, then the follow-up action — a sensible order with no filler sentences. The brace/bracket notation is dense and telegraphic, which is efficient for a model but slightly harder to parse than plain prose.
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 2-parameter validation tool with no annotations and no output schema, the description covers the input contract, the prerequisite read, and the downstream save handoff. Gaps remain around the response shape (what preview text looks like, whether preview_token is returned always) and error behavior on rule violations, which matter because there is no output schema to fall back on.
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% and 'steps' is an untyped free-form object array, so the description's inline grammar (kind enum, exactly one of distance_km|distance_m|minutes|seconds|time, exactly one target, optional English note, repeat nesting) supplies nearly all the meaning an agent needs to build valid input. The 'name' parameter is never mentioned, and the grammar arguably duplicates get_parsing_rules, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check compact steps against the hard rules and render a preview') and immediately scopes it against the write path with 'Writes nothing' plus the handoff to save_structured_workout. An agent can tell this apart from save_structured_workout or get_structured_workout without opening any 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?
Gives an explicit prerequisite ('Read get_parsing_rules first'), an explicit ordering rule ('Show the text to the athlete; pass preview_token to save_structured_workout after the athlete approves'), and thereby names the alternative tool and the condition that selects it. This is a full workflow contract, not a hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_backupB
Restore the builder steps saved before an overwrite. The current steps are backed up first.
| Name | Required | Description | Default |
|---|---|---|---|
| backup_file | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It valuably discloses that current steps are backed up first, making the operation effectively recoverable, but says nothing about permissions, failure modes with an invalid backup file, or what the restore returns.
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, front-loaded with the action and followed by the safety property. No filler or redundancy.
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 mutation with no annotations and no output schema, the description covers the critical safety behavior but leaves the source of backup_file and the post-restore state unexplained. Adequate but with clear gaps an agent would need to infer.
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 single required parameter 'backup_file' has no description in the schema, so the description must compensate. It implies the file holds pre-overwrite steps but never explains how an agent obtains a valid backup_file value, its format, or where backups are discoverable.
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?
Names a specific verb (restore) and resource (builder steps saved before an overwrite), which is concrete enough for an agent to act on. It doesn't explicitly differentiate from siblings like save_structured_workout or preview_structured_workout, and the relationship between 'builder steps' and 'structured workout' is left implicit.
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 on when to use this versus save_structured_workout or preview_structured_workout, and no prerequisites or exclusions stated. The phrase 'saved before an overwrite' hints at the triggering scenario but never states it as a rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_structured_workoutA
Write the previewed steps into the Final Surge Workout Builder; Final Surge syncs them to the watch. preview_token must come from preview_structured_workout for exactly these name and steps, after the athlete approved the preview (or inside the approved nightly task). Refuses past dates, and refuses a workout that already has steps unless overwrite=true; an overwrite saves the old steps to a backup file first.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| name | Yes | ||
| steps | Yes | ||
| overwrite | No | ||
| workout_key | Yes | ||
| preview_token | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the write/mutation, the token-binding requirement, the refusal cases, and that an overwrite backs up old steps to a file first. It leaves some gaps, such as permission/auth needs, what a token mismatch returns, and whether writes are idempotent, but the risky behaviors are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and downstream effect, then preconditions, then refusal/overwrite rules. Dense with no filler, though the parenthetical about the nightly task slightly interrupts the flow.
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 6-parameter mutation with no annotations and no output schema, the description covers the guardrails and token workflow well but does not describe the return value, the meaning of workout_key, or the expected shape of steps. Adequate to call safely in the happy path, incomplete for error handling.
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%, so the description must compensate. It strongly explains preview_token (origin, binding to name and steps, approval requirement) and overwrite (needed to replace existing steps, triggers a backup), but leaves workout_key, date format, name, and the structure of steps entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and target system ('Write the previewed steps into the Final Surge Workout Builder') and adds the downstream effect ('Final Surge syncs them to the watch'). It is clearly distinguishable from the sibling preview_structured_workout, which produces the token this tool consumes.
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?
Gives explicit preconditions (preview_token must come from preview_structured_workout for exactly these name and steps, after athlete approval or inside the approved nightly task) and explicit exclusion conditions (refuses past dates, refuses a workout that already has steps unless overwrite=true). An agent knows both when to call it and when it will be rejected.
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.2.0- First observed
get_examples - First observed
get_parsing_rules - First observed
get_structured_workout - First observed
get_zones - First observed
list_workouts - First observed
preview_structured_workout - First observed
restore_backup - First observed
save_structured_workout
TDQS
Scored across 8 tools
Most tools have clearly distinct roles: list_workouts reads the calendar, get_structured_workout reads the builder, preview/save/restore form an unambiguous write pipeline. The only mild overlap is between get_parsing_rules and get_examples, which are both 'reference material to read before building,' though their descriptions clarify the difference (rules vs. concrete examples).
All eight tools follow a strict snake_case verb_noun pattern: list_workouts, get_zones, get_parsing_rules, get_examples, get_structured_workout, preview_structured_workout, save_structured_workout, restore_backup. The shared 'structured_workout' stem across preview/save/get reinforces the pipeline.
Eight tools is well-scoped for a focused workout-builder server, with no filler. Each tool earns its place: calendar read, three reference reads, builder read, validation, write, and undo.
The build → preview → save → restore lifecycle is fully covered, including safety nets like backups and overwrite protection. Minor gaps exist: there is no way to create a new planned workout or clear steps without overwriting with new ones, but these are workable around within the stated workflow.
Maintenance
Related MCP Connectors
AI coach for Garmin: builds training plans and structured workouts, synced straight to your watch.
Your AI writes training plans that arrive as structured workouts on iPhone and Apple Watch.
Running coach: your AI reads your runs and recovery, and writes sessions to your watch or phone.
Training log for coaches: your AI assistant finds clients, reads history, logs and plans workouts.
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.322 npm2ISC
- AlicenseAqualityCmaintenanceEnables building and uploading structured workouts to Garmin Connect using YAML or natural language, supporting running, cycling, and strength with zones and circuits.243MIT
- AlicenseAqualityAmaintenanceEnables users to describe workouts in plain English and have them created as structured Garmin Connect workouts with pace, HR, power, cadence targets, and repeat blocks. Also provides full workout lifecycle management including listing, updating, deleting, and scheduling to the calendar.872 npmMIT
- FlicenseNot gradedqualityAmaintenanceEnables Claude and other AI assistants to query workouts, build structured intervals, manage calendars, track fitness trends, and control training through natural conversation without official API approval.-