Skip to main content
Glama

Povver — Strength Training

Save Plan

save_plan
DestructiveIdempotent

Create or change routines and templates; returns the saved object. action: create_routine (name, template_ids, frequency, client_ref, start_index) · update_routine (routine_id + fields; template_ids replaces the list) · set_active (routine_id, start_index) · create_template (name, exercises, description, supersets, client_ref) · update_template (template_id + fields; exercises REPLACES the list: echo every element id, superset_id and coach_note from read_plans, and send its version as expected_version). Weights in kg, snapped to the user's load grid. Rules: povver://guide/tools.

Input Schema

NameRequiredDescriptionDefault
nameNo
avoidNoIds the user wants to avoid.
actionYes
exercisesNo
frequencyNoDays per week.
requestedNoIds the user picked.
supersetsNoRest per superset_id; auto_run only if all members are timed. Omit keeps; null clears.
client_refNocreate_*: your key; a resend returns the first result and writes nothing.
routine_idNo
descriptionNoSession note; per-lift reasoning goes in coach_note.
start_indexNotemplate_ids slot (0-based) done next.
template_idNo
template_idsNoIn routine order; the full list.
expected_versionNoupdate_template exercises: the version you read; a mismatch is STALE_STATE.
pairing_requested_by_userNoThe user asked for this pairing.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • changedInput schema / properties / client_ref / description
      Previous value: -"create_*: your key; resending it returns the first result and writes nothing, even if other fields differ."New value: +"create_*: your key; a resend returns the first result and writes nothing."
    • changedInput schema / properties / description / description
      Previous value: -"Session-level note; per-exercise reasoning goes in coach_note."New value: +"Session note; per-lift reasoning goes in coach_note."
    • addedInput schema / properties / exercises / items / properties / main_lift
      Added value: +{
      +  "type": "boolean"
      +}
    • changedInput schema / properties / exercises / items / properties / superset_id / description
      Previous value: -"Shared by a superset (2) or circuit (3-8). Omit keeps it; null takes it out."New value: +"Superset (2) or circuit (3-8) id; null takes it out."
    • changedInput schema / properties / expected_version / description
      Previous value: -"update_template with exercises: the version you read (a mismatch refuses with STALE_STATE)."New value: +"update_template exercises: the version you read; a mismatch is STALE_STATE."
    • addedInput schema / properties / start_index
      Added value: +{
      +  "description": "template_ids slot (0-based) done next.",
      +  "maximum": 49,
      +  "minimum": 0,
      +  "type": "integer"
      +}
  2. Changed32 schema fields changed
    • changedInput schema / properties / avoid / description
      Previous value: -"Exercise ids the user asked to avoid."New value: +"Ids the user wants to avoid."
    • changedInput schema / properties / client_ref / description
      Previous value: -"create_routine / create_template: your own key for this create. Resending the same client_ref returns the first result and writes nothing new, even if the other fields differ."New value: +"create_*: your key; resending it returns the first result and writes nothing, even if other fields differ."
    • changedInput schema / properties / exercises / items / properties / coach_note / description
      Previous value: -"Why this lift is here or how to do it (max 500), shown beside it in the app. update_template clears a note you omit: echo the stored one."New value: +"Why this lift is here or a cue, shown in the app. update_template clears a note you omit: echo it."
    • changedInput schema / properties / exercises / items / properties / id / description
      Previous value: -"Element id from read_plans (max 100). Echo it so the element keeps its identity; omit or null only for a new one."New value: +"From read_plans: echo it (sets too) to keep the element; omit for a new one."
    • changedInput schema / properties / exercises / items / properties / measure / description
      Previous value: -"reps (default), duration (give duration_s, no reps or rir) or distance (give distance_m). Omit to keep it. Units are always kg, metres, seconds."New value: +"reps (default), duration (duration_s) or distance (distance_m). Omit keeps it."
    • removedInput schema / properties / exercises / items / properties / name / description
      Removed value: -"Exercise name"
    • changedInput schema / properties / exercises / items / properties / new_exercise / description
      Previous value: -"Only for a lift not in the catalog (search first); send it instead of exercise_id. Simple form, see povver://guide/tools."New value: +"A lift not in the catalog (search first), instead of exercise_id. See povver://guide/tools."
    • changedInput schema / properties / exercises / items / properties / position / description
      Previous value: -"Order (0-based)"New value: +"Order (0-based integer)."
    • changedInput schema / properties / exercises / items / properties / progression_step_kg / description
      Previous value: -"The load step the athlete has for this lift in kg (>0, max 50; 4.5359237 is 10 lb). Only when they told you. Omit keeps it; null clears it."New value: +"The athlete's load step for this lift in kg (10 lb = 4.5359237). Only when they told you. Omit keeps it; null clears."
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / assist_band / description
      Removed value: -"Assistance is a band."
    • changedInput schema / properties / exercises / items / properties / sets / items / properties / assist_kg / description
      Previous value: -"Assistance in kg on an assisted lift (>0, max 1500), never a negative weight; not with a weight above 0."New value: +"Assistance; never a negative weight_kg."
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / distance_m / description
      Removed value: -"Metres, distance set."
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / duration_s / description
      Removed value: -"Seconds, timed set."
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / id / description
      Removed value: -"Element id from read_plans (max 100). Echo it so the element keeps its identity; omit or null only for a new one."
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / reps / description
      Removed value: -"Omit on a timed or distance set."
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / rir / description
      Removed value: -"Omit on a timed or distance set."
    • changedInput schema / properties / exercises / items / properties / sets / items / properties / rpe / description
      Previous value: -"Effort 1-10, steps of 0.5 (timed or distance sets)."New value: +"Steps of 0.5."
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / type / default
      Removed value: -"Working Set"
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / type / description
      Removed value: -"\"Working Set\" or \"warmup\"."
    • addedInput schema / properties / exercises / items / properties / sets / items / properties / type / enum
      Added value: +[
      +  "working",
      +  "warmup",
      +  "dropset"
      +]
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / type / maxLength
      Removed value: -40
    • removedInput schema / properties / exercises / items / properties / sets / items / properties / weight
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "maximum": 1500,
      -      "minimum": 0,
      -      "type": "number"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "kg, null for bodyweight"
      -}
    • addedInput schema / properties / exercises / items / properties / sets / items / properties / weight_kg
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 1500,
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "null or 0 = bodyweight."
      +}
    • changedInput schema / properties / exercises / items / properties / superset_id / description
      Previous value: -"Group id: exercises sharing it are a superset (2) or circuit (3+), placed next to each other, max 8. Omit keeps the stored group; null takes it out."New value: +"Shared by a superset (2) or circuit (3-8). Omit keeps it; null takes it out."
    • changedInput schema / properties / expected_version / description
      Previous value: -"update_template with exercises: the template version you read; a mismatch refuses with STALE_STATE and the current template."New value: +"update_template with exercises: the version you read (a mismatch refuses with STALE_STATE)."
    • removedInput schema / properties / name / description
      Removed value: -"Name."
    • changedInput schema / properties / pairing_requested_by_user / description
      Previous value: -"True when the user asked for this superset pairing."New value: +"The user asked for this pairing."
    • changedInput schema / properties / requested / description
      Previous value: -"Exercise ids the user explicitly asked for (a manual pick)."New value: +"Ids the user picked."
    • removedInput schema / properties / routine_id / description
      Removed value: -"The routine."
    • changedInput schema / properties / supersets / description
      Previous value: -"Group settings: {id, rest_between_s 5-300 or null, rest_after_round_s 15-900 or null, auto_run (only when every member is timed)}. Omit keeps them; null clears."New value: +"Rest per superset_id; auto_run only if all members are timed. Omit keeps; null clears."
    • removedInput schema / properties / template_id / description
      Removed value: -"The template."
    • changedInput schema / properties / template_ids / description
      Previous value: -"Template ids in routine order (the full list)."New value: +"In routine order; the full list."
  3. Changed1 schema field changed
    • addedInput schema / properties / client_ref
      Added value: +{
      +  "description": "create_routine / create_template: your own key for this create. Resending the same client_ref returns the first result and writes nothing new, even if the other fields differ.",
      +  "maxLength": 200,
      +  "minLength": 1,
      +  "type": "string"
      +}
  4. Added

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), the description spells out exactly what is destroyed or preserved: template_ids replaces the list, exercises REPLACES the list, and coach_note is cleared when omitted. It also discloses STALE_STATE on expected_version mismatch, idempotent resend behavior for client_ref, and that weights are snapped to the user's load grid.

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 core purpose before any detail, and the action list is compressed into a single dense clause per action. The length is justified by the 15-parameter mutation surface, though the run-on action list is harder to scan than separate lines would be.

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 destructive multi-action mutation tool with no output schema, the description covers the essential behavioral contract (what replaces what, version echoes, idempotency) and notes the return is the saved object. It omits permission/auth requirements and recovery steps after STALE_STATE, which would round it out.

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 67% schema coverage, the schema already documents many fields, but the description adds cross-parameter meaning the schema cannot: which fields belong to each action, ordering semantics for template_ids, the slot meaning of start_index, and the version echo requirement. Secondary params like avoid, requested, and pairing_requested_by_user remain only schema-documented.

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?

The description opens with a specific verb pair and resource ('Create or change routines and templates') and then enumerates all five actions with their field signatures. An agent can distinguish this mutation tool from read_plans without opening the schema, since the read path is only named as an input dependency.

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?

The per-action breakdown effectively routes the agent to the right operation, and it names read_plans as the required source for echoing element ids. It stops short of explicit when-not guidance (e.g. preferring read_plans for inspection, or confirming with the user before destructive replacement), so it is clear context without exclusions.

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.