Skip to main content
Glama

Set text motion

set_text_motion
Idempotent

PROJECT-SCOPED: this call acts only on the explicit project_id and returns the project identity with its result. Set or replace coherent x/y/scale/rotation/opacity keyframes on an EXISTING ordinary text item. Curves use LOCAL seconds from that text's start, so moving the text window keeps its choreography. This replaces named entrance/exit animation with one authored motion system. Pass motion={} (or omit it) to clear the explicit curve and leave the text static. Subject-matted text cannot move.

Input Schema

NameRequiredDescriptionDefault
idYes
motionNoElement-local motion curves. t is seconds from this text's own start; x/y are frame fractions, scale is relative, rotation is degrees, opacity is 0..1.
project_idYesRequired immutable scope for this call. Copy the id from list_projects/open_project/project_state; the active-project pointer is never used to guess.
motion_motifNoActive Blueprint motion motif id this event executes; never 'hold'.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / motion / properties / opacity / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "items": {
      -      "properties": {
      -        "ease": {
      -          "enum": [
      -            "linear",
      -            "in",
      -            "out",
      -            "in_out",
      -            "hold"
      -          ],
      -          "type": "string"
      -        },
      -        "t": {
      -          "type": "number"
      -        },
      -        "v": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "t",
      -        "v"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "items": {
      +      "properties": {
      +        "ease": {
      +          "enum": [
      +            "linear",
      +            "in",
      +            "out",
      +            "in_out",
      +            "hold"
      +          ],
      +          "type": "string"
      +        },
      +        "t": {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "v": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "t",
      +        "v"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 24,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / motion / properties / rotation / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "items": {
      -      "properties": {
      -        "ease": {
      -          "enum": [
      -            "linear",
      -            "in",
      -            "out",
      -            "in_out",
      -            "hold"
      -          ],
      -          "type": "string"
      -        },
      -        "t": {
      -          "type": "number"
      -        },
      -        "v": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "t",
      -        "v"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "items": {
      +      "properties": {
      +        "ease": {
      +          "enum": [
      +            "linear",
      +            "in",
      +            "out",
      +            "in_out",
      +            "hold"
      +          ],
      +          "type": "string"
      +        },
      +        "t": {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "v": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "t",
      +        "v"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 24,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / motion / properties / scale / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "items": {
      -      "properties": {
      -        "ease": {
      -          "enum": [
      -            "linear",
      -            "in",
      -            "out",
      -            "in_out",
      -            "hold"
      -          ],
      -          "type": "string"
      -        },
      -        "t": {
      -          "type": "number"
      -        },
      -        "v": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "t",
      -        "v"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "items": {
      +      "properties": {
      +        "ease": {
      +          "enum": [
      +            "linear",
      +            "in",
      +            "out",
      +            "in_out",
      +            "hold"
      +          ],
      +          "type": "string"
      +        },
      +        "t": {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "v": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "t",
      +        "v"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 24,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / motion / properties / x / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "items": {
      -      "properties": {
      -        "ease": {
      -          "enum": [
      -            "linear",
      -            "in",
      -            "out",
      -            "in_out",
      -            "hold"
      -          ],
      -          "type": "string"
      -        },
      -        "t": {
      -          "type": "number"
      -        },
      -        "v": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "t",
      -        "v"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "items": {
      +      "properties": {
      +        "ease": {
      +          "enum": [
      +            "linear",
      +            "in",
      +            "out",
      +            "in_out",
      +            "hold"
      +          ],
      +          "type": "string"
      +        },
      +        "t": {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "v": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "t",
      +        "v"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 24,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / motion / properties / y / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "items": {
      -      "properties": {
      -        "ease": {
      -          "enum": [
      -            "linear",
      -            "in",
      -            "out",
      -            "in_out",
      -            "hold"
      -          ],
      -          "type": "string"
      -        },
      -        "t": {
      -          "type": "number"
      -        },
      -        "v": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "t",
      -        "v"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "items": {
      +      "properties": {
      +        "ease": {
      +          "enum": [
      +            "linear",
      +            "in",
      +            "out",
      +            "in_out",
      +            "hold"
      +          ],
      +          "type": "string"
      +        },
      +        "t": {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        "v": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "t",
      +        "v"
      +      ],
      +      "type": "object"
      +    },
      +    "maxItems": 24,
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description adds rich behavioral context: project-scoped action, returns project identity with the result, curves are in local seconds relative to the text's own start, empty/omitted motion clears the authored curve, and subject-matted text cannot be moved. This goes well past what readOnlyHint/idempotentHint/destructiveHint convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but has no filler: it front-loads project scoping, then states the mutation, timing semantics, replacement behavior, clearing behavior, and the subject-matted restriction in a logical sequence.

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 mutation tool, it covers scope, supported/unsupported text types, local timing, clearing semantics, and partial return behavior. It stops short of fully describing the id/motion_motif parameters and the output shape, so a few gaps remain despite the substantial context provided.

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?

The description explains the complex motion object well: x/y/scale/rotation/opacity keyframes, local t seconds, and clearing via motion={} or omission. However, it does not describe the id parameter or the motion_motif parameter itself, leaving some parameters primarily to the schema; coverage is good but not complete.

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 states a specific action ('Set or replace coherent x/y/scale/rotation/opacity keyframes') on a specific resource ('EXISTING ordinary text item'), and its project-scoped line clarifies scope. It also distinguishes adjacent cases by noting that subject-matted text cannot move and that it replaces named entrance/exit animation.

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?

It gives clear usage context: use it on existing ordinary text, pass motion={} or omit motion to clear the curve, and subject-matted text is unsupported. It also says it replaces named entrance/exit animation, but it does not name specific sibling tools for those alternatives, so it stops short of explicit tool routing.

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.