preview_workout_payload
Preview a Garmin workout payload to verify structure and content before submission. Supports strength training and other workout types.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| workout_data | Yes |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- The MCP tool handler for 'preview_workout_payload'. Decorated with @mcp.tool, it takes workout_data dict and returns the built payload using the helper build_workout_payload.
@mcp.tool def preview_workout_payload(workout_data: dict) -> dict: return {"payload": build_workout_payload(workout_data)} - The core helper function that builds the Garmin API workout payload from validated input. It validates input, maps sport types, processes steps, and constructs the full payload dict.
def build_workout_payload(workout: dict[str, Any]) -> dict[str, Any]: parsed = validate_workout_input(workout) sport_type_key = parsed.type.lower() sport_type = _get_sport_type(sport_type_key) steps, next_order = _process_steps(parsed.steps, sport_type_key, 1) payload = { "sportType": sport_type, "subSportType": None, "workoutName": parsed.name, "description": parsed.description, "estimatedDistanceUnit": {"unitKey": None}, "workoutSegments": [ { "segmentOrder": 1, "sportType": sport_type, "workoutSteps": steps, } ], "avgTrainingSpeed": None, "estimatedDurationInSecs": _estimate_duration(steps), "estimatedDistanceInMeters": _estimate_distance(steps), "estimateType": None, } if next_order <= 1: raise ValueError("Workout must contain at least one step") return payload - Pydantic schema for workout input validation, used by validate_workout_input which is called inside build_workout_payload.
class WorkoutInput(BaseModel): model_config = ConfigDict(extra="forbid") name: str = Field(min_length=1) type: str description: str | None = None steps: list[StepInput] = Field(min_length=1) - src/garmin_workouts_mcp/server.py:114-116 (registration)Tool is registered with FastMCP via the @mcp.tool decorator on line 114. The import of build_workout_payload from .payloads is on line 14.
@mcp.tool def preview_workout_payload(workout_data: dict) -> dict: return {"payload": build_workout_payload(workout_data)}