Skip to main content
Glama
JJRPF

Garmin MCP Server

by JJRPF

upload_workouts

Upload multiple workouts from JSON data in one request to create them in Garmin Connect, avoiding repeated single-upload calls.

Instructions

Upload multiple workouts from JSON data in a single call

Creates multiple new workouts in Garmin Connect. Each item in the list uses the same structure as upload_workout.

IMPORTANT: Step types must use Garmin's DTO format:

  • Use "ExecutableStepDTO" for regular steps (warmup, interval, cooldown, recovery)

  • Use "RepeatGroupDTO" for repeat/interval groups with numberOfIterations. Always include endCondition with conditionTypeId 7 and conditionTypeKey "iterations"; omitting conditionTypeId causes the API to silently corrupt the repeat count.

IMPORTANT: For named heart rate zone targets, use "zoneNumber" (1-5), NOT targetValueOne/targetValueTwo. For custom heart-rate ranges, use targetType {"workoutTargetTypeId": 4, "workoutTargetTypeKey": "heart.rate.zone"} with targetValueOne/targetValueTwo. Target values belong on the workout step, alongside targetType, not inside it. For cycling power zone targets (zone-based), use workoutTargetTypeId 2, key "power.zone". For cycling absolute watt range targets, use workoutTargetTypeId 6, key "power.between", with targetValueOne (low watts) and targetValueTwo (high watts). Target type IDs and keys must match Garmin's canonical mapping.

IMPORTANT: End condition IDs and keys must match Garmin's canonical mapping. Garmin treats conditionTypeId as authoritative, so mismatches are rejected before upload.

Args: workouts: List of workout dictionaries, each containing workout structure (name, sport type, segments, etc.) — same format as upload_workout.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
workoutsYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observedv0.1.0

TDQS

A4.3/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 behavioral burden, and it does well: it warns that omitting conditionTypeId 'causes the API to silently corrupt the repeat count,' that Garmin treats conditionTypeId as authoritative and rejects mismatches, and it explains target/value placement. It does not cover auth, response shape, or partial-failure behavior, but the disclosed failure modes are substantive and actionable.

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 long but organized into an intro, several IMPORTANT blocks, and an Args section, with warnings grouped by topic. It front-loads the batch behavior and uses clear labels, so the length is justified by the complexity of the payload.

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?

Given one undocumented array parameter and no annotations, the description covers the critical context: batch semantics, item structure pointer, DTO requirements, target-zone mappings, and rejection/corruption behaviors. The output schema exists, so not explaining return values is acceptable; the main omission is an explicit single-vs-batch decision rule, though sibling naming makes it easy to infer.

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 description coverage is 0%, so the description must compensate. It explains the workouts parameter as a list of dictionaries with the 'same format as upload_workout' and adds important nested semantics for step DTOs, heart-rate/power target types, and end conditions. It does not enumerate every allowed key, but it references the single-upload tool for the full structure.

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?

The description opens with 'Upload multiple workouts from JSON data in a single call' and clarifies it 'Creates multiple new workouts in Garmin Connect.' This names a specific verb, resource, and scope, and clearly distinguishes it from the sibling upload_workout as the batch variant.

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?

The phrase 'multiple workouts in a single call' sets a clear batch context, and the statement that each item uses the same structure as upload_workout implies the single-upload alternative. It does not explicitly say 'use upload_workout for one workout' or list exclusions, so it is clear but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/JJRPF/garmin_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server