Skip to main content
Glama

Povver — Strength Training

Update Template

update_template
Idempotent

Update an existing template: change its name, description, or replace its exercise list. When updating exercises, pass the complete exercises array (it replaces the existing list; sets take reps/rir, or duration_s/distance_m for a timed or distance exercise; assistance is assist_kg, never a negative weight) — including each exercise's coach_note, which is cleared for any exercise that omits it, and each exercise's and set's id from get_template so the element keeps its identity (an element sent without an id is treated as NEW and gets a fresh id). Use get_template first to see the current state.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
updatesYesFields to update
template_idYesTemplate ID

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed23 schema fields changed
    • changedInput schema / properties / updates / properties / exercises / items / properties / exercise_id / description
      Previous value: -"Exercise ID"New value: +"Exercise ID. Omit only when sending new_exercise."
    • addedInput schema / properties / updates / properties / exercises / items / properties / measure
      Added value: +{
      +  "description": "How this exercise is counted: \"reps\" (default), \"duration\" (a hold or timed effort: give duration_s on each set, no reps or rir) or \"distance\" (a carry or run: give distance_m). Omit to keep the stored measure, or the exercise's default for a new one. weight, distance_m and duration_s are ALWAYS kg, metres and seconds.",
      +  "enum": [
      +    "reps",
      +    "duration",
      +    "distance"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / updates / properties / exercises / items / properties / new_exercise
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "ONLY for a lift that does not exist yet (search_exercises first; a name that already exists is rejected with its candidates). Send this INSTEAD of exercise_id. The exercise is created for the user, who can edit or delete it in the app. Simple form only: name (2-80 chars), load_kind (\"external\" weighted, \"bodyweight\", \"none\"), measures (reps, duration, distance), groups (1-3 of chest, back, shoulders, quads, hamstrings, glutes, biceps, triceps, calves, abs; cardio may omit), optional equipment, activity (\"strength\" default or \"cardio\"), and for bodyweight bodyweight_fraction 0.95 (most of bodyweight moves), 0.64 (partly) or null (unknown).",
      +  "properties": {
      +    "activity": {
      +      "enum": [
      +        "strength",
      +        "cardio"
      +      ],
      +      "type": "string"
      +    },
      +    "bodyweight_fraction": {
      +      "anyOf": [
      +        {
      +          "const": 0.95,
      +          "type": "number"
      +        },
      +        {
      +          "const": 0.64,
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "equipment": {
      +      "items": {
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "maxItems": 3,
      +      "type": "array"
      +    },
      +    "groups": {
      +      "items": {
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "maxItems": 3,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "load_kind": {
      +      "enum": [
      +        "external",
      +        "bodyweight",
      +        "none"
      +      ],
      +      "type": "string"
      +    },
      +    "measures": {
      +      "items": {
      +        "enum": [
      +          "reps",
      +          "duration",
      +          "distance"
      +        ],
      +        "type": "string"
      +      },
      +      "maxItems": 3,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "name": {
      +      "maxLength": 400,
      +      "type": "string"
      +    },
      +    "unilateral": {
      +      "const": false,
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "load_kind",
      +    "measures"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / updates / properties / exercises / items / properties / position / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / updates / properties / exercises / items / properties / position / minimum
      Added value: +0
    • changedInput schema / properties / updates / properties / exercises / items / properties / position / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / assist_band
      Added value: +{
      +  "description": "True when the assistance is a band rather than a machine.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / assist_kg
      Added value: +{
      +  "description": "Kilograms of assistance on an assisted bodyweight lift (> 0, max 1500). Never a negative weight: \"assist 25 kg\" is assist_kg 25. Do not combine with a weight above 0.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 1500,
      +  "type": "number"
      +}
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / distance_m
      Added value: +{
      +  "description": "Target distance in metres (0.1-100000) for a distance set.",
      +  "maximum": 100000,
      +  "minimum": 0.1,
      +  "type": "number"
      +}
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / duration_s
      Added value: +{
      +  "description": "Target time in seconds (1-7200) for a timed set.",
      +  "maximum": 7200,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / reps / description
      Previous value: -"Target reps"New value: +"Target reps (0-100). Omit on a timed or distance set."
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / reps / maximum
      Added value: +100
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / reps / minimum
      Added value: +0
    • changedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / reps / type
      Previous value: -"number"New value: +"integer"
    • changedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / rir / description
      Previous value: -"Reps in reserve (0-5)"New value: +"Reps in reserve (0-5). Omit on a timed or distance set."
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / rir / maximum
      Added value: +5
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / rir / minimum
      Added value: +0
    • changedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / rir / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / rpe
      Added value: +{
      +  "description": "Target effort 1-10 in steps of 0.5 (the effort scale for a timed or distance set).",
      +  "maximum": 10,
      +  "minimum": 1,
      +  "type": "number"
      +}
    • addedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / weight / anyOf
      Added value: +[
      +  {
      +    "maximum": 1500,
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / updates / properties / exercises / items / properties / sets / items / properties / weight / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • removedInput schema / properties / updates / properties / exercises / items / properties / sets / items / required
      Removed value: -[
      -  "reps",
      -  "weight",
      -  "rir"
      -]
    • changedInput schema / properties / updates / properties / exercises / items / required
      Previous value: -[
      -  "exercise_id",
      -  "position",
      -  "sets"
      -]New value: +[
      +  "position",
      +  "sets"
      +]
  2. Changed1 schema field changed
    • addedInput schema / properties / updates / properties / exercises / items / properties / progression_step_kg
      Added value: +{
      +  "anyOf": [
      +    {
      +      "exclusiveMinimum": 0,
      +      "maximum": 50,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Optional load step for THIS lift, in kg (>0, max 50): the machine stack or plate jump the athlete actually has (5 for a 5 kg stack, 4.5359237 for 10 lb). The auto-progression uses it as the lift's load grid and its largest single raise. Set it only when the athlete told you their step. Omit to keep the stored step; pass null to clear it. A swapped exercise does not inherit it."
      +}
  3. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing non-obvious mutation semantics: the exercises array fully REPLACES the existing list, coach_note is cleared for any exercise that omits it, and an element sent without an id is treated as NEW and gets a fresh id. These are exactly the data-loss and identity pitfalls an agent needs warned about before mutating a nested structure.

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?

Purpose is front-loaded in the first clause and every subsequent sentence carries real information, but the second clause is a heavily nested parenthetical chain that is harder to scan than it needs to be. Dense rather than wasteful.

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

Completeness4/5

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

For a tool with a deeply nested 2-parameter schema, no output schema and 100% schema coverage, the description covers the hardest parts: whole-list replacement, id identity, coach_note clearing, and the get_template prerequisite. It omits error behavior and whether partial field updates are permitted, which would complete the picture.

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

Parameters4/5

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

With 100% schema description coverage the baseline is 3, but the description adds meaning the schema does not state, notably that the exercises array replaces rather than merges, that id round-tripping from get_template preserves identity, and the assist_kg-vs-negative-weight convention. This is genuine additive semantics over the structured fields.

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 (update) and resource (template) and enumerates the mutable fields: name, description, exercise list. The resource noun cleanly separates it from update_routine, update_workout, create_template and delete_template, so an agent can route without opening the schema.

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

Usage Guidelines4/5

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

Gives an explicit prerequisite workflow ('Use get_template first to see the current state') and clarifies when the full exercises array must be passed. It does not, however, explicitly exclude misuse (e.g. create_template for new templates) or contrast with the other update_* siblings.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.