Skip to main content
Glama

get_training_load

Read-only

Retrieve Garmin training-load and fitness metrics for a date to assess load balance, training status, load focus, VO2 max, and acclimation.

Instructions

Get Garmin's training-load and fitness metrics as of a date: acute and chronic load, load ratio and status, training status, load focus against Garmin's targets, VO2 max, endurance and hill scores, and heat/altitude acclimation.

Use for training status and load balance; use get_training_week for activity totals in a calendar week, get_training_readiness for readiness on a day, get_training_context to combine load with recovery, or get_vo2max_history for VO2 max over months (this tool's vo2_max is often absent on days without a new estimate). Values are Garmin's own. Device support varies: a source Garmin has no data for is named in availability, and its fields are absent rather than zero.

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
dateNoCalendar date in YYYY-MM-DD format, e.g. 2026-10-09; any past date Garmin still stores. Omit or pass null for today in the server's local timezone.

Output Schema

NameRequiredDescriptionDefault
dateYes
vo2_maxNo
acute_loadNo
hill_scoreNo
load_ratioNo
acwr_statusNo
weekly_loadNo
acwr_percentNo
availabilityNo
chronic_loadNo
acwr_feedbackNo
anaerobic_loadNo
endurance_scoreNo
training_statusNo
low_aerobic_loadNo
optimal_load_maxNo
optimal_load_minNo
high_aerobic_loadNo
load_focus_feedbackNo
anaerobic_target_maxNo
anaerobic_target_minNo
training_status_codeNo
low_aerobic_target_maxNo
low_aerobic_target_minNo
high_aerobic_target_maxNo
high_aerobic_target_minNo
heat_acclimation_percentNo
altitude_acclimation_percentNo

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: +"Calendar date in YYYY-MM-DD format, e.g. 2026-10-09; any past date Garmin still stores. Omit or pass null for today in the server's local timezone."
    • addedOutput schema / $defs
      Added value: +{
      +  "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: +{
      +  "acute_load": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Acute Load"
      +  },
      +  "acwr_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Acwr Feedback"
      +  },
      +  "acwr_percent": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Acwr Percent"
      +  },
      +  "acwr_status": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Acwr Status"
      +  },
      +  "altitude_acclimation_percent": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Altitude Acclimation Percent"
      +  },
      +  "anaerobic_load": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Anaerobic Load"
      +  },
      +  "anaerobic_target_max": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Anaerobic Target Max"
      +  },
      +  "anaerobic_target_min": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Anaerobic Target Min"
      +  },
      +  "availability": {
      +    "items": {
      +      "$ref": "#/$defs/AvailabilityNotice"
      +    },
      +    "title": "Availability",
      +    "type": "array"
      +  },
      +  "chronic_load": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Chronic Load"
      +  },
      +  "date": {
      +    "title": "Date",
      +    "type": "string"
      +  },
      +  "endurance_score": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Endurance Score"
      +  },
      +  "heat_acclimation_percent": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Heat Acclimation Percent"
      +  },
      +  "high_aerobic_load": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "High Aerobic Load"
      +  },
      +  "high_aerobic_target_max": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "High Aerobic Target Max"
      +  },
      +  "high_aerobic_target_min": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "High Aerobic Target Min"
      +  },
      +  "hill_score": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Hill Score"
      +  },
      +  "load_focus_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Load Focus Feedback"
      +  },
      +  "load_ratio": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Load Ratio"
      +  },
      +  "low_aerobic_load": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Low Aerobic Load"
      +  },
      +  "low_aerobic_target_max": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Low Aerobic Target Max"
      +  },
      +  "low_aerobic_target_min": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Low Aerobic Target Min"
      +  },
      +  "optimal_load_max": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Optimal Load Max"
      +  },
      +  "optimal_load_min": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Optimal Load Min"
      +  },
      +  "training_status": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Training Status"
      +  },
      +  "training_status_code": {
      +    "anyOf": [
      +      {
      +        "type": "integer"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Training Status Code"
      +  },
      +  "vo2_max": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Vo2 Max"
      +  },
      +  "weekly_load": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Weekly Load"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "date"
      +]
    • changedOutput schema / title
      Previous value: -"get_training_loadDictOutput"New value: +"TrainingLoad"
  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?

Annotations already declare readOnly/openWorld/non-destructive, and the description adds substantial context beyond them: saved local Garmin auth is required, the local cache may be updated but the Garmin account is never modified, failures are not retried automatically, and unavailable sources are reported by name in an availability field with fields absent rather than zeroed.

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?

Three short paragraphs, front-loaded with purpose then routing then operational caveats; every sentence carries information. The alternative-tool list is long but each entry changes a routing decision, so little is wasted.

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?

With an output schema present, the description needn't explain return values, and it covers the remaining gaps an agent needs: auth prerequisite, cache side effects, no-retry behavior, and availability-based missing fields. Nothing material is omitted for a one-parameter read tool.

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?

The single date parameter is fully documented in the schema (format, past-date scope, null = today), so the schema carries the load and baseline 3 applies. The description adds no additional syntax or defaults for the parameter itself, only metric-level caveats.

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?

States a specific verb and resource ('Get Garmin's training-load and fitness metrics as of a date') and enumerates the returned metric families (acute/chronic load, load ratio, training status, load focus, VO2 max, endurance/hill scores, acclimation). This is clearly separable from siblings like get_training_week or get_vo2max_history.

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 when to use it ('training status and load balance') and names four alternatives with the exact condition that selects each (calendar-week totals, daily readiness, load+recovery, VO2 max over months). It even explains the vo2_max absence caveat that would otherwise push an agent to the wrong sibling.

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