Garmin Workout Pipeline
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GARMIN_EMAIL | Yes | Your Garmin Connect email address. | |
| GARMIN_PASSWORD | Yes | Your Garmin Connect password. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_workoutA | Create a new workout. Args: name: Workout name (e.g. "Hyrox Race Sim") type: Sport type — one of: running, cycling, strength, swimming, walking, hiking |
| set_workout_nameC | Rename the current workout. Args: name: New workout name |
| get_workoutB | Get the current workout summary. |
| clear_workoutA | Clear the current workout and start fresh. |
| add_warmupB | Add a warmup step. Args: duration: Duration as "M:SS" or "lap" for lap button. Default: lap. zone: Training zone name (e.g. "easy", "z2"). exercise: Exercise name for strength warmups (e.g. "rowing_machine"). notes: Notes to display on the watch. |
| add_cooldownA | Add a cooldown step. Args: duration: Duration as "M:SS" or "lap" for lap button. Default: lap. zone: Training zone name (e.g. "easy", "z1"). exercise: Exercise name for strength cooldowns (e.g. "rowing_machine"). notes: Notes to display on the watch. |
| add_runA | 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. Args: duration: Duration as "M:SS" or "lap" for lap button. distance: Distance like "1km", "400m", "1mi". zone: Training zone name (e.g. "threshold", "tempo", "z4"). pace_min: Faster pace bound (e.g. "6:25/mi"). Must pair with pace_max. pace_max: Slower pace bound (e.g. "6:40/mi"). Must pair with pace_min. hr_min: Lower HR bound in bpm. Must pair with hr_max. hr_max: Upper HR bound in bpm. Must pair with hr_min. notes: Notes to display on the watch. |
| add_bikeA | 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. Args: duration: Duration as "M:SS" or "lap" for lap button. distance: Distance like "10km", "20mi". zone: Training zone name (e.g. "threshold", "z3"). power_min: Lower power in watts. Must pair with power_max. power_max: Upper power in watts. Must pair with power_min. power_pct_min: Lower power as %FTP. Must pair with power_pct_max. power_pct_max: Upper power as %FTP. Must pair with power_pct_min. |
| add_exerciseA | Add a strength/cardio exercise step. End condition: set reps OR duration OR neither (lap button). Args: exercise: Exercise name (e.g. "wall_ball", "kettlebell_swing", "burpee"). Use list_exercises to see all available exercises. duration: Duration as "M:SS" or "lap" for lap button. reps: Number of repetitions. weight: Weight in lbs. notes: Notes to display on the watch (e.g. distance for carries). |
| add_restB | Add a rest step. Args: duration: Rest duration as "M:SS" (e.g. "2:00" for 2 minutes). |
| add_recoveryA | Add a recovery step between intervals. Args: duration: Duration as "M:SS" or "lap" for lap button. Default: lap. distance: Distance like "200m" for recovery jogs. zone: Training zone name (e.g. "z1", "easy"). |
| add_circuitA | Open a new circuit/repeat group. Steps added after this go inside the circuit. Call end_circuit when done adding steps to close it. Args: iterations: Number of times to repeat the circuit. skip_last_rest: If true, skip the last rest step in the circuit. |
| end_circuitA | Close the current circuit. Subsequent steps will be added at the parent level. |
| remove_stepA | Remove a step by its 1-based index from the top-level step list. Args: index: 1-based step index (as shown in get_workout output). |
| preview_uploadA | Preview the workout that would be uploaded to Garmin Connect. Always call this before upload_workout so the user can review and confirm. |
| upload_workoutA | Upload the current workout to Garmin Connect. IMPORTANT: Always call preview_upload first and get explicit user confirmation before calling this tool. Replaces any existing workout with the same name. Args: confirm: Must be true. Confirms the user has approved the upload. schedule_date: Optional date to schedule the workout (YYYY-MM-DD). |
| list_workoutsB | List all workouts on Garmin Connect. |
| delete_workoutA | Delete a workout from Garmin Connect. Args: workout_id: Garmin workout ID (from list_workouts). |
| list_exercisesB | List available exercises for strength/cardio workouts. Args: filter: Optional filter string to search by name or category. |
| get_zonesA | Show available training zones from zones.yaml. Args: sport_type: Filter by sport — "running" or "cycling". Shows all if omitted. |
| validate_workoutB | Compile the current workout and return the Garmin API JSON for inspection. |
| save_yamlA | Save the current workout as a YAML template file. Args: path: File path to save to. Defaults to workouts/templates/.yaml. |
| load_templateA | Load a workout from a YAML template file. Args: path: Path to the YAML file (e.g. "workouts/templates/hyrox-sim.yaml"). |
| list_templatesA | List available YAML workout templates in workouts/templates/. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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/k-schmidt/Garmin-Workout-Pipeline'
If you have feedback or need assistance with the MCP directory API, please join our Discord server