validate_workout
Validates workout data against Garmin Connect schema to confirm correctness and prevent creation errors.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| workout_data | Yes |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- The MCP tool handler for 'validate_workout'. Decorated with @mcp.tool, it takes workout_data dict, calls describe_workout for validation/summary, and returns {'valid': True, 'summary': ...}.
@mcp.tool def validate_workout(workout_data: dict) -> dict: summary = describe_workout(workout_data) return {"valid": True, "summary": summary} - describe_workout() helper called by validate_workout. It builds the full workout payload via build_workout_payload (which performs schema validation), then extracts a summary of the workout including name, sport type, step counts, and estimates.
def describe_workout(workout: dict[str, Any]) -> dict[str, Any]: payload = build_workout_payload(workout) steps = payload["workoutSegments"][0]["workoutSteps"] executable_steps = [step for step in steps if step["type"] == "ExecutableStepDTO"] rep_steps = [step for step in executable_steps if step["endCondition"]["conditionTypeKey"] == "reps"] strength_steps = [step for step in executable_steps if step.get("exerciseName")] return { "name": payload["workoutName"], "sportType": payload["sportType"]["sportTypeKey"], "stepCount": len(steps), "executableStepCount": len(executable_steps), "repStepCount": len(rep_steps), "mappedStrengthExerciseCount": len(strength_steps), "estimatedDurationInSecs": payload["estimatedDurationInSecs"], "estimatedDistanceInMeters": payload["estimatedDistanceInMeters"], } - WorkoutInput Pydantic model that defines the input schema for validate_workout (name, type, description, steps). Used by validate_workout_input during payload building.
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:119-122 (registration)The @mcp.tool decorator on line 119 registers validate_workout as an MCP tool with the FastMCP server.
@mcp.tool def validate_workout(workout_data: dict) -> dict: summary = describe_workout(workout_data) return {"valid": True, "summary": summary} - validate_workout_input() performs Pydantic validation of the input dict against WorkoutInput schema. Raises ValueError with JSON error details on invalid input.
def validate_workout_input(workout: dict[str, Any]) -> WorkoutInput: try: return WorkoutInput.model_validate(workout) except ValidationError as exc: raise ValueError(exc.json()) from exc