Skip to main content
Glama

get_training_readiness

Read-only

Retrieve Garmin's training-readiness score, component percentages, and factor feedback for a specific day to assess readiness and identify limiting factors.

Instructions

Get Garmin's training-readiness score, component percentages, and factor feedback for one day.

Use for Garmin's readiness assessment; use get_recovery for a combined recovery summary or get_training_context to include recent training. Missing device metrics are not estimated. timestamp is when Garmin calculated the score, as ISO 8601 with an explicit UTC offset. recovery_time_hours is Garmin's remaining recovery time, in the same unit as get_recovery_trend.

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
levelNo
scoreNo
feedbackNo
timestampNoWhen Garmin calculated this readiness: 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.
sleep_scoreNo
availabilityNo
hrv_factor_percentNo
hrv_factor_feedbackNo
recovery_time_hoursNoGarmin's remaining recovery time in hours, to one decimal.
acute_load_factor_percentNo
acute_load_factor_feedbackNo
recovery_time_change_phraseNo
sleep_score_factor_feedbackNo
sleep_history_factor_percentNo
recovery_time_factor_feedbackNo
sleep_history_factor_feedbackNo
stress_history_factor_percentNo
stress_history_factor_feedbackNo

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_factor_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Acute Load Factor Feedback"
      +  },
      +  "acute_load_factor_percent": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Acute Load Factor Percent"
      +  },
      +  "availability": {
      +    "items": {
      +      "$ref": "#/$defs/AvailabilityNotice"
      +    },
      +    "title": "Availability",
      +    "type": "array"
      +  },
      +  "date": {
      +    "title": "Date",
      +    "type": "string"
      +  },
      +  "feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Feedback"
      +  },
      +  "hrv_factor_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Hrv Factor Feedback"
      +  },
      +  "hrv_factor_percent": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Hrv Factor Percent"
      +  },
      +  "level": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Level"
      +  },
      +  "recovery_time_change_phrase": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Recovery Time Change Phrase"
      +  },
      +  "recovery_time_factor_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Recovery Time Factor Feedback"
      +  },
      +  "recovery_time_hours": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "Garmin's remaining recovery time in hours, to one decimal.",
      +    "title": "Recovery Time Hours"
      +  },
      +  "score": {
      +    "anyOf": [
      +      {
      +        "type": "integer"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Score"
      +  },
      +  "sleep_history_factor_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Sleep History Factor Feedback"
      +  },
      +  "sleep_history_factor_percent": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Sleep History Factor Percent"
      +  },
      +  "sleep_score": {
      +    "anyOf": [
      +      {
      +        "type": "integer"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Sleep Score"
      +  },
      +  "sleep_score_factor_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Sleep Score Factor Feedback"
      +  },
      +  "stress_history_factor_feedback": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Stress History Factor Feedback"
      +  },
      +  "stress_history_factor_percent": {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "title": "Stress History Factor Percent"
      +  },
      +  "timestamp": {
      +    "anyOf": [
      +      {
      +        "type": "string"
      +      },
      +      {
      +        "type": "null"
      +      }
      +    ],
      +    "default": null,
      +    "description": "When Garmin calculated this readiness: 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": "Timestamp"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "date"
      +]
    • changedOutput schema / title
      Previous value: -"get_training_readinessDictOutput"New value: +"TrainingReadiness"
  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 readOnlyHint/openWorldHint/destructiveHint=false, and the description adds substantial context beyond them: it requires saved local Garmin auth (garmin-owl-auth), may update the local cache, never changes the Garmin account, and does not auto-retry failures. It also clarifies that timestamp is Garmin's calculation time with an explicit UTC offset.

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 the sibling routing rule, and each sentence carries distinct information (auth, cache behavior, non-retry, unit alignment). Slight redundancy in explaining return field semantics (timestamp, recovery_time_hours) despite an output schema, which trims it below a 5.

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?

Given one optional param, full schema coverage, an output schema, and read-only annotations, the description covers everything an agent needs: purpose, alternatives, auth prerequisite, cache side effect, and failure behavior. Nothing material is missing.

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 coverage is 100% and the single date parameter is fully documented in the schema (format, past dates, null = today in server timezone), so the description need not compensate. The description adds no parameter-level detail beyond the schema, which is the baseline-3 case.

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-readiness score') plus the payload shape (component percentages, factor feedback, one day). It explicitly names the two sibling tools it is not (get_recovery, get_training_context), so an agent can discriminate without opening schemas.

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?

Gives an explicit use case plus a routing rule: use get_recovery for a combined recovery summary, get_training_context to include recent training. It also sets the expectation that missing device metrics are not estimated, which tells the agent when not to expect filled-in values.

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