Skip to main content
Glama

get_training_week

Read-only

Summarize a Monday-Sunday Garmin training week by activity count/type, duration, distance, calories, heart-rate zone time, training effects, and activities for weekly volume comparisons.

Instructions

Summarize the Monday-Sunday calendar week containing date: activity count by type, total duration, distance, and calories, time in HR zones, highest training effects, and the week's activities.

Use for weekly volume, such as this week versus last; use get_training_load for Garmin load and training status, get_activities for other ranges, or get_training_context for the seven days before a date together with recovery. Each total counts only activities that reported that metric and states how many did (missing values are not zero); HR-zone time and training effects cover only activities for which Garmin provided them. At most 100 activities are included. Activity start_time is ISO 8601 with an explicit UTC offset and already local.

Requires saved local Garmin authentication (garmin-owl-auth). Reads Garmin and may update the local cache; never changes your Garmin account. Garmin failures are not retried automatically.

Input Schema

NameRequiredDescriptionDefault
dateNoAny date (YYYY-MM-DD) inside the Monday-Sunday week to summarize, e.g. 2026-10-07 for the week of 5-11 October 2026. Omit or pass null for the current week in the server's local timezone.

Output Schema

NameRequiredDescriptionDefault
week_endYes
activitiesYes
week_startYes
availabilityNo
activity_countYes
hr_zones_secondsNo
total_distance_mNo
total_calories_kcalNo
activity_type_countsNo
detail_activity_countNo
total_duration_secondsNo
calories_activity_countNo
distance_activity_countNo
duration_activity_countNo
hr_zones_activity_countNo
training_effect_activity_countNo
highest_aerobic_training_effectNo
highest_anaerobic_training_effectNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changedv0.3.1
    • changedInput schema / properties / date / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / date / description
      Added value: +"Any date (YYYY-MM-DD) inside the Monday-Sunday week to summarize, e.g. 2026-10-07 for the week of 5-11 October 2026. Omit or pass null for the current week in the server's local timezone."
    • addedOutput schema / $defs
      Added value: +{
      +  "ActivitySummary": {
      +    "properties": {
      +      "activity_id": {
      +        "title": "Activity Id",
      +        "type": "integer"
      +      },
      +      "activity_training_load": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Activity Training Load"
      +      },
      +      "activity_type": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Activity Type"
      +      },
      +      "aerobic_training_effect": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Aerobic Training Effect"
      +      },
      +      "anaerobic_training_effect": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Anaerobic Training Effect"
      +      },
      +      "average_cadence": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Average Cadence"
      +      },
      +      "average_hr_bpm": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Average Hr Bpm"
      +      },
      +      "average_moving_speed_mps": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Average Moving Speed Mps"
      +      },
      +      "average_power_w": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Average Power W"
      +      },
      +      "average_respiration": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Average Respiration"
      +      },
      +      "average_speed_mps": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Average Speed Mps"
      +      },
      +      "average_stride_length_m": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Average Stride Length M"
      +      },
      +      "calories_kcal": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Calories Kcal"
      +      },
      +      "description": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Description"
      +      },
      +      "distance_m": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Distance M"
      +      },
      +      "duration_seconds": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Duration Seconds"
      +      },
      +      "elapsed_seconds": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Elapsed Seconds"
      +      },
      +      "elevation_gain_m": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Elevation Gain M"
      +      },
      +      "elevation_loss_m": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Elevation Loss M"
      +      },
      +      "feel": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Feel"
      +      },
      +      "has_description": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Has Description"
      +      },
      +      "highest_respiration": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Highest Respiration"
      +      },
      +      "hr_zones_seconds": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {
      +              "type": "number"
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Hr Zones Seconds"
      +      },
      +      "intensity_factor": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Intensity Factor"
      +      },
      +      "lowest_respiration": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Lowest Respiration"
      +      },
      +      "max_cadence": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Max Cadence"
      +      },
      +      "max_hr_bpm": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Max Hr Bpm"
      +      },
      +      "max_power_w": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Max Power W"
      +      },
      +      "moderate_intensity_minutes": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Moderate Intensity Minutes"
      +      },
      +      "moving_duration_seconds": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Moving Duration Seconds"
      +      },
      +      "name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Name"
      +      },
      +      "normalized_power_w": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Normalized Power W"
      +      },
      +      "perceived_effort": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Perceived Effort"
      +      },
      +      "recovery_hr_bpm": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Recovery Hr Bpm"
      +      },
      +      "start_time": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Activity start: ISO 8601 with an explicit UTC offset, e.g. 2026-10-09T23:18:16+02:00. The wall time is already local; never add the offset again. The offset is the one Garmin recorded for the device at that moment, or this computer's time zone when Garmin gives only UTC.",
      +        "title": "Start Time"
      +      },
      +      "steps": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Steps"
      +      },
      +      "training_effect_label": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Training Effect Label"
      +      },
      +      "training_stress_score": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Training Stress Score"
      +      },
      +      "vigorous_intensity_minutes": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Vigorous Intensity Minutes"
      +      },
      +      "vo2_max": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "title": "Vo2 Max"
      +      }
      +    },
      +    "required": [
      +      "activity_id"
      +    ],
      +    "title": "ActivitySummary",
      +    "type": "object"
      +  },
      +  "AvailabilityNotice": {
      +    "properties": {
      +      "field": {
      +        "title": "Field",
      +        "type": "string"
      +      },
      +      "message": {
      +        "title": "Message",
      +        "type": "string"
      +      },
      +      "status": {
      +        "title": "Status",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "field",
      +      "status",
      +      "message"
      +    ],
      +    "title": "AvailabilityNotice",
      +    "type": "object"
      +  }
      +}
    • removedOutput schema / additionalProperties
      Removed value: -true
    • addedOutput schema / properties
      Added value: +{
      +  "activities": {
      +    "items": {
      +      "$ref": "#/$defs/ActivitySummary"
      +    },
      +    "title": "Activities",
      +    "type": "array"
      +  },
      +  "activity_count": {
      +    "title": "Activity Count",
      +    "type": "integer"
      +  },
      +  "activity_type_counts": {
      +    "additionalProperties": {
      +      "type": "integer"
      +    },
      +    "title": "Activity Type Counts",
      +    "type": "object"
      +  },
      +  "availability": {
      +    "items": {
      +      "$ref": "#/$defs/AvailabilityNotice"
      +    },
      +    "title": "Availability",
      +    "type": "array"
      +  },
      +  "calories_activity_count": {
      +    "default": 0,
      +    "title": "Calories Activity Count",
      +    "type": "integer"
      +  },
      +  "detail_activity_count": {
      +    "default": 0,
      +    "title": "Detail Activity Count",
      +    "type": "integer"
      +  },
      +  "distance_activity_count": {
      +    "default": 0,
      +    "title": "Distance Activity Count",
      +    "type": "integer"
      +  },
      +  "duration_activity_count": {
      +    "default": 0,
      +    "title": "Duration Activity Count",
      +    "type": "integer"
      +  },
      +  "highest_aerobic_training_effect": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Highest Aerobic Training Effect"
      +  },
      +  "highest_anaerobic_training_effect": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Highest Anaerobic Training Effect"
      +  },
      +  "hr_zones_activity_count": {
      +    "default": 0,
      +    "title": "Hr Zones Activity Count",
      +    "type": "integer"
      +  },
      +  "hr_zones_seconds": {
      +    "additionalProperties": {
      +      "type": "number"
      +    },
      +    "title": "Hr Zones Seconds",
      +    "type": "object"
      +  },
      +  "total_calories_kcal": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Total Calories Kcal"
      +  },
      +  "total_distance_m": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Total Distance M"
      +  },
      +  "total_duration_seconds": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Total Duration Seconds"
      +  },
      +  "training_effect_activity_count": {
      +    "default": 0,
      +    "title": "Training Effect Activity Count",
      +    "type": "integer"
      +  },
      +  "week_end": {
      +    "title": "Week End",
      +    "type": "string"
      +  },
      +  "week_start": {
      +    "title": "Week Start",
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "week_start",
      +  "week_end",
      +  "activities",
      +  "activity_count"
      +]
    • changedOutput schema / title
      Previous value: -"get_training_weekDictOutput"New value: +"TrainingWeek"
  2. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld annotations: it discloses that totals count only activities reporting a metric and state the denominator (missing values are not zero), that HR-zone and training-effect data only cover qualifying activities, a 100-activity cap, timezone/localization of start_time, the required saved Garmin auth, cache updates, and that Garmin failures are not retried. This is exactly the operational context an agent needs.

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?

Front-loaded with purpose and outputs, followed by routing, then caveats. Every sentence carries information, though the final paragraph packs auth, cache, and retry behavior densely enough that it reads as a block rather than distinct points.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers the remaining risks: partial-metric denominators, coverage limits for HR zones/training effects, the 100-activity cap, and auth prerequisites. An agent has everything needed to call and interpret this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single date parameter is already fully documented in the schema, including the YYYY-MM-DD format and null-for-current-week behavior. The description's phrasing ('week containing date') is consistent but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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?

Specific verb (Summarize) plus a precisely scoped resource (the Monday-Sunday calendar week containing date), and it enumerates exactly what the summary contains: activity count by type, duration, distance, calories, HR-zone time, and training effects. It is clearly distinguishable from neighboring weekly/range tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the use case (weekly volume, this week versus last) and names three alternatives with the conditions that select them: get_training_load for Garmin load/status, get_activities for other ranges, get_training_context for prior seven days plus recovery. Nothing is left to inference.

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