Skip to main content
Glama

Povver — Strength Training

Create Template

create_template

Create a new workout template with exercises and set prescriptions. Each exercise needs an exercise_id (from search_exercises), position (0-based order), and sets with type, reps, weight (kg, null for bodyweight, never negative), and RIR. A timed or distance exercise (plank, loaded carry) takes duration_s or distance_m per set instead of reps and rir, optionally with rpe, and the exercise may carry measure. Assistance is assist_kg (a positive number), never a negative weight. Units are always kg, metres and seconds. Weights are snapped to a load the user can make in their own unit (for a pounds user, 5 lb steps or the step their own history shows; for a kg user, the load is kept as sent unless their history shows a step), so pass your best kg conversion and read the stored value back from the result. Each exercise also takes an optional coach_note — the per-exercise reasoning or cue, which belongs there rather than crammed into the template description. Omit exercise and set ids on create; the server mints them. After creating, add the template to a routine with create_routine or update_routine.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYesTemplate name
exercisesYesExercises with set prescriptions
descriptionNoTemplate-level note: what this session is for overall. Per-EXERCISE reasoning belongs in each exercise's coach_note.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed23 schema fields changed
    • changedInput schema / properties / exercises / items / properties / exercise_id / description
      Previous value: -"Exercise ID from search_exercises"New value: +"Exercise ID from search_exercises. Omit only when sending new_exercise."
    • addedInput schema / 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 / 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 / exercises / items / properties / position / maximum
      Added value: +9007199254740991
    • addedInput schema / properties / exercises / items / properties / position / minimum
      Added value: +0
    • changedInput schema / properties / exercises / items / properties / position / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / 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 / 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 / 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 / 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 / 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 / exercises / items / properties / sets / items / properties / reps / maximum
      Added value: +100
    • addedInput schema / properties / exercises / items / properties / sets / items / properties / reps / minimum
      Added value: +0
    • changedInput schema / properties / exercises / items / properties / sets / items / properties / reps / type
      Previous value: -"number"New value: +"integer"
    • changedInput schema / 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 / exercises / items / properties / sets / items / properties / rir / maximum
      Added value: +5
    • addedInput schema / properties / exercises / items / properties / sets / items / properties / rir / minimum
      Added value: +0
    • changedInput schema / properties / exercises / items / properties / sets / items / properties / rir / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / 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 / exercises / items / properties / sets / items / properties / weight / anyOf
      Added value: +[
      +  {
      +    "maximum": 1500,
      +    "minimum": 0,
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / weight / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • removedInput schema / properties / exercises / items / properties / sets / items / required
      Removed value: -[
      -  "reps",
      -  "weight",
      -  "rir"
      -]
    • changedInput schema / properties / exercises / items / required
      Previous value: -[
      -  "exercise_id",
      -  "position",
      -  "sets"
      -]New value: +[
      +  "position",
      +  "sets"
      +]
  2. Changed1 schema field changed
    • addedInput schema / 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?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description supplies behavior annotations cannot: kg weights are snapped to a load the user can actually make in their own unit, so the caller should pass its best conversion and read the stored value back; the server mints element ids; and a newly created lift is user-owned and editable/deletable in the app.

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 the create action, then structured by concern (ids, units, timed/distance sets, assistance, rounding, coach_note, next step). It is long, but the density is high and most sentences carry distinct guidance rather than restating the schema.

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?

No output schema exists, and the description compensates by telling the agent to read the stored (snapped) values back from the result. Combined with the nested schema's own id/measure documentation, an agent has enough to call this correctly; only the exact response shape is left implicit.

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?

Schema coverage is 100%, so baseline is 3. The description still adds real meaning: units are always kg/metres/seconds, weight is null for bodyweight and never negative, assistance is a positive assist_kg, and per-exercise reasoning belongs in coach_note rather than the template description — semantics not obvious from property names alone.

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?

Opens with a specific verb+resource: 'Create a new workout template with exercises and set prescriptions.' This clearly separates it from update_template, get_template, and delete_template in the sibling list without needing 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?

Routes the agent well: exercise_id must come from search_exercises, ids are omitted on create because the server mints them, and after creating the template you add it to a routine via create_routine or update_routine. It stops short of an explicit 'use this instead of update_template when X' exclusion, but the surrounding context is clear.

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.