YAML to Garmin Connect workout pipeline with MCP server for conversational workout building
Server has 20 tools with consistent naming (verb_noun pattern) and descriptions present for all. However, parameter descriptions are often generic or missing detail. Input schemas are visible and typed, but lack constraints (enums, ranges). Output schemas are undocumented, LLMs cannot predict return structure. Error handling is minimal; no recovery guidance. Composition is reasonable (single-responsibility tools), but some tools expose implementation details (e.g., 'lap' as a duration string). No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels. Baseline: 549 production tools average 194 chars for descriptions; this server averages ~120 chars, often generic.
Add a cycling interval step. End condition: set exactly one of duration, distance, or neither (lap button). Target: set zone OR power range OR power_pct range OR none.
Add a cooldown step.
Add a strength/cardio exercise step.
Add a recovery interval step.
Add a rest/recovery step.
Add a running interval step. End condition: set exactly one of duration, distance, or neither (lap button). Target: set zone OR pace range OR HR range OR none.
Add a warmup step.
Output schemas undocumented. Tools like get_workout, list_exercises, compile_workout, list_workouts return formatted strings or objects, but LLMs cannot predict structure. No return type hints in docstrings.
Parameter constraints missing. 'type' in create_workout accepts string but should be enum (running|cycling|strength|swimming|walking|hiking). 'zone' in add_run/add_bike/add_recovery accepts free-form string; should validate against loaded zones. 'duration' format ('M:SS' or 'lap') not formally specified.
No tool annotations. Tools marked WRITE, DESTRUCTIVE, IRREVERSIBLE in metadata but not exposed via readOnlyHint/destructiveHint in schema. LLMs cannot distinguish safe reads from dangerous writes without explicit annotations.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | <=2025-11-25 | v2 |
Clear the current workout and start fresh.
Compile the current workout to Garmin API JSON format.
Create a new workout.
Delete a workout from Garmin Connect.
Finish building the current circuit and add it to the workout.
Get the current workout summary.
List all available exercises.
List all workouts on Garmin Connect.
Load training zones from a YAML file.
Rename the current workout.
Display the currently loaded training zones.
Start building a circuit/repeat group.
Compile and upload the current workout to Garmin Connect.
Error handling absent. No recovery guidance. If create_workout fails (invalid sport type), LLM gets no hint to retry with valid enum. If upload_workout fails (auth error), no guidance on next steps.
Parameter descriptions generic or incomplete. 'zone' described as 'Training zone name (e.g. "easy", "z2")' but does not explain valid values depend on loaded zones file. 'duration' format not formally specified; LLMs may pass invalid formats.