Skip to main content
Glama

Add or update an exercise

upsert_exercise
DestructiveIdempotent

Create or update an exercise in the user's catalog (keyed by its id/name). An exercise from search_exercise_pool saved with its slug as the id plus pool_slug keeps one identity and one history, and inherits the pool's muscles, equipment and technique cues. A hand-written exercise shows in the muscle map and the app only when instructions (2-3 short technique cues, in the user's language), primary_muscles, category and equipment are set. Fields omitted are left as they are, so a partial update is safe.

Input Schema

NameRequiredDescriptionDefault
exerciseYes

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / exercise / properties / movement_pattern / description
      Previous value: -"The pattern the movement belongs to (squat, hinge, horizontal_push, …). Variations of one lift share a pattern: the load model judges from it whether a muscle is already accustomed to that pattern, and injury checks match on it."New value: +"The pattern the movement belongs to (squat, hinge, horizontal_push, …). Variations of one lift share a pattern: the load model judges from it whether a muscle is already accustomed to that pattern, and the check against movements the user must avoid matches on it."
  2. Changed8 schema fields changed
    • changedInput schema / properties / exercise / properties / category / description
      Previous value: -"What kind of work this is. `cardio` and `mobility` deposit no muscle load at all, so never use them for resistance work — a stretch or a run tagged `compound` lights up the muscle map for days."New value: +"What kind of work this is. `cardio` and `mobility` deposit no muscle load, so they do not describe resistance work; a stretch or a run tagged `compound` shows on the muscle map for days."
    • changedInput schema / properties / exercise / properties / dose_unit / description
      Previous value: -"What this exercise is dosed in: 'reps' (the usual case), 'seconds' for holds and carries (plank, dead hang, farmer's walk), or 'minutes' for cardio. It says what the rep range and every logged set's number mean — a 60-second plank is not 60 reps."New value: +"What this exercise is dosed in: 'reps' (the usual case), 'seconds' for holds and carries (plank, dead hang, farmer's walk), or 'minutes' for cardio. It is the unit of the planned target; a logged set keeps reps in `reps` and time in `duration_sec` whatever it is, so a 60-second plank is never 60 reps."
    • changedInput schema / properties / exercise / properties / long_length / description
      Previous value: -"True when the target muscle is loaded in a stretched position (RDL, incline curl, Nordic curl); false when the stretched half is removed (rack pull, hip thrust, cable kickback). Its residual load persists longer in the muscle load model. Leave null only when you genuinely cannot tell from the movement."New value: +"True when the target muscle is loaded in a stretched position (RDL, incline curl, Nordic curl); false when the stretched half is removed (rack pull, hip thrust, cable kickback). Its residual load persists longer in the muscle load model. Null means unclassified, and the model then infers it from the movement pattern."
    • changedInput schema / properties / exercise / properties / movement_pattern / description
      Previous value: -"The pattern the movement belongs to (squat, hinge, horizontal_push, …). Keep it the same across variations of one lift: it is how the model judges whether a muscle is already accustomed to that pattern."New value: +"The pattern the movement belongs to (squat, hinge, horizontal_push, …). Variations of one lift share a pattern: the load model judges from it whether a muscle is already accustomed to that pattern, and injury checks match on it."
    • changedInput schema / properties / exercise / properties / pool_slug / description
      Previous value: -"The `slug` of the matching entry from search_exercise_pool, when this exercise comes from the curated pool. Set it whenever a pool entry matches — it keeps one movement under one identity even if the display name is later edited or translated."New value: +"The `slug` of the matching entry from search_exercise_pool, for an exercise that matches a curated pool entry. It keeps one movement under one identity even if the display name is later edited or translated."
    • changedInput schema / properties / exercise / properties / primary_muscles / description
      Previous value: -"The muscles the exercise is done FOR — the prime movers. These alone are counted against the weekly MEV/MAV set landmarks, so list the target, not everything the movement involves."New value: +"The muscles the exercise is done FOR, the prime movers; assisting and stabilising muscles are the secondary and tertiary lists. Only these count against the weekly MEV/MAV set landmarks."
    • changedInput schema / properties / exercise / properties / secondary_muscles / description
      Previous value: -"Muscles that assist meaningfully but are not the target (triceps on a bench press). They count in the muscle load model at a reduced weight. Never repeat a primary muscle here."New value: +"Muscles that assist meaningfully but are not the target (triceps on a bench press). They count in the muscle load model at a reduced weight. The list excludes the primary muscles."
    • changedInput schema / properties / exercise / properties / tertiary_muscles / description
      Previous value: -"Stabilisers and minor assistance (abs on a standing press). They count at a further reduced weight. Never repeat a muscle already listed as primary or secondary; leave empty when unsure."New value: +"Stabilisers and minor assistance (abs on a standing press). They count at a further reduced weight. The list excludes primary and secondary muscles; empty means unspecified."
  3. First observed

TDQS

A4.3/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing that omitted fields are preserved (safe partial update), that pool-linked entries inherit muscles/equipment/technique cues, and that hand-written exercises are invisible in the muscle map until required fields are set. It does not spell out whether passing explicit null clears a field versus omitting it — a meaningful gap for a tool flagged destructiveHint=true.

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/update action and the identity key, then the pool path, then the hand-written requirements, then the partial-update guarantee. Dense but every sentence carries a rule; slightly heavy paragraph form rather than a short list.

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 deep nested object with an output schema present, the description covers the identity model, inheritance behavior, visibility prerequisites and update semantics — the parts that are not obvious from field names. Coverage of null-vs-omit semantics is the main omission.

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?

Top-level schema coverage registers as 0%, but the description supplies real semantics for the ambiguous parts: id-vs-name keying, the pool_slug linking rule, what instructions should contain (2-3 short technique cues, user's language), and which fields are required for display. The many remaining fields (dose_unit, long_length, movement_pattern) are documented inside the schema itself.

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 pair and resource: 'Create or update an exercise in the user's catalog (keyed by its id/name)'. It also clarifies the upsert key, which distinguishes it from list_exercises and search_exercise_pool, and names search_exercise_pool as the source of pool-backed entries.

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 concrete guidance on the two paths: an exercise saved with the pool `slug` as `id` plus `pool_slug` inherits pool data and keeps one identity, whereas a hand-written exercise needs instructions, primary_muscles, category and equipment to surface anywhere. It does not explicitly say when to prefer this over search_exercise_pool or show_exercise, but the workflow is clear enough to act on.

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.