Skip to main content
Glama
finalsurge-mcp

finalsurge-mcp

by pavelzaitsau

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-password

The 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_backup puts back.

Configuration

Setting

Default

Effect

FS_EMAIL

none, required

Final Surge login, and the Keychain account name

FS_PASSWORD

Keychain

Password; overrides the Keychain entry. Avoid it in claude_desktop_config.json, which stores it as plain text

FS_TOKEN

none

Session token; skips the login

FS_USER_KEY

from the login or /Profile

Final Surge user key

FS_RULES_FILE

src/finalsurge_mcp/rules.md

Rules file returned to Claude

FS_CONFIG_DIR

~/.config/finalsurge-mcp

Token cache (mode 0600, tied to FS_EMAIL) and backups/

FS_BASE_URL

https://beta.finalsurge.com/api

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

list_workouts(start_date, end_date, only_unstructured)

Lists calendar workouts with the coach's text

get_parsing_rules()

Returns rules.md

get_examples(limit, days_back)

Returns past coach texts with the steps built by hand, and flags the ones that break the current rules

get_zones()

Returns the heart-rate zones of the Final Surge profile, for reference

preview_structured_workout(name, steps)

Checks the steps, renders them and returns a preview_token; writes nothing

save_structured_workout(workout_key, date, name, steps, preview_token, overwrite)

Writes the previewed steps to the builder and reads them back

restore_backup(backup_file)

Puts back the steps that an overwrite replaced

get_structured_workout(workout_key)

Returns the steps in the builder

Troubleshooting

Symptom

Cause

Fix

Login failed

Wrong password, or Final Surge asks for a captcha

Run --set-password again, or set FS_TOKEN from localStorage.getItem('auth-token') on beta.finalsurge.com

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

... is in the past

The server saves only today and later

Pick a current workout

preview_token does not match

The steps changed after the preview

Preview again and approve the new text

verified: false after a save

The save succeeded, the read-back failed

Call get_structured_workout; do not overwrite

Development

scripts/check.sh

The 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 .githooks

More

License

MIT

Available Tools

8 tools
get_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.

NameRequiredDescriptionDefault
limitNo
days_backNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral load; it does disclose 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
workout_keyYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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').

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
end_dateYes
start_dateYes
only_unstructuredNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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

Schema description coverage is 0%, so the description must 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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
nameYes
stepsYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
backup_fileYes

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
dateYes
nameYes
stepsYes
overwriteNo
workout_keyYes
preview_tokenYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 8 tool updatesv0.2.0
    • First observedget_examples
    • First observedget_parsing_rules
    • First observedget_structured_workout
    • First observedget_zones
    • First observedlist_workouts
    • First observedpreview_structured_workout
    • First observedrestore_backup
    • First observedsave_structured_workout

TDQS

A3.6/5.0

Scored across 8 tools

Disambiguation4/5

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).

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers