Morpha
Server Details
AI editor to build, animate & export layered short-form video projects via one tool catalog.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Available Tools
95 toolsadd_audio_overlayAInspect
Add an audio overlay (mp3/m4a/wav/ogg) scheduled at a frame-aligned start. The asset must already exist at users//assets//. 30 fps; convert seconds with frames = round(s * 30). Plays in the editor preview and is mixed into the MP4 export.
| Name | Required | Description | Default |
|---|---|---|---|
| gain | No | Linear gain 0..2. Default 1. | |
| endFrame | No | Optional end frame; omit to play the asset's full natural length from startFrame. | |
| filename | Yes | Audio asset filename in the project's assets bucket. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| startFrame | Yes | Frame at which the overlay starts (0-indexed, 30 fps). | |
| fadeInFrames | No | Linear fade-in length in frames. Default 0. | |
| fadeOutFrames | No | Linear fade-out length in frames. Default 0. | |
| sourceLayerId | No | Optional video layer element id ("video.<id>") to weld this overlay to. When set, the editor renders the overlay as a waveform footer on that clip and drags it with the clip instead of showing a standalone bottom row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of explaining side effects and constraints. It discloses that the asset must already exist, that the overlay is frame-aligned at 30 fps, and that it plays in the preview and is mixed into the MP4 export. It does not mention failure behavior if the asset is missing, but the key behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single statement of purpose followed by essential prerequisite and behavior details. Every sentence contributes useful information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema covers all parameters and there is no output schema, the description provides sufficient context for an agent to decide when to use the tool, what inputs are needed, and what the observable outcome will be. It could mention return values or error handling, but the core context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage of parameters with detailed descriptions, so the added semantic value from the tool description is limited. The description reinforces the overall frame-rate context but does not add meaning beyond the existing parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose with a specific verb ('Add') and object ('audio overlay'), and the name aligns perfectly. It also distinguishes this tool from siblings like update_audio_overlay and remove_audio_overlay by describing the creation action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage guidance: supported audio formats, the required asset path, and the frame-to-seconds conversion rule. It does not explicitly compare with update_audio_overlay or upload_audio, but the naming and action imply when this should be used for new overlays.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_caption_trackAInspect
Build a caption track from pre-timed lines (e.g. derived from transcribe_clip's word timings). mode "line-sync" (default) creates one text layer per line, each shown only during its [startFrame, endFrame) window via hold-eased opacity keyframes — the active-line karaoke read; mode "static" makes a single layer with all lines joined. style picks a preset look. Lines default to a lower-third band. The caption layers are always wrapped in a "captions" group so they don't clutter the layers list. Returns the created text element ids plus groupElementId (the captions group).
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Caption band centre x. Default canvas centre. | |
| y | No | Caption band centre y. Default lower third (~80% of height). | |
| mode | No | "line-sync" (default): one timed layer per line. "static": one layer with all lines. | |
| lines | Yes | Caption lines in order. Each: { text, startFrame, endFrame } — frames are 0-indexed at 30fps. | |
| style | No | Caption look preset. Default "classic". | |
| width | No | Band width. Default ~86% of canvas width. | |
| height | No | Band height. Default ~16% of canvas height. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| clip_element_id | No | Optional "video.<id>" to WELD the caption lines to (line-sync mode). When set, each line's startFrame/endFrame are treated as its window in the clip's OWN source timeline and the on-timeline position is derived live from the clip's trim — so trimming or sliding the clip retimes/clips the captions, exactly like the clip's welded audio. Omit for fixed project-frame captions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full burden and does so richly: it discloses the two modes, how line-sync visibility windows work via hold-eased opacity keyframes, that layers are always wrapped in a 'captions' group, and what the call returns. This is exemplary transparency for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, mode behavior, style, default placement, grouping behavior, and return value. It front-loads the most important information and avoids filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description supplies the essential behavioral and return context: created text element ids plus groupElementId, the grouping guarantee, and the two modes. The comprehensive input schema covers parameters, so nothing critical for calling this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining how mode line-sync behaves ('active-line karaoke read'), what the group wrapping means for the layer list, and that the return includes groupElementId. This adds real semantic value on top of the complete schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb plus resource: 'Build a caption track from pre-timed lines.' It distinguishes this from related siblings like transcribe_clip (which produces timings) and merge_caption_lines/split_caption_line (which manipulate existing caption lines), while the mode detail further clarifies exactly what is built.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly signals when to use this tool: after obtaining pre-timed lines, e.g. from transcribe_clip's word timings. It gives clear context but does not explicitly contrast it with merge_caption_lines or split_caption_line, so it lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_color_keyframeAInspect
Add or overwrite a colour keyframe on a fill track. Targets a leaf (shapes., image., video., group.). The canvas backdrop is the pinned is_background image_layer (the literal 'background.canvas' is accepted as a synonym for its element id). The value is a Fill — adjacent keyframes crossfade stop-by-stop. 30 fps; frame is 0-indexed.
| Name | Required | Description | Default |
|---|---|---|---|
| frame | Yes | Frame number, 0-indexed. 30 fps so frame 30 = 1 second. | |
| value | Yes | Either '#rrggbb' (promoted to solid) or a Fill object: {type:"solid",color} / {type:"linear",stops:[{pos:0..1,color}],angle?} / {type:"radial",stops:[{pos:0..1,color}],cx?,cy?,radius?}. Adjacent keyframes crossfade the gradient stop-by-stop. | |
| easing | No | Interpolation to the next keyframe. Default linear. | |
| property | Yes | Currently only 'fill' is supported. | |
| elementId | Yes | Element id (shapes/image/video/group prefixed). The pinned is_background image_layer is the canvas backdrop; 'background.canvas' is also accepted as a synonym. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It usefully discloses overwrite behavior, stop-by-stop crossfade between adjacent keyframes, 30 fps timing, and 0-indexed frames. It could add auth requirements or return behavior, but the key mutation semantics are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences front-load the action and then pack only high-value details: target types, background synonym, Fill value semantics, and timing. There is no filler or redundant explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description plus fully-documented schema covers everything needed to call it correctly: which elements, how frames are counted, what value shapes are accepted, and overwrite/crossfade behavior. No critical gap is evident.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds general context such as overwrite behavior and crossfade, but most of this is already present in the schema's parameter descriptions. It does not meaningfully clarify any parameter beyond what the schema documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Add or overwrite a colour keyframe on a fill track', specifying the exact action, resource, and overwrite semantics. It also defines the target scope (leaf elements, background.canvas synonym), which distinguishes it from generic add_keyframe or add_speed_keyframe siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies use for color keyframing on a fill track and clarifies frame indexing, but it never names alternatives such as add_keyframe, add_keyframes, or set_layer_fill, nor states when not to use this tool. Usage context is inferable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_curveAInspect
Draw an editable arrow / curved line — a stroked quadratic bezier with an arrowhead. Specify the two endpoints (x1,y1)→(x2,y2) in canvas pixels; bend pushes the midpoint perpendicular (px, 0 = straight line, positive/negative curves either way). color #rrggbb, stroke_width px, arrow_head none|end|both (default end). Use this for callout arrows (e.g. swooping into a link).
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start x (canvas px). | |
| x2 | Yes | End x (canvas px) — the arrowhead end. | |
| y1 | Yes | Start y (canvas px). | |
| y2 | Yes | End y (canvas px). | |
| bend | No | Perpendicular bow of the curve in px. 0 = straight. | |
| color | No | Stroke colour as #rrggbb. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| arrow_head | No | ||
| stroke_width | No | Line thickness in px. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the transparency burden. It explicitly states that the projectId 'selects which existing project this call mutates' and describes the draw action as creating an editable element. There is no contradiction with annotations, and the mutation is clearly indicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then summarizes parameter behaviors in a compact format. It repeats some parameter details that already exist in the schema (e.g., color format, stroke_width units), which adds a little redundancy but does not bloat the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the purpose, usage context, and effect of key parameters. It does not mention the return value (e.g., a layer ID) or the precise effect on existing layers, but for a mutation tool without an output schema this is not a critical omission. Overall it gives enough context to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (89%), with descriptions for x1/y1/x2/y2, bend, color, projectId, and stroke_width. The description adds meaning by contextualizing bend as a perpendicular offset and providing default behavior for arrow_head. It does not fully describe arrow_head's enum values beyond the default, but the enum is self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Draw') and resource ('editable arrow / curved line') and clearly explains the bezier/arrowhead nature. It distinguishes itself from other add_* tools by focusing on callout arrows, and the description is unambiguous about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit use case ('Use this for callout arrows') and explains the effect of each optional parameter. However, unlike the high-scoring example, it does not explicitly name alternative tools (e.g., add_shape) or state when not to use it, so a small gap remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_embed_originAInspect
Add one hostname to the project's embed allowlist (the hostnames permitted to load the public embed). Idempotent — re-adding an existing entry is a no-op. The origin is normalized to a bare lowercased hostname (scheme/port/path stripped).
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | Hostname or URL to allow, e.g. "example.com" or "https://example.com". Normalized to a bare lowercased hostname. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does well by explicitly stating idempotency ('re-adding an existing entry is a no-op') and normalization behavior ('scheme/port/path stripped'). It omits error and return details, but the core side effects are clearly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with no filler. It front-loads the primary purpose, then adds idempotency and normalization details in a natural order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with no output schema, the description plus full parameter documentation is largely sufficient for correct invocation. It covers what the tool does, idempotency, and input normalization. Missing response/error behavior is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both origin and projectId already well documented. The description adds some normalization context for origin, but this is also present in the schema. It does not add significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Add one hostname to the project's embed allowlist.' The word 'one' plus the allowlist context clearly distinguishes this from sibling tools like set_embed_origins or remove_embed_origin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when adding a single hostname to the project's embed allowlist. It does not explicitly name alternatives or exclusions, but the idempotency note and 'one hostname' phrasing imply the intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_from_collectionAInspect
Add an item from the user's Collection into a project as a self-contained COPY. Pass the destination projectId, plus the sourceProjectId + elementId of an item from list_collection. Copies that layer (a whole group brings its children) plus its image/clip/font bytes into the destination at fresh ids and its original canvas position — fully detached, so it is immediately yours to edit and nothing links back to the source (deleting or changing the source never affects this copy). The element must actually be in the source project's collection and you must be able to read that project. An open editor on the destination picks the copy up within a few seconds — no refresh needed. Returns { addedElementId, count }.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | The item's element id (from list_collection) — any leaf or group.<id>. | |
| projectId | Yes | Destination project the item is copied INTO. | |
| sourceProjectId | Yes | The item's home project id (from list_collection). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden. It discloses copy semantics (self-contained, fresh ids, detached, source changes don't affect the copy), group-children inclusion, byte copying, live editor pickup, and return shape, all beyond what schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A dense but efficient description; every clause earns its place. It front-loads the core purpose, then covers usage, prerequisites, runtime behavior, and return value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter operation with no output schema and no annotations, the description is essentially complete. It specifies required inputs, source/destination semantics, prerequisites, behavioral effects, and the return contract, leaving little an agent needs to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters already, so baseline is 3. The description adds value by explaining the relationship between sourceProjectId and elementId ('from list_collection') and the consequence of those parameters (fresh ids, original position, full detachment). This lifts it slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Add'), resource ('item from the user's Collection into a project'), and copy semantics. The direction (from collection to project) clearly distinguishes it from sibling tools like add_to_collection and add_image_layer, so an agent can select it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it is the tool for copying an existing collection item into a project, with parameters sourced from list_collection. It states prerequisites (element must be in source collection, read access required) but does not explicitly name when to prefer an alternative like add_to_collection, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_image_layerAInspect
Add an image layer. The asset must already exist at users//assets// (uploaded via the editor's drag-drop, or POST /api/upload-asset/ with the raw bytes and an X-Filename header). To duplicate an existing layer, reuse its filename — the editor auto-assigns a fresh id.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Centre x in 1080-wide base coords. | |
| y | Yes | Centre y in 1920-tall base coords. | |
| block | No | OPTIONAL timeline window — {start, duration} in composition frames. OMIT IT (the default) and the layer is ALWAYS PRESENT: a persistent overlay that holds for the whole composition, which is what an agent-placed watermark / lower-third almost always wants. Pass it to place a bounded CLIP instead (what the editor's own add does: 5 s at the playhead). Keyframes on a blocked layer are sampled RELATIVE to `start`. | |
| width | Yes | Width in px (must be > 0). | |
| height | Yes | Height in px (must be > 0). | |
| filename | Yes | Asset filename in the project's assets bucket, e.g. star.png. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It discloses non-obvious operational behavior: the asset must already exist at a specific path, the upload mechanisms, and the fact that reusing a filename creates a new layer with a fresh id rather than overwriting. It does not mention error cases or stacking order, but the main side effects are adequately surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with the primary action front-loaded, followed by the required asset context and the duplication rule. The long second sentence is information-dense and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a mutation with nested optional semantics, but the schema fully documents the parameters and the description covers the non-obvious asset prerequisite and duplication behavior. There is no output schema, so an explicit return-value note would be a minor improvement; otherwise the agent has enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 7 parameters thoroughly (100% coverage). The description adds filename-specific meaning: the asset must be pre-uploaded to a known path, and duplicate layers are created by reusing a filename — details not inferable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States "Add an image layer" — a specific verb and resource, and the asset-type scope distinguishes it from sibling tools like add_text_layer, add_video_layer, and add_shape. The duplication note adds a secondary use case without blurring the primary purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly describes the required precondition (asset must already exist), gives specific upload routes, and explains the duplicate-layer path by reusing a filename. It does not explicitly name sibling alternatives, but the context makes it clear when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_keyframeAInspect
Add or overwrite a keyframe on a layer's animation track. For leaves (image/video/shape), x/y/rotation keyframes are ABSOLUTE canvas-space values: x and y are the layer centre's pixel position (canvas is 1080×1920), rotation is degrees. For groups, x/y keyframes are translation offsets applied around the group's frozen pivot, and rotation is the group's absolute angle. scale orbits the layer/pivot centre (1 = no change). opacity is 0..1. 30 fps. When a keyframe track is present on a property, it OVERRIDES the layer's static base value at every frame.
| Name | Required | Description | Default |
|---|---|---|---|
| frame | Yes | Frame number, 0-indexed. 30 fps so frame 30 = 1 second. | |
| value | Yes | Track value at this frame. | |
| easing | No | Interpolation to the next keyframe. Default linear. | |
| property | Yes | ||
| elementId | Yes | Layer id (video.<id>, image.<id>, shapes.<id>, or group.<id>). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: overwrite behavior, absolute vs offset coordinate semantics, canvas dimensions, group pivot behavior, scale orbit behavior, opacity range, frame rate, and the critical override of static base values. This is exceptionally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It front-loads the purpose and then structures property-specific semantics clearly. There is no fluff or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers most behavioral context needed to call it correctly. It is slightly incomplete because width, height, and curve keyframe semantics are omitted, and sibling routing guidance would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 83%, and the description adds strong meaning for the 'property' and 'value' parameters by explaining coordinate spaces, rotation units, scale behavior, and opacity range. However, it leaves width, height, and curve property semantics unexplained, so it does not fully compensate for those gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly names a specific verb and resource: 'Add or overwrite a keyframe on a layer's animation track.' It conveys the core action and scope, but it does not explicitly differentiate itself from close siblings like add_keyframes or set_keyframes_batch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as add_keyframes, set_keyframes_batch, add_color_keyframe, or add_speed_keyframe. The semantics are explained well, but the agent is left to infer the appropriate selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_keyframesAInspect
Add many keyframes to ONE element's ONE property in a single call, with an optional loop mode applied in the same call. The idiomatic form when every layer in a multi-element animation gets its own track (ripple dot pulse, snowflake fall, equaliser-bar wave). Factors elementId + property out of the loop body and folds set_track_loop in. Use set_keyframes_batch instead when you need to mix elements/properties in one atomic call.
| Name | Required | Description | Default |
|---|---|---|---|
| loop | No | Optional extrapolation mode applied to this track in the same call. Default 'hold'. | |
| property | Yes | ||
| elementId | Yes | Layer id (video.<id>, image.<id>, shapes.<id>, text.<id>, or group.<id>). | |
| keyframes | Yes | Keyframes for this track (one or more). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers real behavioral context: it reveals that loop mode is applied in the same call, that elementId/property are factored out of the loop body, and that this is a multi-keyframe batched mutation. It does not state whether the call replaces or appends to existing keyframes on the track, which is a minor gap given zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: purpose first, idiomatic context second, exclusion of the sibling alternative third. Every sentence earns its place and the critical scoping constraint is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema and no annotations, the description is nearly complete: it covers purpose, scope constraints, the fold-in loop behavior, and sibling disambiguation against a very large tool set. The only missing pieces are what the call returns and whether existing track keyframes are replaced or appended — minor given the strength of the disambiguation and operation semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80% (only 'property' lacks its own description, though its enum clarifies it), so the schema already documents most parameters. The description adds conceptual framing — that elementId/property scope the call and loop is folded into it — but provides no new format or value semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource statement: 'Add many keyframes to ONE element's ONE property in a single call' — the singular scoping (one element, one property) is exactly what distinguishes it from siblings like set_keyframes_batch. It further frames the idiomatic use case (ripple dot pulse, snowflake fall, equaliser-bar wave), leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('The idiomatic form when every layer in a multi-element animation gets its own track') and names the concrete alternative with the condition that selects it: 'Use set_keyframes_batch instead when you need to mix elements/properties in one atomic call.' It also signals that set_track_loop is folded in, preventing a redundant call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_morpha_layerAInspect
Embed another of the user's projects ("a morpha") inside this one as a version-pinned band. The source's layers are inlined into the host as a collapsible group, re-keyed to fresh ids, pinned to one immutable version of the source. Pass the source project's id as source_morpha_id (and optionally a version label); the server resolves and inlines the pinned version. Editing the band's inner layers only affects THIS video — the change is local and never propagates back to the source. To pin the band to a different saved version, re-pin it from the editor's Inspector. describe_video marks an embedded band with morpha:true + source_morpha_id so you can tell it apart from a plain group.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Optional version label of the source to pin (e.g. "v3"). Omit to pin the source's latest saved version. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| source_morpha_id | Yes | The id of the project to embed. Must not be this project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it does so thoroughly. It discloses that the source layers are inlined as a collapsible group, re-keyed to fresh ids, pinned to an immutable version, and that edits are local and never propagate back to the source. It also explains how embedded bands appear in describe_video output, giving the agent a complete picture of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and immediately explains the important constraints. It is longer than one sentence, but every sentence earns its place by covering a distinct operational aspect: what the tool does, how layers are inlined, how pinning works, local-only editing, re-pinning, and detection. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no annotations and no output schema, the description is remarkably complete: it specifies inputs, the embedding semantics, the mutation behavior, and how to identify the result. The only notable gap is that it does not describe the return value or possible failure modes, such as what happens if the source project cannot be resolved, though the schema does cover the self-embedding constraint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful interaction semantics: source_morpha_id is explicitly named as the source project id, version is explained as an optional pin label, and the description clarifies that the server resolves and inlines the pinned version. It goes beyond repeating the schema by connecting each parameter to the embedding workflow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('another of the user's projects'), a precise action ('Embed'), and the resulting object ('version-pinned band'). It clearly differentiates this from siblings like add_embed_origin and create_project by explaining the cross-project embedding concept. An agent can tell exactly what this tool does without needing to inspect the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool and how to handle the version-pinning workflow. It explicitly tells the agent that re-pinning to a different version should be done from the editor's Inspector, not this tool, and mentions describe_video for identifying embedded bands. It does not explicitly say 'use X instead of Y', but the operational context is strong enough for an agent to decide correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_pageAInspect
Append a page to the project — works on any project, turning a single-page video into a multi-page one. Without duplicate_index a blank page is appended, sized to the project's canvas. With duplicate_index the page at that position is deep-copied (a fresh id is minted). There is no limit on page count. The new page becomes the active page; its index is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name for the new page. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| duplicate_index | No | Optional. 0-based index of an existing page to deep-copy instead of appending a blank one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It explains the mutation effects, deep-copy semantics with a fresh id, no page-count limit, the active-page side effect, and the return value. This is rich, specific behavioral transparency for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then efficiently covers conditional behavior, limits, side effects, and return value. Each sentence carries useful information, and nothing feels redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description properly states that the new page's index is returned. It also covers the behavior of both parameterized modes, the active-page effect, and the absence of a page-count limit. For a 3-parameter tool with one required parameter, this is complete enough for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: duplicate_index controls whether a blank or deep-copied page is appended, and the blank page is sized to the project's canvas. The name and projectId parameters are adequately covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and resource: 'Append a page to the project.' It further clarifies the operation by explaining the single-to-multi-page transition and highlighting that the new page becomes active, distinguishing this from page-related siblings like delete_page, reorder_pages, and select_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context through two explicit modes: without duplicate_index a blank page is appended, and with duplicate_index an existing page is deep-copied. It does not explicitly name alternative tools or state when not to use it, but the conditional behavior gives enough guidance for an agent to select the correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_shapeAInspect
Add a shape layer. kind selects the primitive: rect | ellipse | triangle | star | pentagon | hexagon | arrow | heart | rounded-rect | diamond | parallelogram | trapezoid | semicircle | ring | pill | cross | heptagon | octagon | star-4 | star-6 | sparkle | burst | arrow-left | double-arrow | chevron | block-arrow-up | curve | lightning | speech-bubble | location-pin | checkmark | x-mark | shield | cloud | crescent | teardrop | banner. All are native vector shapes; never substitute an image layer for one. Default-positioned in canvas centre if x/y/w/h omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| kind | Yes | ||
| block | No | OPTIONAL timeline window — {start, duration} in composition frames. OMIT IT (the default) and the layer is ALWAYS PRESENT: a persistent overlay that holds for the whole composition, which is what an agent-placed watermark / lower-third almost always wants. Pass it to place a bounded CLIP instead (what the editor's own add does: 5 s at the playhead). Keyframes on a blocked layer are sampled RELATIVE to `start`. | |
| color | No | Fill colour as #rrggbb. | |
| width | No | ||
| height | No | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It adds useful traits: the layer is a native vector shape, and omitted x/y/w/h defaults to canvas center. However, it says nothing about return values, reversibility, or the important default timeline behavior (persistent overlay) that is only described in the block parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, and the long shape list earns its place by disambiguating the `kind` enum. The image-layer warning and default-position note are compact and add real decision value without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema and no annotations, the description is serviceable but not fully self-contained. An agent still must rely on the block schema to learn that omitting the block creates a persistent overlay and that passing it creates a bounded clip; return/output behavior is also unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 38%, so the description needs to compensate, and it does for key params: it explains that `kind` selects a primitive and lists the allowed values, and clarifies that omitted x/y/w/h places the shape at the canvas center. The schema already documents block, color, and projectId, leaving only coordinate units and width/height semantics implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific action and resource, 'Add a shape layer,' and enumerates the exact primitive kinds, making the tool's scope clear. It also distinguishes itself from image layers with 'never substitute an image layer for one,' though it doesn't explicitly name sibling alternatives like add_text_layer or add_curve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: for native vector shapes, and explicitly warns against using an image layer instead. It also provides a useful behavioral hint by saying default placement is canvas center if x/y/w/h are omitted, which helps agents decide whether to supply geometry. It doesn't discuss when to prefer other layer-adding siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_speed_keyframeAInspect
Add or overwrite a speed-ramp (time-remap) keyframe on a video layer, for a rate that CHANGES over the clip. frame is a PROJECT-timeline frame and must sit on the clip (at or after its timeline_start_frame); the curve itself is anchored to the clip, so moving the clip carries the ramp with it and never changes its duration. For a constant slower/faster clip use set_clip_speed instead. rate is the playback rate at frame: 1 = real-time, 0.5 = half-speed, 2 = double-speed. Range: rate in [0.1, 8]. The ramp multiplies the layer's constant speed, and the clip's timeline length is derived from the resulting curve.
| Name | Required | Description | Default |
|---|---|---|---|
| rate | Yes | Playback rate at this frame (1 = real-time, in [0.1, 8]). | |
| frame | Yes | Project-timeline frame number. | |
| elementId | Yes | video.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the operation can overwrite an existing keyframe, that the curve is anchored to the clip, that moving the clip carries the ramp without changing duration, that rate multiplies the layer's constant speed, and that timeline length derives from the curve. This is comprehensive and non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place, starting with the core action and immediately clarifying the change-over-time behavior, then addressing the key timing constraint, the constant-speed alternative, and rate semantics. No filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the absence of annotations, and the lack of an output schema, the description is remarkably complete. It tells the agent what the tool does, when to use it, what constraints exist, how parameters behave, and what side effects occur. No critical usage information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema covers all four parameters at 100%, the description adds substantial meaning beyond the schema: frame must be at or after timeline_start_frame, the curve anchors to the clip, rate values map to real-time/half-speed/double-speed, and the clip's timeline length is derived from the curve. This significantly enhances an agent's ability to pick correct parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Add or overwrite a speed-ramp (time-remap) keyframe on a video layer.' It also clarifies the key differentiator, that the rate changes over the clip, and explicitly contrasts this with set_clip_speed for constant speed changes. An agent can immediately identify what this tool does and why it exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool versus an alternative: 'For a constant slower/faster clip use set_clip_speed instead.' It also states the frame must be a project-timeline frame and must sit on the clip, giving clear positional requirements for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_text_layerAInspect
Create a new text layer — a first-class leaf that animates, groups, and z-orders exactly like an image or shape. The renderer draws live typeset text (multi-line, auto-fit to the box). Defaults: x/y = canvas centre, width 900, height 320, font_family "Anton", text_size derived from existing text layers (or ~10% of canvas height). Also accepts full type styling: font_weight (100-900), font_style (italic), text_transform, letter_spacing, line_height, text_align, text_autofit ("hug" default = box shrink-wraps the text at the fixed text_size, honouring literal newlines, so it can't re-wrap between preview and export — bake your own "\n" line breaks / "wrap"=fixed size + word-wrap to the box / "fit"=auto-size to fill the box, grows and shrinks / "shrink"=legacy shrink-only), text_valign (top/middle/bottom), an outline (stroke_width + stroke_color), and text_shadow. Returns the new layer's id + element id (text.).
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Centre x in canvas px. Defaults to canvas centre. | |
| y | No | Centre y in canvas px. Defaults to canvas centre. | |
| text | No | The text to render. Newlines are honoured as hard line breaks. | |
| block | No | OPTIONAL timeline window — {start, duration} in composition frames. OMIT IT (the default) and the layer is ALWAYS PRESENT: a persistent overlay that holds for the whole composition, which is what an agent-placed watermark / lower-third almost always wants. Pass it to place a bounded CLIP instead (what the editor's own add does: 5 s at the playhead). Keyframes on a blocked layer are sampled RELATIVE to `start`. | |
| curve | No | Curve the text onto an arc, in degrees of total sweep. 0 = straight (default). POSITIVE = a SMILE (⌣, ends rise); NEGATIVE = an ARCH (⌒, rainbow). Clamped ±135. A tasteful smile is ~+60. Single line only (multi-line is joined while curved). | |
| width | No | Box width in px (> 0). Default 900. | |
| height | No | Box height in px (> 0). Default 320. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| text_size | No | Font size in px. Omit to derive from existing text layers (median) or the canvas height. | |
| font_style | No | Italic toggle. Default normal. | |
| text_align | No | Horizontal alignment of each line. Default center. | |
| text_color | No | Text fill colour as #rrggbb. Defaults to white. | |
| decorations | No | Per-character underline / strikethrough. { underline?: [{start,end}], strikethrough?: [{start,end}] } — half-open character ranges [start,end) (UTF-16 offsets) into `text`. E.g. underline the first word of "Big news": underline:[{start:0,end:3}]. Ranges are normalized (sorted + merged). Not rendered on curved text. | |
| font_family | No | Google Fonts family name, e.g. "Anton". Default "Anton". | |
| font_weight | No | Font weight 100..900 (400 regular, 700 bold, 800 black). Default 400. | |
| line_height | No | Line height as a multiple of font size (1.2 = 120%). | |
| text_shadow | No | Drop shadow { offsetX, offsetY, blur, color }; color is any CSS colour (rgba allowed). null clears it. | |
| text_valign | No | Vertical alignment of the text block within its box. "middle" (default) centres it; "bottom" pins it to the box floor so extra wrapped lines grow upward from a fixed baseline (captions use this so a wrapped line doesn't shift the others); "top" pins the ceiling. | |
| stroke_color | No | Outline colour as #rrggbb. Defaults to white when a width is set. | |
| stroke_width | No | Outline width in px (0 = no outline). | |
| text_autofit | No | How text fits its box. "hug" (default for new layers): hold text_size FIXED and DERIVE the box from the measured text plus padding, honouring the literal newlines you pass — the box shrink-wraps the exact content and grows/shrinks live as the text changes, so it can never re-wrap differently between the editor preview and the export (bake your own "\n" breaks; pair with set_text_background for a rounded caption box). "wrap": hold text_size FIXED in a fixed-size box and only word-wrap (hard-breaking a single over-wide word), never resize. "fit": ignore text_size and auto-size the font BOTH ways (grow and shrink) to the largest size whose wrapped block fills the box — resizing the box resizes the text. "shrink" (legacy): word-wrap then auto-shrink the font from text_size until the block fits; never grows. | |
| letter_spacing | No | Tracking between glyphs in px; may be negative. Default 0. | |
| text_transform | No | Case transform applied before layout. Default none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses defaults (centre x/y, 900x320, Anton, derived text_size), mutation semantics (creation + returned id), timing behavior (omitting block = always present, keyframes relative to `start`), curve direction conventions (positive = smile, negative = arch), and edge cases (decorations not rendered on curved text). This is unusually transparent for a create tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and well-structured, front-loading the core action and then layering defaults, styling options, and return value. It is long, but every section adds operational value. The only minor redundancy is that some parameter details (e.g. autofit semantics) are repeated in the schema, but in context this repetition helps an agent avoid schema-diving.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter creation tool with no output schema and no annotations, the description is remarkably complete. It covers defaults, derived behaviors, keyframe timing semantics, curve constraints, autofit modes, return value, and edge cases. An agent has enough context to call this correctly and interpret the result without auxiliary documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning beyond the schema: concrete defaults (canvas centre, Anton, 900x320, derived text_size), the practical watermark/lower-third use case for omitting `block`, the live shrink-wrap guarantee of 'hug', the smile/arch convention for `curve`, and the return value. This far exceeds what the schema alone communicates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Create a new text layer'. It further distinguishes this tool from siblings by characterizing the layer as 'a first-class leaf that animates, groups, and z-orders exactly like an image or shape', and by stating the renderer draws 'live typeset text'. This makes it clearly distinct from add_image_layer, add_shape, set_layer_text, and add_caption_track.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong parameter-level guidance, such as omitting `block` for watermark/lower-third overlays and using specific autofit modes, but it never explicitly tells an agent when to choose add_text_layer over sibling tools like add_caption_track or add_image_layer. Usage is implied by the tool's purpose rather than declared with exclusions or alternatives, so this is adequate but not exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_to_collectionAInspect
Add a layer to the user's reusable Collection. Pass ANY element id — a leaf (text., image., …) or a whole group. (a lower-third, logo sting, brand intro). It then appears in the user's Collection (list_collection), where they — and, if this project is in a workspace, every teammate — can drop a self-contained COPY of it into any other project (add_from_collection). Copies are IMMUTABLE: adding copies the whole subtree + its asset bytes, so editing or deleting this source never changes a copy already placed elsewhere. Works on solo projects too (a personal Collection). Give the layer a clear name first (rename_layer / rename_group) — that name is what shows in the Collection.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | The element id to add — any leaf (text/image/video/shapes.<id>) or a group.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full burden of behavioral disclosure. It does so well by stating that adding creates an immutable, self-contained copy of the whole subtree plus asset bytes, and that later edits or deletions of the source do not affect existing copies. This goes beyond a simple 'adds to collection' statement, though it does not cover every possible side effect such as permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and accepted inputs are front-loaded in the first sentence, with subsequent sentences adding important behavior about immutability, workspace sharing, and naming. It is long, but every sentence earns its place by clarifying usage and consequences rather than repeating schema data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, the description is complete: it explains what to pass, where the layer appears, how copies behave, how teammates can use it, and what prerequisite to satisfy first. An agent has enough context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are already fully described in the schema at 100% coverage, so the baseline is 3. The main description reinforces that elementId can be a leaf or group.<id> and that projectId selects the existing project to mutate, but it does not add substantial new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Add a layer to the user's reusable Collection,' and specifies what kinds of element IDs are accepted (leaf or group.<id>). It also differentiates itself from related siblings by explicitly mentioning list_collection and add_from_collection, so the agent understands the exact role of this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description names the relevant alternatives: list_collection for viewing the collection and add_from_collection for dropping a copy into another project. It also explains when this works (solo projects and workspace projects) and advises renaming layers first with rename_layer/rename_group, giving strong guidance on when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_video_layerAInspect
Add a video layer. The clip must already exist at users//clips// (uploaded via /api/upload-clip). To duplicate an existing layer, reuse its clip filename — the editor auto-assigns a fresh id.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Centre x in 1080-wide base coords. | |
| y | Yes | Centre y in 1920-tall base coords. | |
| clip | Yes | Clip filename in the project's clips bucket, e.g. demo.mp4. | |
| name | No | Optional friendly label shown in the Inspector + Timeline. | |
| width | Yes | Width in px (must be > 0). | |
| height | Yes | Height in px (must be > 0). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does a good job by disclosing the hard prerequisite that the clip must already exist and the special behavior that reusing a clip filename causes the editor to auto-assign a fresh id. It does not mention return values, failure modes, or permission requirements, but for a simple additive operation these are less critical gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: the core action comes first, followed by the prerequisite and a practical usage tip. Every sentence earns its place without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100% schema coverage and the relatively simple flat parameter set, the description provides enough context for an agent to call the tool correctly: the non-obvious prerequisite and the duplication behavior are both explained. The absence of an output schema means return shape is not described, but that is a minor gap for this kind of additive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds real value for the clip parameter by specifying the upload path and the duplicate-by-reuse mechanism, which are not derivable from the schema alone. It does not add meaning for x, y, width, height, or name, but the schema already documents those adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific action and resource: 'Add a video layer.' The 'video' modifier distinguishes it from sibling tools like add_image_layer and add_text_layer, and the duplicate-by-reuse note further clarifies what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the prerequisite that the clip must already exist at a specific storage path and gives the upload endpoint. It also provides guidance for duplicating an existing layer by reusing the clip filename. It does not explicitly name sibling tools or state when not to use it, so it misses the exclusionary guidance that would make it a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_presetCInspect
Apply a canned animation preset to a layer.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | Yes | ||
| elementId | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| startFrame | No | Frame to anchor on. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full burden of behavioral disclosure. It only says 'Apply', implying a mutation, but does not explain side effects on existing layer properties, whether the preset replaces or overlays existing animations, or whether the operation is reversible. This is minimal behavioral context for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that immediately conveys the core operation. It is appropriately sized, front-loaded, and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters, an enum, no annotations, and no output schema, this description is too sparse. It omits behavioral context, fallback behavior, error cases, and relationship to sibling animation tools like apply_preset_stagger. An agent would likely need to inspect other resources or guess about side effects and return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, covering projectId and startFrame but not elementId or preset. The description adds useful context that the preset is an animation and the target is a layer, which helps interpret elementId and preset, but it does not articulate how startFrame interacts with presets or whether elementId refers to a layer ID specifically. It partially compensates for the schema gap without fully completing parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Apply a canned animation preset to a layer' clearly names the action (apply), the object (a canned animation preset), and the target (a layer). It does not explicitly contrast with the closely named sibling apply_preset_stagger, so it misses the chance to differentiate, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as apply_preset_stagger, fade_layer, or manually adding keyframes. The description simply states the operation without contextual selection criteria or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_preset_staggerAInspect
Apply the same preset to a LIST of layers with a per-element startFrame offset — one call instead of N apply_preset calls. For diagonal pop-in grids, sequential list reveals, ring-pulse sweeps. The startFrame for entry i is startFrame + i * stagger. Order the elementIds in the visual order you want the animation to cascade.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | Yes | ||
| stagger | No | Frames between successive elements. Default 1. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| elementIds | Yes | Layers to animate, ordered as the cascade should fire (first id gets startFrame; each next gets +stagger frames). | |
| startFrame | No | Base frame for the first element. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It transparently notes that the project is mutated and gives the exact offset formula, but it doesn't mention whether existing animations are overwritten, whether the call is idempotent, or what happens on failure/results returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: it states the core behavior, gives examples, and then provides the formula and ordering rule. The example use cases add a little length but are useful context rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All behavior needed to call the tool correctly is covered: the parameters, defaults, ordering, and mutation target. There is no output schema, but for a mutation-focused tool the absence of return-value documentation is not a significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Four of five parameters have meaningful descriptions, including elementIds ordering, startFrame base, stagger increment, and projectId selection. The preset parameter lacks a description but its enum values are self-explanatory, so coverage is strong overall.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states that the tool applies the same preset to a list of layers with per-element startFrame offsets, and explicitly contrasts it with making N apply_preset calls. It also gives concrete use cases (diagonal pop-in grids, sequential list reveals) that distinguish it from the sibling apply_preset tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use the tool and how the stagger formula works, plus the need to order elementIds by cascade order. It doesn't explicitly say when not to use it or compare with fade_layer/add_keyframe, but the 'one call instead of N apply_preset calls' guidance is sufficient for most cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clip_processing_statusAInspect
Report whether a clip — or every video clip in the project, if clip is omitted — has been through the browser-side video-processing pipeline: proxy build, audio split, transcription, OCR (text regions). Processing never runs on the server. The preview proxy is mandatory: every processing run builds it (client.addVideo / client.processClip / client.processProject in the morphareels-sdk npm client, which drive local Chrome), and the Morpha editor builds any missing proxy for every page's clip when the project is opened. The other steps run through the same npm client or in the editor. Returns { ok: true, data: { clips: [{ clip, processed, steps: { audio_demux, proxy, audio_split, transcript, text_regions } }], allProcessed } }, where each step is 'ready' | 'pending' | 'running' | 'unavailable' | 'error'. Use it to know whether transcribe_clip / detect_text_regions will return data, and to surface an 'unprocessed' state to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| clip | No | Optional clip filename (video.<id>.clip). Omit to report every video clip in the project. | |
| projectId | Yes | Project the clip(s) belong to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations given, the description carries the full burden of explaining behavior. It discloses that processing runs client-side, that the preview proxy is always built, and that the tool returns a structured status object. It also explains the status enum values. While it doesn't mention auth or side effects, for a read-only status tool this is adequate transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose and includes redundant statements (e.g., 'Processing never runs on the server' followed by a detailed client-side explanation, and the return format is described twice). While the structure is logical—purpose, processing details, return schema, use cases—it could be tightened substantially without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a status-query tool: it fully explains the return object, the meaning of each status value, and how to interpret the results. It also connects to related tools (transcribe_clip, detect_text_regions) and explains the mandatory proxy step. No essential context is missing, though it could be more concise.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides full descriptions for both parameters: projectId and clip (with the filename format and omit-to-report-all behavior). The tool description repeats this information without adding significant new meaning. It does contextualize how the parameters affect the returned data, but the schema coverage is already 100%, so the description adds only marginal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool's exact purpose: reporting whether a clip (or all clips) has gone through the video-processing pipeline. It enumerates the specific steps (proxy build, audio split, transcription, OCR) and gives concrete use cases, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use it to know whether transcribe_clip / detect_text_regions will return data, and to surface an unprocessed state.' This provides clear when-to-use guidance and ties it to sibling tools. It also clarifies the optional vs. required parameters, though it doesn't delve into alternative query tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_accountAInspect
Create a fresh Morpha account and get an API key back, with no browser, no email and no human involved. Call this FIRST when you have no key, then send the returned token as Authorization: Bearer <token> on every later call. Takes an optional name that labels the key. The account can build, edit and render, and it has NO AI credit envelope — drive the tool catalog with your own model, which is free and unmetered. Nobody can sign into this account, so when you are done, share the project to the human's email address (PUT /api/project//share, or ask them to sign in and use their own account) and give them the /app/ link. Rendering an MP4 is not available here: it runs a real local browser, so use the morphareels-sdk npm client's client.renderVideo(projectId).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional label for the minted key, e.g. the name of the agent or the task. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the side effects (no email, no human), the returned token, and important limitations (no AI credit envelope, no sign-in) with no contradictions to annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description contains redundant and tangential instructions about sharing projects and rendering MP4s, making it longer than necessary for a simple account creation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides the essential workflow details (token usage, sharing guidance), though the extra rendering instructions are somewhat off-topic and could be trimmed without losing core context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'name' is fully described with a clear purpose and an example ('name of the agent or the task'), significantly enhancing the schema's minimal info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Create a fresh Morpha account') and a distinct resource ('account'), making it unambiguous and distinguishable from all sibling tools like create_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'Call this FIRST when you have no key' and explains how to use the returned token in subsequent requests, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectAInspect
Create a new project and return its server-minted id. The id is an opaque v4 UUID assigned automatically — you never choose or name it; refer to the project by its name. By default this mints a fresh BLANK project (empty canvas, no layers) — creation is independent from cloning. Pass fromProjectId ONLY when you want to clone: the new project then copies that project's JSON, uploaded assets, and uploaded clips, and — like duplicate_project — FOLLOWS THE SOURCE'S workspace by default (cloning a team project stays in that team; a blank project is personal). Pass workspaceId (from list_workspaces) to place it in a specific workspace instead — requires an edit-capable role there — or null to force it into the caller's personal space. If the clone source lives in a workspace you can only view, the call FAILS rather than silently making a personal copy — pass workspaceId:null for a personal copy. The user's editor session won't auto-refresh — they'll need to reload to see the new project in the picker.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Recommended human-readable label, shown verbatim in the editor's project picker (the only user-facing handle for the project). Omit and the picker falls back to the opaque id. | |
| workspaceId | No | Where to place the project. Omit to FOLLOW THE SOURCE (a clone inherits its source's workspace; a blank project is personal). A workspace id (from list_workspaces) places it there — requires an edit-capable role. null forces the caller's personal space. | |
| fromProjectId | No | Optional id of an existing project to CLONE (copies its JSON + uploaded assets + clips). Omit to create a fresh blank project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing side effects. It covers return value, workspace placement rules, role requirements, failure on view-only clone sources, and the need for the user to reload the editor—all important behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core action, but contains some redundancy (e.g., repeating the 'follows the source' rule for workspaceId and fromProjectId). It is dense and useful, though slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 optional parameters, no output schema), the description fully covers inputs, return value, failure modes, permissions, and post-creation behavior. It leaves no significant gap in understanding how to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are described in the schema with rich semantics: name is a recommended label, workspaceId defines placement with null forcing personal space, and fromProjectId enables cloning. The description adds context beyond the schema, such as fallback to opaque id and what cloning copies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a new project and returns its server-minted id, distinguishing blank creation from cloning. It references related concepts like duplicate_project and list_workspaces, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly explains when to use fromProjectId, how workspaceId determines placement, and the default behavior for both cloning and blank projects. It also notes failure conditions and the need for edit-capable roles, giving complete usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cut_rangeAInspect
Ripple-delete a time window [startFrame, endFrame) — remove that span and pull all later content earlier by delta = endFrame - startFrame (the NLE 'ripple delete' / 'close gap'). Shifts every keyframe, colour keyframe, marker, audio overlay, loop region, and start_at through the cut (a speed ramp is anchored to its clip and rides along unchanged), and is SOURCE-AWARE for video layers: a clip that straddles the cut is trimmed, and one whose interior is removed is SPLIT into two layers. Audio overlays interior to the cut are truncated at the seam (overlays have no source-in to bridge the gap). REFUSES to cut across a video layer that carries speed-ramp keyframes — remove them, or cut outside that layer's span, first. The composition length shrinks accordingly (an authored length loses only the overlap with its visible region). Frames are 0-indexed project-timeline frames at 30 fps; endFrame is exclusive and clamped to the composition length.
| Name | Required | Description | Default |
|---|---|---|---|
| endFrame | Yes | End frame of the window to remove (0-indexed, EXCLUSIVE). Must be > startFrame; clamped to the composition length. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| startFrame | Yes | First frame of the window to remove (0-indexed, inclusive). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it is exceptionally thorough: it explains ripple-delete effects, keyframe/marker/audio-overlay shifting, layer trimming versus splitting, audio-overlay truncation, the speed-ramp refusal, composition-length shrinking, and frame indexing/clamping. This is far beyond what the schema conveys and leaves little hidden behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first line, and every subsequent clause adds a distinct behavioral or edge-case fact rather than restating the schema. Although dense, the description is appropriately sized for the complexity of a ripple-delete operation with source-aware splitting and refusal conditions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is remarkably complete for invocation: it covers coordinate conventions, clamping, inclusive/exclusive boundaries, affected element types, layer-specific behavior, refusal conditions, and length-shrinking consequences. An agent has enough information to call this tool correctly and predict its side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: frames are '0-indexed project-timeline frames at 30 fps', endFrame is exclusive and clamped, and the delta calculation is defined. This clarifies how the two numeric parameters interact and what coordinate space they live in.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Ripple-delete a time window [startFrame, endFrame)' on the project timeline, clearly defining the operation and its NLE semantics. It further distinguishes itself from sibling mutation tools by detailing source-aware layer trimming/splitting and the refusal on speed-ramp keyframes, so an agent can unambiguously identify what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operation context and an explicit when-not condition: it 'REFUSES to cut across a video layer that carries speed-ramp keyframes' and prescribes the remedy ('remove them, or cut outside that layer's span, first'). It does not name alternative sibling tools, so it stops short of fully explicit alternative routing, but the constraints are actionable enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_pageAInspect
Remove the page at index. Fails on an out-of-range index or when only one page remains — a project must keep at least one page. The active page stays active; when the active page itself is deleted, active_index falls to the neighbouring page (the one that slid into its position, or the new last page).
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | 0-based index of the page to remove. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Explains the effect on the active page and active_index, and identifies failure conditions, but does not explicitly flag the destructive nature of the operation beyond the verb 'remove'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-load the action and include necessary edge-case details without redundancy or irrelevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a mutation tool with no output schema: it specifies what is removed, required parameters, failure conditions, and resulting active-page behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have schema descriptions that fully cover their meaning; the prose adds context about active-page behavior but does not significantly augment the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('Remove the page at `index`') and the resource it operates on, distinguishing it from project-level deletion and page reordering tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context and important edge-case constraints (fails on out-of-range index or when only one page remains), though it does not explicitly name sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_projectAInspect
Permanently delete a project: its JSON, shortlist, versions, uploaded assets, and uploaded clips. Requires edit access — the owner, a workspace editor/admin/owner, or a direct-share editor; anyone else gets the opaque not-found. Deleting the last remaining project is allowed. The user's editor session won't auto-refresh — if they were viewing the deleted project they'll need to reload.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral transparency. It explicitly states the action is permanent, describes the security behavior (opaque not-found for unauthorized users), and notes that the editor session won't auto-refresh—all important side effects the agent should know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using three sentences to convey the action, permissions, and side effects without redundancy. Every sentence adds valuable information, and there is no fluff or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (one parameter, no output schema), the description is thorough: it covers the action, the full scope of deletion, access control, an edge case (last project), and post-deletion behavior. No critical information is missing for the agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, projectId, has a clear description ('Project to delete.') and schema coverage is 100%. The description adds meaning beyond the schema by indicating the parameter identifies the project to be deleted, which is exactly what the agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: permanently delete a project and lists all associated data (JSON, shortlist, versions, uploaded assets, clips). It uses the specific verb 'delete' and the resource 'project', making it distinct from sibling tools like duplicate_project or rename_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context by specifying access requirements (edit access, owner, workspace editor/admin, direct-share editor) and notes that deleting the last project is allowed. While it doesn't explicitly mention alternatives, none exist for deletion, and the permissions note helps the agent understand when the tool will succeed. A minor gap is not explicitly stating 'use this when you want to delete a project', but it is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_versionAInspect
Permanently delete one saved version (bookmark or auto-snapshot). Accepts the version's UUID id or the v<N> shorthand. The bookmark v sequence keeps gaps — numbers never re-shuffle — so any external snippet referencing the deleted v<N> will fail to resolve afterwards. Idempotent: deleting a non-existent version is a no-op.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project whose version to delete. | |
| versionId | Yes | Version to delete. UUID `id` or `v<N>` shorthand. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description mentions the idempotent nature of deletion and the gap behavior in the v<N> sequence, which are important behavioral details. However, it does not explicitly warn about the irreversibility of the deletion, though 'permanently delete' implies it. Overall, it provides good transparency given the lack of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with three sentences covering purpose, input formats, and behavioral notes. There is no redundant or extraneous information, and the structure is clear and direct.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation, the description covers the essential aspects: what it deletes, how to specify the version, and the idempotency. It does not mention potential error cases or side effects, but given the tool's simplicity, it is relatively complete. The lack of an output schema is acceptable as the tool likely returns a status or nothing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters (projectId and versionId) are already described in the schema. The description adds context about the v<N> shorthand and gap behavior, but these are more about tool behavior than parameter semantics. Since schema coverage is 100%, the description provides minimal additional parameter-specific value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Permanently delete one saved version'. It also distinguishes the tool from siblings like rename_version, save_version, restore_version, and list_versions by focusing on deletion and the specific input formats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two acceptable input formats (UUID or v<N> shorthand), and notes that the v<N> sequence keeps gaps, which helps agents understand the behavior. It also states that deleting a non-existent version is a no-op, providing clear guidance on expected outcomes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_videoAInspect
Structural OVERVIEW of the composition (the table of contents) — canvas size, duration, the backdrop summary, and a z-ordered tree (top of stack first) of every layer with its elementId, type, name, type label (filename/clip/text/kind), geometry (x/y/width/height), and which properties are animated. Does NOT include keyframe values or styles — those are unbounded. On a multi-page project the tree describes the ACTIVE page and the data carries a pages block ({ page_count, active_index, pages: [{ index, name, has_video }] }) — content tools target that active page; use select_page to switch which page they target, add_page / delete_page / reorder_pages to manage the pages. Start here, then call inspect_layers([elementId, …]) for full detail on the specific layers you'll change. Don't guess keyframe/style values from this overview.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses exclusions (keyframe values/styles are unbounded), the active-page behavior, and the exact pages block shape. However, it never explicitly states the call is read-only, and the input schema's projectId description claims this call 'mutates' the project — an inconsistency the tool description does not preempt.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
All five sentences earn their place: core scope and return content first, exclusions second, multi-page caveat third, then routing to inspect_layers and a final guardrail. Dense but every clause carries signal; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 detailing the return values (canvas, duration, z-ordered tree fields, pages block) and the multi-page edge case. The only gap is the unresolved read-only question: the schema's 'mutates' wording plus a missing explicit no-side-effects statement leaves slight ambiguity for a tool that is clearly an overview.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline of 3 applies even though the description adds no parameter-specific syntax. The description's multi-page note indirectly clarifies what projectId selects (the active page), but the schema text itself is misleading: 'Selects which existing project this call mutates' is wrong for a read-only overview tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a structural overview / table of contents of the composition, enumerating exactly what it returns (canvas size, duration, backdrop summary, z-ordered layer tree with elementId, type, geometry, animated properties). It explicitly differentiates itself from inspect_layers and the page-management siblings, so an agent can select it correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing: 'Start here, then call inspect_layers' for full detail on the layers to change. It also names the exact alternatives for page management (select_page, add_page, delete_page, reorder_pages) and warns 'Don't guess keyframe/style values from this overview,' covering both when-to-use and when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_text_regionsAInspect
Return the OCR text regions detected in a clip's video frames OR a still image asset. Pass either clip (a video..clip filename) or image (an image layer's filename) — not both. Video clips are sampled every 0.3s at upload time; images are OCR'd once. Results are cached in R2 next to the source. Returns { status: 'ready' | 'not-ready', frames: [{ frame, time, words: [{ text, x0, y0, x1, y1, confidence }] }], videoWidth, videoHeight }. For an image there's a single frame (frame 0); videoWidth/videoHeight are the image's pixel dimensions. Each words entry is one detected text line — text may hold several words, the box is axis-aligned, and confidence is 0–100. Coordinates are in the SOURCE pixel space (not canvas space). Use to know where titles / subtitles / lower-thirds are baked into the video or image so the Morpha title + intro graphics can be positioned to not collide.
| Name | Required | Description | Default |
|---|---|---|---|
| clip | No | Video clip filename (the same value as `video.<id>.clip`). Pass this OR `image`. | |
| image | No | Image layer filename (the same value as `image.<id>.filename`). Pass this OR `clip`. | |
| projectId | Yes | Project the clip/image belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does so thoroughly: sampling cadence (0.3s), image OCR happening once, R2 caching, not-ready status, source-pixel coordinate space, confidence range, and axis-aligned boxes are all disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely packed; every clause adds operational detail, return-shape clarification, a coordinate caveat, or a usage rationale. It is front-loaded with the core purpose and input constraint before diving into output details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without a formal output schema, the description fully defines the return shape, field semantics, frame behavior for images, and coordinate space. The only minor omission is retry guidance for 'not-ready', but the overall context is rich enough for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description reinforces clip-vs-image exclusivity and filenames but does not materially add parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the OCR text regions detected in a clip's video frames OR a still image asset.' It distinguishes itself from audio-oriented siblings like transcribe_clip by focusing on OCR text and naming both input forms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear selection constraints ('Pass either clip or image — not both') and an explicit use case ('Use to know where titles / subtitles / lower-thirds are baked into the video or image'). It does not name alternatives to avoid, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_layerAInspect
Composition primitive: clone a leaf (image. / video. / shapes. / text.) count times, applying a cumulative per-step transform — copy i is offset by i·(dx,dy) px, rotated by i·d_rotation°, and scaled by d_scale^i. One call instead of dozens: a circle of stars (dx/dy + d_rotation), a row of chevrons (dx), a fractal (d_scale<1 + d_rotation), a staggered grid. Styles are copied; animate the result afterwards (e.g. group + a cycle-loop track for endless marching).
| Name | Required | Description | Default |
|---|---|---|---|
| dx | No | Per-step x offset in px. | |
| dy | No | Per-step y offset in px. | |
| count | Yes | Number of copies to create. | |
| d_scale | No | Per-step size multiplier (1 = no change). | |
| elementId | Yes | Leaf to clone (e.g. shapes.chevron-1). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| d_rotation | No | Per-step rotation in degrees. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains the cumulative transform semantics precisely (offset by i, rotation by i, scale by d_scale^i), states that styles are copied, and suggests how to animate the result. It doesn't explicitly say the original remains unchanged or describe the returned structure, but the cloning behavior is well implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core definition, then provides a compact formula, avoids redundancy with the schema, and uses brief illustrative examples to clarify intended use. Every sentence contributes to understanding the tool's purpose, behavior, or typical application.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter primitive with no output schema and no annotations, the description is thorough: it explains the transform model, enumerates acceptable element types, gives usage patterns, and notes animation follow-ups. It does not specify z-ordering or whether copies are independent layers, but these are minor omissions for an agent invoking this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema covers each parameter at 100%, the description adds essential semantics beyond the schema: the mathematical relationship between parameters and copies, exponential scaling via d_scale^i, and meaningful parameter combinations. This is exactly the kind of clarification an agent needs to call the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'clone a leaf ... count times', and names the exact element types it accepts (image, video, shapes, text). It clearly distinguishes this from duplicate_project and other sibling operations by framing it as a 'composition primitive' that applies cumulative transforms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete use cases ('a circle of stars', 'a row of chevrons', 'a fractal', 'a staggered grid') and claims 'One call instead of dozens', implying the alternative is repeated add/duplicate calls. However, it does not explicitly name alternative tools or state when not to use this tool, so there is a small gap in routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_projectAInspect
Duplicate an existing project into a brand-new one — a full copy of its layers, animations, styles, uploaded assets, and clips. Pass the SOURCE project's projectId; the copy gets a fresh id automatically (ids are opaque — never shown to the user). Defaults the copy's name to " copy" unless you pass name. WORKSPACE: the copy FOLLOWS THE SOURCE by default — a project in a workspace is copied into that SAME workspace, and a personal project stays personal. Pass workspaceId to override: a workspace id (from list_workspaces) to place the copy in a specific workspace (you need an edit-capable role there), or null to force the copy into your personal space. If the source lives in a workspace you can only VIEW, the call FAILS rather than silently making a personal copy — get an editor role there, or pass workspaceId:null. (Duplicating a project shared with you from a workspace you're NOT a member of lands in personal, since you can't be placed in that workspace.) The returned workspaceId tells you where it went. The user's editor won't auto-refresh — they reload to see the copy in the picker.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name for the copy. Shown verbatim in the picker; defaults to "<source name> copy". | |
| projectId | Yes | Id of the existing project to duplicate (the source). | |
| workspaceId | No | Optional override for where the copy lives. Omit to FOLLOW THE SOURCE (a workspace project stays in its workspace; a personal one stays personal). A workspace id (from list_workspaces) places the copy there — you need an edit-capable role. null forces the copy into your personal space. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It discloses naming defaults, id opacity, workspace-following behavior, role requirements, explicit failure behavior for view-only sources, behavior for shared projects, the returned workspaceId, and the editor refresh caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place given the tool's complexity. It is front-loaded with the core action and copy scope, uses a clear WORKSPACE marker for the nuanced behavior, and includes no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a duplication tool with no annotations and no output schema, the description covers invocation, naming, workspace placement, role requirements, failure cases, and the returned workspaceId. An agent has enough information to call the tool correctly and anticipate side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already covers all three parameters at 100%, the description adds significant meaning beyond the schema: the default workspace behavior, what happens when workspaceId is null, the list_workspaces reference, role requirements, and the failure mode. This substantially aids correct parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact operation ('Duplicate an existing project into a brand-new one') and specifies what is copied: layers, animations, styles, uploaded assets, and clips. It is clearly distinct from siblings like create_project (creates new) and duplicate_layer (copies a layer).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool, including what projectId to pass, default behavior, workspace overrides, and failure conditions. It does not explicitly name alternative tools or state when not to use duplicate_project, but the contextual guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fade_layerBInspect
Fade a layer's opacity between two frames in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| toFrame | Yes | ||
| elementId | Yes | ||
| fromFrame | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| toOpacity | Yes | 0..1. | |
| fromOpacity | Yes | 0..1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the core operation, but it does not say whether existing opacity keyframes are replaced, whether keyframes are created at the exact given frames, whether the operation is reversible, or what side effects the mutation has. For a mutating tool, this is a meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to understanding the tool's purpose, and it is immediately scannable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six required parameters, no annotations, and no output schema, this tool needs more behavioral and usage context than a one-liner provides. The description does not explain return values, error conditions, default behavior, or whether the operation mutates persistent project state beyond the implied fade.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers opacity ranges and projectId, while the description adds useful relational context by framing the parameters as a fade between two frames. It helps connect fromFrame/toFrame and fromOpacity/toOpacity as paired endpoints, but elementId and the frame fields still lack individual documentation, so the description only partially compensates for the 50% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Fade'), a specific resource ('a layer's opacity'), and the exact scope ('between two frames in one call'). This makes the tool's purpose unambiguous and distinguishes it from sibling tools like add_color_keyframe or add_keyframe, which handle different or more granular animation operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'in one call' implies this is the tool to use for a simple two-point opacity fade rather than building the fade manually with keyframes. However, it does not explicitly state when to prefer this over sibling tools like add_keyframes or set_keyframes_batch, nor does it give conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_public_imageAInspect
Search a PUBLIC, Creative-Commons + public-domain image pool (Openverse) for the query, download the top suitable result, store it in the project's asset bucket, and return the filename ready for add_image_layer. This finds someone else's openly-licensed image — it is NOT for uploading your own image (use upload_image for that). Use it for any "get me a parasol" / "find a beach photo" / "add a coffee cup" request — saves the upload-then-add_image_layer dance. Free; no model spend. Falls back to 404 when no suitable downloadable image is found. Always returns attribution { creator, creator_url, title, license, license_version, source_url } per the CC requirement; the editor/caller should surface this where the licence requires it. (Formerly named fetch_image; that name is still accepted as an alias.)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Plain-language search query — e.g. "parasol on a beach", "vintage coffee cup", "sunset over mountains". | |
| projectId | Yes | Project to add the image to. | |
| license_type | No | Openverse licence filter. "all-cc" (default) is widest; "commercial" excludes non-commercial licences; "cc0" pins to public-domain dedications. | |
| min_dimension | No | Minimum width or height (whichever is larger) in px. Default 800 so the layer doesn't disappoint at canvas size. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: downloads and stores in the project asset bucket, returns a filename ready for add_image_layer, falls back to 404 when no suitable image, always returns attribution, and is free (no model spend). No annotations are provided, so this full disclosure is essential and well done.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat verbose but avoids fluff. It packs useful examples, caveats, cost info, and alias into a single paragraph that remains easy to parse. Slightly long but acceptable for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the return value, side effects, fallback behavior, attribution, and cost. It does not explicitly tie each parameter to usage scenarios, but the schema already provides that context, so the description is sufficiently complete for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions already cover all four parameters at 100% coverage. The tool description adds minimal parameter-specific details beyond the schema, so it does not significantly enhance understanding of the parameters themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: search a public image pool, download, store, and return a filename for add_image_layer. It also explicitly differentiates from upload_image, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides direct usage guidance with concrete examples (e.g., 'get me a parasol'), explicitly states it is NOT for uploading your own image and directs to upload_image, and notes the workflow benefit (saves upload-then-add_image_layer dance).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fit_duration_to_contentAInspect
Clear an authored composition length and return to AUTO-FIT — the comp length tracks the furthest content (keyframe / video window / audio end) again, with a 1-second floor. The inverse of set_duration. NOTE: headless (no loaded media) this can UNDER-fit when a video layer's source_out_frame is null — its natural length is unmeasurable, so it contributes only its start frame; the length self-corrects the next time the project is opened in the editor, where the real clip durations are known.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so thoroughly. It explains the auto-fit rule, the 1-second floor, the headless under-fit edge case involving source_out_frame null, and the eventual self-correction in the editor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary purpose, then adds a clearly marked and necessary caveat. Every sentence contributes useful information without fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter API, the description covers the core behavior, side effects, and an important edge case. It does not explicitly describe the return value or error behavior, but the absence of an output schema makes this a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, projectId, and the schema description already fully explains it as an opaque UUID selecting the project to mutate. The tool description adds no additional parameter-level meaning, so the baseline schema coverage score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Clear an authored composition length') on a specific resource (composition duration) and explains the resulting behavior (AUTO-FIT tracking the furthest content). It also distinguishes itself from the sibling tool set_duration by explicitly labeling itself as the inverse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use it: after an authored duration has been set, to revert to auto-fit. It names set_duration as the counterpart, giving the agent a route to the alternative, though it does not spell out explicit 'use X instead' exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeze_frameAInspect
Freeze the picture at a frame: the clip is CUT there and a still of that frame is inserted between the halves, pushing everything after it later (the NLE 'frame hold'). This is how you hold a moment — play, freeze, continue. The still is an ordinary IMAGE layer showing that frame for holdFrames (default 150 = 5s at 30fps), so you resize, split, move or delete it like any other layer. image is the filename of a PNG of that frame, already uploaded to the project's assets — rendering one needs a browser, so capture and upload it first. The reply's frozenSourceFrame is the SOURCE frame that was frozen, which differs from frame on a retimed clip. frame must be strictly inside the clip.
| Name | Required | Description | Default |
|---|---|---|---|
| frame | Yes | Project-timeline frame to freeze at — must be strictly inside the clip. | |
| image | Yes | Filename of an already-uploaded PNG of the frozen frame, in the project's assets. | |
| elementId | Yes | video.<id> to freeze. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| holdFrames | No | How long the still holds, in frames. Defaults to 150 (5s at 30fps), the same default every added clip gets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the exact side effects: the clip is cut, a still is inserted, and everything after is pushed later. It also clarifies that the still becomes an ordinary image layer (resizable, splittable, etc.) and mentions the reply field 'frozenSourceFrame', providing strong transparency into the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly repetitive, restating the same points multiple times (e.g., the cut-and-insert behavior, the image upload requirement, and the frame constraint). It could be condensed to two or three sentences without losing any information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the operation, prerequisites, parameter constraints, and even the reply field 'frozenSourceFrame'. It lacks explicit error handling or return format details, but with no output schema and the given context, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already covers each parameter, the description adds meaningful context—e.g., the default holdFrames is 150 frames (5s at 30fps), the image must be an already-uploaded PNG, and frame must be strictly inside the clip. This enriches understanding beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool freezes a video frame by cutting the clip and inserting a still image, pushing subsequent content later. This is a precise and unambiguous purpose that distinguishes it from sibling tools like add_image_layer or set_video_clip.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames the use case as 'This is how you hold a moment — play, freeze, continue,' giving practical guidance. It also notes prerequisites like needing the PNG already uploaded and that the frame must be strictly inside the clip, but it does not explicitly contrast with alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_layersAInspect
Wrap sibling elements in a new group. USE THIS whenever several layers are one thing — a butterfly assembled from wings + body + antennae, an icon built from primitives, a card + its title + badge, a lower-third — and name the group what the thing is; a multi-shape object left as loose siblings is a defect the user has to clean up, and the group's name is their only handle on it. The group composes its x/y/scale/rotation/opacity onto its descendants (so one track flies/spins/fades the whole thing) and pivots rotate/scale at its (pivotX, pivotY), seeded to the centroid of its children at create time. The group's x/y track values are translation offsets applied around the pivot — groups have no static body of their own. All listed elementIds must currently share the same parent (root, or one existing group).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional human-readable label. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| elementIds | Yes | Element ids of the elements to wrap. Must all share the same parent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure. It explains that the group composes x/y/scale/rotation/opacity onto descendants, that pivots rotate/scale around pivotX/pivotY seeded to the child centroid, and that groups have no static body of their own—essential behavioral context beyond a simple 'wrap' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every clause earns its place; it front-loads the action and decision rule, then packs transformation semantics and constraints into the following sentences. The example list is illustrative rather than filler, and there is no redundant restatement of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a grouping tool with complex transform semantics and no output schema, the description is remarkably complete. It covers purpose, use cases, naming importance, composition behavior, pivot seeding, translation offsets, and parent constraints—everything an agent needs to decide and execute the call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all three parameters at 100%, so the baseline is a 3. The description adds meaningful semantic value by explaining that the group name becomes the user's only handle, that x/y values are translation offsets around the pivot, and that elementIds must share one parent—clarifying behavior that the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Wrap sibling elements in a new group.' It clearly distinguishes this operation from sibling tools like rename_group, ungroup_layers, and set_group_box by focusing on the act of grouping loose layers into one named composite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit, actionable guidance: 'USE THIS whenever several layers are one thing,' backed by concrete examples like a butterfly or an icon. It also states the key precondition that all elementIds must share the same parent, and frames leaving multi-shape objects ungrouped as a defect, clarifying when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_layersAInspect
Full per-element drill-in — the 'open this layer' half of the browser. Returns each named element's COMPLETE record: all of its own fields plus its animation tracks (every keyframe), colour/fill tracks, track-loop (extrapolation) modes, and style. Pass the elementIds you read from describe_video; pull detail only for the handful of layers you're about to mutate, not the whole project.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| elementIds | Yes | Element ids to inspect (image.<id>, video.<id>, text.<id>, shapes.<id>, group.<id>). Read them from describe_video's tree. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of showing this is a read-only inspection operation. It does so through 'drill-in', 'Returns', and 'about to mutate' as a future step, and it names the exact categories of data returned. It does not explicitly state 'does not modify the project' or mention auth/rate-limit caveats, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler: it front-loads the core purpose, then the return payload, then the invocation constraint. Every sentence earns its place and it does not repeat the schema property definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since no output schema is provided, the description's enumeration of returned content is essential and largely sufficient. It also explains where elementIds come from and how many to pass. However, the exact output shape—whether a map keyed by elementId or a flat array—is not specified, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are already fully documented in the schema, so this starts at a baseline of 3. The description adds useful selection guidance for elementIds: read them from describe_video and pull detail only for the layers about to be mutated. It adds nothing beyond the schema for projectId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Full per-element drill-in' that 'Returns each named element's COMPLETE record', and it enumerates the returned content including animation tracks, keyframes, colour/fill tracks, loop modes, and style. It also distinguishes itself from describe_video and the mutating sibling tools by calling itself the 'open this layer' half of the browser and framing mutation as a later step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit workflow: pass the elementIds read from describe_video, and inspect only the handful of layers you are about to mutate, not the whole project. This tells the agent when to call the tool, where to get inputs, and how to limit scope, which is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collectionAInspect
List the user's reusable Collection — layers they added with add_to_collection (lower-thirds, logo stings, brand intros, or any single layer). Returns { items: [{ scope, workspaceId, sourceProjectId, sourceProjectName, ownerEmail, elementId, name, kind, childCount }] }. scope is "personal" (from the user's own solo projects) or "team" (from a workspace they belong to). Show the user each item's name (and its sourceProjectName); sourceProjectId + elementId feed add_from_collection to drop a self-contained COPY into another project. Works on a solo account (personal items always included); takes no arguments.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: it discloses the exact return shape, explains the scope field semantics, covers the solo-account edge case, and states that no arguments are required. This is far richer than a typical list-tool description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized: purpose, return format, field semantics, downstream usage, and edge case. Every sentence contributes information an agent needs, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there are no parameters and no output schema, the description supplies everything needed: the response structure, the meaning of each important field, and the connection to add_from_collection. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters and 100% coverage, and the description explicitly confirms 'takes no arguments.' There is no ambiguity left for an agent about what to pass.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('List') and resource ('the user's reusable Collection'), and immediately defines what that collection contains with concrete examples. It also references add_to_collection, making the tool's role among its siblings clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly describes what the tool returns and how the returned sourceProjectId and elementId feed into add_from_collection, giving an agent strong context for when to call it. It does not explicitly name alternatives or call out when not to use it, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fontsAInspect
List available font families across every source the editor knows about (Google + Bunny + Fontshare + Fontsource + Velvetyne) PLUS the project's user-uploaded custom_fonts (surfaced as source: "custom"). Use this to discover families before set_layer_text / add_text_layer when you don't know what to pick. Returns { fonts: [{family, source, weights, italics}], total, returned, sources }. Filter via q (case-insensitive substring on family) and/or source; cap with limit (default 50, max 1000). Picking any returned family in font_family Just Works — the editor's loader dispatches to the right CSS/FontFace endpoint by source.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Case-insensitive substring filter on family name. Omit to list everything. | |
| limit | No | Max entries to return (default 50, max 1000). | |
| source | No | Restrict to one source. Omit to span every source. "custom" returns only the project's uploaded faces. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: it states the return shape, the sources returned, filtering semantics, default and max limits, and even notes that selected families will Just Work in later calls. No side effects or hidden behaviors are claimed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, each earning its place: scope, return shape/filtering, and downstream compatibility. The key purpose is front-loaded, and the details are organized without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only discovery tool with no output schema, it is unusually complete: it documents the returned object structure, sources, pagination cap, filters, and the reason to call it. An agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline applies. The description restates q, source, and limit semantics that are already in the schema, adding little new parameter-level meaning. It usefully ties results to future font_family usage, but it doesn't deepen understanding of current parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List available font families' and enumerates every source, including custom uploads. It also explicitly frames the tool as the discovery step before set_layer_text / add_text_layer, which makes its purpose immediately distinguishable from the large sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use instruction: 'Use this to discover families before set_layer_text / add_text_layer when you don't know what to pick.' It also explains the q/source/limit filtering behavior, so an agent knows exactly how to narrow results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsAInspect
List projects as { id, name, editorUrl } entries. The id is what every other tool's projectId argument takes. name is the human-readable label shown in the editor's project picker ("Untitled" when no name has been set — ids are opaque and never shown to the user, so always refer to a project by its name). editorUrl is a tappable link that opens that project in the editor — offer it to the user (by name) when they want to look at one. By default lists the user's OWN personal projects (those not in any workspace). Pass workspaceId (from list_workspaces) to instead list the projects that live in that workspace — including teammates' — each with the owner's ownerEmail. Call this when the user asks "what projects do I have?" or hasn't named a project but you need to operate on one.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional workspace id (from list_workspaces). When given, lists that workspace's projects instead of the caller's personal ones; requires membership. Omit for personal projects. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses the default personal-only scope, the workspace variant with ownerEmail, membership requirements, that ids are opaque and should not be shown, and that editorUrl is a tappable link to offer the user. This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
All four sentences earn their place: the output shape, field semantics, default vs workspace behavior, and an explicit usage trigger. The most decision-relevant details are front-loaded, and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with one optional parameter and no output schema, the description is complete. It covers the return entries, field meanings, default behavior, workspace behavior, and the right moment to invoke the tool. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the single parameter is 100%, so the baseline is 3. The description adds value by explaining that workspaceId comes from list_workspaces, that membership is required, and what happens when omitted. This goes slightly beyond the schema's own description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('projects'), and precisely defines the output shape as { id, name, editorUrl } entries. It clearly distinguishes this tool from siblings like list_workspaces and list_versions by focusing on project listing, and further clarifies the role of each output field.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: call it when the user asks 'what projects do I have?' or when the user hasn't named a project but you need to operate on one. It also explains the workspaceId alternative and references list_workspaces as the source for workspace IDs, making the decision path clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_versionsAInspect
List every saved version of a project, newest-first. Returns summaries (id, name, timestamp, source, kind, version_number, cp) — not the inner project JSON. kind is "bookmark" (deliberate save, gets a v label, partner-pinnable in the embed) or "auto" (editor auto-snapshot every ~10 mutations, restore-only). version_number is bookmark-only and stable for the lifetime of that version — deletes leave gaps, numbers never re-shuffle. cp names which pages the version changed (comma-joined 8-char page-id prefixes; "*" = page order only; absent = unknown, treat as all pages). Use the returned id (or v<version_number> shorthand) with restore_version / rename_version / delete_version.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project whose versions to list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility and does an excellent job: it reveals the return shape, distinguishes bookmark vs auto versions, explains version_number stability and gaps, and defines the cp field's possible values. This is far beyond a bare 'list versions' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: it front-loads the core purpose, then explains the return fields and their quirks, then directs the agent to downstream operations. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description must fully explain return semantics, and it does: fields, kind differences, version_number behavior, cp meaning, and how to use the results. For a single-parameter listing tool, nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single required parameter projectId is already described as 'Project whose versions to list.' The description adds no new parameter-level detail, but none is really needed given the schema already covers it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: list every saved version of a project, newest-first. It also distinguishes itself by explicitly saying it returns summaries, not the inner project JSON, and names the related restore/rename/delete operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context is provided: this tool lists versions and the returned IDs are meant for use with restore_version, rename_version, and delete_version. It implies the read-only listing use case but does not explicitly say when to prefer it over alternatives like open_project or save_version.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesAInspect
List the workspaces (shared team spaces) the account belongs to, as { id, name, role, memberCount } entries. role is the caller's role in that workspace (owner / admin / editor / viewer) — only owner/admin/editor can add projects. Use the id as the workspaceId argument to create_project, move_project_to_workspace, and list_projects; refer to the workspace by its name when talking to the user (never paste the id). Returns an empty list when the account has no email (workspace membership is email-based, so a keyless/dev identity sees none). Call this to discover a workspace before placing a project into it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries behavioral disclosure. It defines the role field and its permission implication, warns that keyless/dev identities see an empty list due to email-based membership, and instructs the agent to use name for user-facing references and never paste the id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: output shape, role semantics, workspaceId usage, display convention, and the no-email edge case are all included without repetition. The most important action ('List the workspaces...') is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the empty input schema and lack of annotations, the description supplies everything needed to call and use the tool: return shape, role meaning, downstream tools, user-facing display guidance, and an edge-case result. No critical behavior is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There are no parameter semantics to document; the description instead focuses on result semantics, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the workspaces (shared team spaces) the account belongs to,' and enumerates the output fields. It separates workspaces from the sibling list_projects and explains how workspace ids feed other tools, so an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context: 'Call this to discover a workspace before placing a project into it,' and informs downstream use via workspaceId. It does not explicitly state when to prefer a sibling tool or list when-not conditions, so it stops one step short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_caption_linesAInspect
Merge two or more caption lines into one. The earliest line survives with the union window and the time-ordered texts joined by spaces; the others are removed. All lines must share one flavour — every one welded to the SAME clip, or every one standalone — and no other caption line on that track may sit inside the merged span (move or include it first).
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| elementIds | Yes | Two or more caption lines, each "text.<id>". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does so well: it discloses that other lines are removed, which line survives, how texts are ordered, and the union window behavior. It stops short of describing error handling or the return value, but the mutation semantics are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with no filler. The core purpose is front-loaded, and the constraints are presented in the second sentence without unnecessary repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no annotations or output schema, the description gives an agent everything needed to invoke it correctly: input expectations, merge behavior, outcome for non-surviving lines, and track-level preconditions. No critical operational information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful semantic detail beyond the schema, such as the requirement for at least two lines, the time-ordering of joined texts, and the same-clip-or-standalone constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action and resource: merging two or more caption lines into one, with precise behavior ('earliest line survives', 'time-ordered texts joined by spaces', 'others are removed'). It is easily distinguished from sibling tools like split_caption_line or add_caption_track.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context and explicit preconditions: all lines must share the same flavour and no other caption line may sit inside the merged span. It does not name alternatives or explicitly say when not to use this tool, but the conditions are concrete enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_bandAInspect
Place an embedded morpha band on the host timeline: set its TIME ORIGIN (the frame it starts). The band's whole inner reel plays relative to this frame, so its intro animations fire when the band appears instead of at 0:00 (the fix for 'the embedded intro doesn't animate'). Keeps the band's current window length; if it had none, the band spans from start to the composition end. Pass the band group's id (from describe_video — a group with morpha:true).
| Name | Required | Description | Default |
|---|---|---|---|
| start | Yes | Host-timeline frame where the band begins (0-indexed, 30 fps). | |
| bandId | Yes | The embedded band's group id (group.<id> or the bare <id>). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of explaining behavior. It explains that the whole inner reel plays relative to the origin, that the window length is preserved, and what happens when there was no window. It stops short of stating persistence or failure behavior, but the core side effects are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the main action. Each sentence adds an essential detail: what the origin does, why it matters, the edge-case fallback, and where to find the band id. No filler or duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema and no annotations, this is well covered: purpose, behavior, edge case, and param source are all present. The only omissions are minor, such as explicit persistence or error behavior, and they do not block correct selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, giving a baseline of 3. The description adds real meaning: start is the TIME ORIGIN and bandId must be a morpha group id from describe_video, which maps directly to how the tool should be invoked. projectId's role is already covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Place an embedded morpha band on the host timeline' and 'set its TIME ORIGIN'. It immediately distinguishes the operation from generic layer commands like move_layer and add_morpha_layer by scoping it to embedded morpha bands and their start frame.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete context for when to use the tool: it is 'the fix for the embedded intro doesn't animate', and tells the caller to pass a band group id from describe_video where morpha:true. It does not explicitly enumerate exclusions or alternatives, but the usage scenario and prerequisite are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_layerAInspect
Set a layer's static base transform. Writes x/y/w/h/rotation directly on image., video., and shapes.; for group. sets pivotX/pivotY (no width/height/rotation — use add_keyframe for group rotation). Also sets scale and opacity, which every layer kind carries. Note: when a layer has a keyframe track for a property, the track OVERRIDES the static value at every frame — use add_keyframe to animate, move_layer to set the un-animated default. A scale/opacity write over an existing track is REFUSED for that reason; pass clear_animation:true to replace the animation with the static value.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Centre x in the element's OWN frame. At root that is canvas coords (1080 wide); INSIDE A GROUP it is the group's space, so it is not where the layer sits on the canvas. inspect_layers reports both — write back the `x` it gave you, and read `canvas_x` for the on-canvas position. | |
| y | No | Centre y in the element's OWN frame — canvas coords (1920 tall) at root, the group's space inside a group. See `x`. | |
| scale | No | Uniform scale multiplier about the layer's pivot. 1 = natural size. Every layer kind carries it. | |
| width | No | Width in px (must be > 0). | |
| height | No | Height in px (must be > 0). | |
| opacity | No | Layer opacity, 0..1 (values outside are allowed and clamp at paint time). Composes with any ancestor group's opacity. | |
| rotation | No | Rotation in degrees, clockwise. | |
| elementId | Yes | video.<id>, image.<id>, shapes.<id>, or group.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| clear_animation | No | Only meaningful when setting `scale` / `opacity` on a layer where that property is animated. true = the static value REPLACES the keyframe track. Omitted / false = the call is refused rather than writing a value the animation would hide. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does so substantially. It discloses that group layers only receive pivotX/pivotY (not width/height/rotation), that keyframe tracks override static values at every frame, that scale/opacity writes over animated properties are refused, and that clear_animation:true replaces the animation. It does not narrate the response shape or permissions, but no output schema exists and the mutation behavior is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the core action and field list, then narrows scope by layer kind before addressing animation edge cases. The prose is dense but purposeful; the schema already documents each parameter, so the description wisely focuses on cross-field behavior. Slightly long for a first sentence, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description robustly covers the tool's edge cases, group behavior, animation interactions, and coordinate-space pitfall for a 10-parameter mutation tool with no annotations and no output schema. It does not explain the return value or error shape, but with no output schema declared and schema descriptions covering all parameters, the missing bits are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the description need not compensate. It adds some useful framing beyond the schema, such as 'writes ... on image.<id>, video.<id>, and shapes.<id>' and the note about group layers, but most parameter semantics (units, clamping, coordinate spaces) already live in the schema. The description does not significantly deepen parameter understanding beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Set') and a precise resource ('a layer's static base transform') and enumerates exactly which fields are written for which layer kinds. It explicitly contrasts with add_keyframe, so an agent can distinguish move_layer from its sibling animation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use move_layer: to set static/un-animated defaults, and explicitly says to use add_keyframe for group rotation and for animating properties. It also explains the refusal behavior when a keyframe track exists and instructs passing clear_animation:true to replace animation. The in-schema coordinate guidance ('inside a group it is the group's space') clarifies the context for using x/y.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_project_to_workspaceAInspect
Move a project into a workspace, or back to the caller's personal space. Pass workspaceId (from list_workspaces) to place the project in that workspace — every member then sees it, with their workspace role deciding edit vs view. Pass workspaceId: null to detach it back to personal. Requires an edit-capable role (owner/admin/editor) in the TARGET workspace and write access to the project. Switching a project from one workspace to another cleanly drops the old membership.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Id of the project to move. | |
| workspaceId | Yes | Target workspace id (from list_workspaces), or null to move the project back to the caller's personal space. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses permission requirements (edit-capable role in target workspace, write access to project) and a side effect (drops old membership). Since no annotations are provided, this transparency is essential and fully delivered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (four sentences) and front-loaded with the main purpose, followed by usage specifics, permissions, and side effects. Every sentence contributes essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All relevant aspects are covered: what the tool does, how to use it in each case, what happens (including permissions and side effects), and the null scenario. No output schema exists, so return values do not need explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers both parameters with matching descriptions, so the tool description adds minimal extra value. However, it adds the hint to get workspaceId from list_workspaces, which slightly enhances understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Move a project into a workspace, or back to the caller's personal space' – a specific verb and resource, and distinguishes the two modes of operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit instructions for both cases: pass workspaceId to place in workspace, pass null to move to personal. Also references list_workspaces for obtaining IDs, giving clear context on how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_projectAInspect
Get a tappable link that opens a project directly in the editor (the editor loads exactly this project from the URL). Returns { name, editorUrl }. Use this whenever the user wants to view their work — after you make a change, or when they say "show me" / "open it" — then give them the editorUrl and invite them to tap it. Refer to the project by its name in your reply; the link is the tap target.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Id of the project to open. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full transparency burden. It discloses the return shape, the key behavior that the editor loads exactly the given project from the URL, and the expected user-facing follow-through. It does not cover failure cases or side effects, but for a link-generation tool this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose before the usage guidance. Every sentence adds useful information: what the tool returns, when to invoke it, and how to present the result. There is no wasted or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a low-complexity tool with one fully documented parameter and no output schema, so the description must explain the return value itself — which it does. It also provides clear invocation context and user-handling instructions. Nothing needed for correct selection and invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the single parameter projectId is 100%, so the schema already documents what the parameter means. The description does not add extra parameter-level detail beyond the schema, which matches the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Get a tappable link that opens a project directly in the editor." It also states the exact return value, { name, editorUrl }, and explains the distinguishing behavior that the editor loads exactly this project from the URL. This clearly separates it from sibling project tools like list_projects or rename_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit triggers: use it when the user wants to view their work, after making a change, or when they say "show me" / "open it." It also instructs the agent to pass the editorUrl to the user and refer to the project by name. However, it does not mention when not to use it or name any alternative tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reid_projectAInspect
Change a project's id LOSSLESSLY — re-keys its JSON, every saved version, and all assets + clips, then deletes the old id. Unlike create_project (clone), version history is preserved. Enforces the id policy: the new id is always a v4 UUID — pass newId to choose one, or omit to mint a fresh UUID. A project's name (the only user-facing label) is untouched, so the picker/editor are unchanged. The editor won't auto-refresh — reload to see the new id in URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| newId | No | Optional new id — must be a v4 UUID. Omit to mint a fresh UUID automatically. | |
| projectId | Yes | Current id of the project to re-key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: it discloses the destructive deletion of the old id, the lossless re-keying of JSON/versions/assets/clips, the enforced v4 UUID policy, and the editor refresh caveat. This is exemplary transparency for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: the opening sentence states the core action and scope, then the description covers the sibling contrast, UUID policy, user-facing impact, and refresh caveat without padding. Despite its density, it remains scannable and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no annotations and no output schema, this description is exceptionally complete: it explains the effect on all project data, the old id deletion, the ID policy, the parameter behavior, and the post-operation UI caveat. An agent has enough context to call it correctly and anticipate consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% parameter coverage, giving a baseline of 3. The description adds meaningful semantics beyond the schema by explaining the optional newId behavior, the v4 UUID requirement, and the automatic minting when newId is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Change a project's id') and resource, and goes further by stating the lossless re-keying scope and contrasting with create_project. It is unambiguous and distinguishes itself from rename_project by noting the user-facing name is untouched.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by explicitly contrasting with create_project (clone) and noting version history preservation, so an agent understands when reid_project is appropriate. It does not enumerate exclusions or other alternative tools, but the context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_audio_overlayBInspect
Delete an audio overlay by id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Overlay id (e.g. audio_1). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states 'Delete' without disclosing side effects, reversibility, or error conditions. Since no annotations are present, the description carries the full burden of behavioral transparency, which it does not fulfill.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, succinct sentence that conveys the core function without unnecessary words. It is well-structured and immediately understandable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation, the description is adequate in the context of the schema and sibling tools. However, it lacks details about what happens to the project or other overlays, and does not explain the 'audio overlay' concept. Given the absence of annotations, a bit more context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions for both parameters are clear and specific, covering all parameters (100% coverage). The description itself adds no additional parameter information, but the existing schema is sufficient, warranting the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete') and the resource ('audio overlay') with a specific identifier. It is concise and unambiguous, though it does not explicitly distinguish it from similar delete tools beyond the resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool instead of alternatives (e.g., remove_layer, delete_page). It does not mention prerequisites, effects on related entities, or any context for selecting this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_color_keyframeAInspect
Remove the colour keyframe at an exact frame on a fill track. No-op when no track or no matching keyframe exists. Removing the last keyframe drops the track entry.
| Name | Required | Description | Default |
|---|---|---|---|
| frame | Yes | ||
| property | Yes | ||
| elementId | Yes | Element id. The canvas backdrop is the pinned is_background image_layer; 'background.canvas' is accepted as a synonym. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description covers important side effects: no-op when no track or matching keyframe exists, and dropping the track entry when the last keyframe is removed. However, it does not mention any other side effects (e.g., property reset).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no redundant information, effectively communicating purpose and key behaviors.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description provides sufficient behavioral detail for a removal tool, including no-op and last-keyframe effects. It lacks explicit return value or error handling info, but is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% with only elementId and projectId described. The description adds context that frame refers to an exact frame and property is fill, but does not fully compensate for the missing parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool removes a colour keyframe at an exact frame on a fill track, distinguishing it from generic keyframe removers like remove_keyframe and remove_speed_keyframe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context that this is for colour keyframes on fill tracks, and describes no-op behavior and the effect of removing the last keyframe, but does not explicitly mention when to use this over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_embed_originAInspect
Remove one hostname from the project's embed allowlist. Idempotent — removing an entry that isn't present is a no-op. Removing the last entry turns embedding OFF (the public embed endpoint 404s the project).
| Name | Required | Description | Default |
|---|---|---|---|
| origin | Yes | Hostname or URL to remove. Normalized the same way as add_embed_origin before matching. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses two important behaviors beyond the basic remove operation: idempotency (absent entries are a no-op) and the critical side effect that removing the last entry turns embedding OFF and makes the public embed endpoint 404. This is exactly the kind of behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, with the core purpose first, followed by the idempotency guarantee and the critical side effect. Every sentence earns its place; there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with no output schema and no annotations, the description plus schema cover the operation, idempotency, side effects, origin normalization, and project ID provenance. It could be slightly more complete by explicitly routing to set_embed_origins for wholesale allowlist replacement, but nothing essential for calling the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters (origin and projectId) already have detailed descriptions covering normalization, source, and mutation target. The tool description adds no additional parameter-level semantics beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Remove one hostname from the project's embed allowlist.' This clearly distinguishes the tool from sibling tools like add_embed_origin and set_embed_origins. The scope and target are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage—use this when you need to remove one hostname from the allowlist—and adds useful idempotency context. However, it does not explicitly mention alternatives like set_embed_origins for replacing the entire allowlist, or add_embed_origin for adding entries. Guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_collectionAInspect
Remove a layer from the user's Collection so it's no longer offered for reuse. Pass the element id that was added with add_to_collection. Copies already placed in other projects are unaffected (they're self-contained). No-op if the id isn't in the collection.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | The element id to remove from the Collection. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It states that the operation removes from the collection, that placed copies remain unaffected because they are self-contained, and that it is a no-op for missing ids. This is strong transparency for a simple mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with the primary purpose front-loaded. Every sentence earns its place: purpose, parameter guidance, side-effect clarification, and edge-case behavior. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and no annotations, the description plus schema fully covers what an agent needs: what the tool does, what it doesn't affect, how to supply the id, and what happens on a no-op. No critical behavior is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both elementId and projectId. The description adds useful context that the element id must be the one used with add_to_collection, but it doesn't substantially expand parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it removes a layer from the user's Collection so it is no longer offered for reuse. This clearly differentiates it from sibling tools like remove_layer, which targets project layers, and directly relates it to add_to_collection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool: remove an element previously added via add_to_collection. It also explains that copies in other projects are unaffected and that the operation is a no-op if the id is absent. While it doesn't explicitly name alternatives like remove_layer, the collection-specific framing makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_keyframeBInspect
Remove the keyframe at frame N on a layer's track. Removing the last keyframe from a track restores the layer's static base value across the timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| frame | Yes | ||
| property | Yes | ||
| elementId | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It adds useful context by explaining that removing the last keyframe restores the static base value across the timeline, and 'remove' conveys destruction. However, it does not describe error behavior when no keyframe exists at the given frame, irreversibility details, or what the tool returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: the first sentence states the core operation, and the second adds a valuable behavioral consequence without any wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature, four required parameters, no annotations, and no output schema, the description covers the essential operation and one key behavior. It remains incomplete by not explaining what happens if there is no keyframe at frame N and by not clarifying how it differs from the specialized keyframe-removal siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, so the description must compensate. It clarifies that frame refers to a keyframe position and that the operation targets a layer's track, but it leaves elementId implicit and does not elaborate on the property parameter beyond the schema's enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: remove a keyframe at a frame on a layer's track. It is clear about what the tool does, though it does not explicitly differentiate from sibling tools like remove_color_keyframe or remove_speed_keyframe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus remove_color_keyframe, remove_speed_keyframe, add_keyframe, or set_keyframes_batch. The note about the last keyframe is a behavioral consequence, not an explicit usage condition or alternative selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_layerAInspect
Delete a video, image, text, or shape LEAF layer. Errors on a group. (dissolve it with ungroup_layers instead) and on a pinned layer such as the canvas backdrop. Deleting a video layer also takes everything welded to that clip: its welded audio overlay(s) and its welded caption lines, both of which derive their timing from the clip's trim and have no meaning without it.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | video.<id>, image.<id>, text.<id>, or shapes.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the side effect of deleting a video layer: it removes welded audio overlays and caption lines. It also mentions the errors on group and pinned layers. Since no annotations are provided, this full behavioral disclosure is essential and covers the key consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. All information is relevant and directly supports tool selection and usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deletion operation, the description covers the main action, the applicable scope, the error cases, and the side effects. No output schema exists, so return-value documentation is not required. The description is complete enough for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage for parameters (elementId and projectId with descriptions). The description does not add any extra parameter-specific guidance, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete a leaf layer) and explicitly distinguishes it from sibling tools like delete_page or delete_project. It also notes the constraints (leaf only, errors on group and pinned layers) and points to ungroup_layers as an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use (leaf layers) and when not to (group or pinned layers), and even names the alternative tool (ungroup_layers). This leaves no ambiguity about the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_speed_keyframeAInspect
Remove the speed-ramp keyframe at frame (a PROJECT-timeline frame — the same value add_speed_keyframe and inspect_layers report) on a video layer. Removing the last keyframe clears the speed_keyframes array entirely (restoring 1× playback).
| Name | Required | Description | Default |
|---|---|---|---|
| frame | Yes | Project-timeline frame number. | |
| elementId | Yes | video.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose a non-obvious side effect: 'Removing the last keyframe clears the speed_keyframes array entirely (restoring 1× playback).' It also clarifies the frame coordinate system to prevent off-by-one mistakes. It does not cover error behavior when no keyframe exists at the given frame, but the main destructive consequence is made transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two focused sentences with the action and object front-loaded. The parenthetical about frame alignment and the final side-effect sentence both earn their place; there is no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-required-parameter mutation tool with no annotations and no output schema, the description is largely complete: it defines the frame context, links it to related tools, and warns about the last-keyframe behavior. The remaining gap is unspecified behavior when no keyframe exists at the given frame, but the essential invocation details are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters (100% coverage), so the baseline is 3. The description adds only marginal semantic value by reinforcing that `frame` uses the same project-timeline coordinate system as related tools, but it does not substantially expand on the schema's parameter explanations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Remove the speed-ramp keyframe at `frame` ... on a video layer.' It distinguishes itself from generic keyframe removers by specifying the speed-ramp keyframe category and cross-referencing add_speed_keyframe and inspect_layers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides useful context by noting that `frame` is 'the same value add_speed_keyframe and inspect_layers report,' and it implies the tool is for speed-ramp keyframes on video layers. However, it does not explicitly name alternative removal tools or state when not to use them, so usage guidance is mostly implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_groupAInspect
Rename a group. Pure cosmetic — labels appear in the Inspector and describe_video output.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| groupId | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. 'Pure cosmetic' and 'labels appear in the Inspector and describe_video output' effectively communicate the side effect and exclude structural/positional changes. It still does not cover authentication or reversibility, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. It front-loads the operation and then adds a valuable behavioral qualification, so every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the purpose/effect are well conveyed. However, with no annotations and no output schema, the description should help more with the required inputs, especially groupId which is opaque and has no source reference such as inspect_layers or group_layers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only describes projectId; groupId and name have no property descriptions, and the description does not sufficiently compensate. The label/Inspector statement indirectly clarifies the meaning of name, but the required groupId is left entirely unexplained, which is a real gap for a required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a concrete verb and resource: 'Rename a group' and immediately qualifies the consequence: only the label changes and it appears in the Inspector and describe_video output. This strongly distinguishes it from group geometry/behavior tools such as set_group_box and set_group_parent, and from rename_layer or rename_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by stating the operation is purely cosmetic, so an agent can infer it is appropriate only when the group label itself needs changing. It does not explicitly name alternative tools or state when not to use this tool, so it falls just short of full usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_layerAInspect
Set the human-readable name of a video / image / shape / text layer — the label shown in the Inspector, and the basis for the layer's auto-derived embed attribute (so renaming a layer to "caption" makes the embed attribute caption). Pass an empty string to clear the name. For groups use rename_group.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New label. Empty string clears it (callers fall back to the filename stem). | |
| elementId | Yes | video.<id>, image.<id>, shapes.<id>, or text.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it does so well: it discloses the mutation target, the Inspector-label effect, the embed-attribute side effect, and the empty-string clearing behavior. It stops short of mentioning permissions, undo behavior, or what happens to existing embed references after a rename, but for a simple setter operation this is a reasonable level of transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler: it front-loads the core operation, then adds the two most decision-relevant clarifications (embed-attribute derivation and the group alternative). Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with no annotations and no output schema, the description is complete enough to call correctly: it defines the operation, scope, side effect, clearing behavior, and the sibling to use for groups. The schema documents all parameter formats, and the description adds the behavioral context needed for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds extra meaning beyond the schema: it explains that the name is the Inspector label and that it drives the `<morpha-video>` embed attribute, with a concrete example. It also reinforces the elementId layer-type pattern, though projectId semantics are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Set') and resource ('human-readable name of a video / image / shape / text layer'), and clarifies the practical meaning of the label via the Inspector and the auto-derived embed attribute. It also explicitly differentiates the tool from rename_group, so an agent can identify the correct operation without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says exactly when this tool applies: renaming video, image, shape, or text layers, and explicitly routes group renaming to rename_group. It also gives a concrete use-case example ('renaming a layer to "caption" makes the embed attribute `caption`'), making the selection criteria unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_projectAInspect
Update a project's human-readable name (shown in the editor's project picker). Pass an empty string to clear the name and fall back to the id. Doesn't touch any layers, animations, or styles — only the picker label.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New human-readable label. Empty string clears the name and reverts to the id fallback. | |
| projectId | Yes | Project to rename. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses the exact scope of the mutation ('only the picker label') and the special empty-string behavior, but does not mention return values, errors, or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences immediately convey the action, the special case, and the non-effect on other project aspects. No wasted or redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple rename operation with only two parameters and no output schema, the description provides sufficient context about behavior, fallback, and scope. It lacks explicit error/return details, but these are not critical for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters with descriptions, including the empty-string behavior. The description adds minimal extra meaning beyond reinforcing the 'picker label' scope, so the baseline for high schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('project's human-readable name'), and clearly distinguishes from sibling tools like rename_group, rename_layer, and rename_version by targeting only the project picker label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use the tool, including the empty-string fallback behavior and an explicit statement that it does not affect layers, animations, or styles. Does not explicitly contrast with reid_project, but the scoping is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_versionAInspect
Rename a saved version's human-readable label (what the user sees in the picker). The v<N> partner-facing identifier is unaffected — only the display name changes. Accepts the version's UUID id or the v<N> shorthand. Empty / whitespace-only names are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New human-readable label. Must be a non-empty string. | |
| projectId | Yes | Project whose version to rename. | |
| versionId | Yes | Version to rename. UUID `id` or `v<N>` shorthand. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It clearly states that only the display name changes, the v<N> identifier is unaffected, both UUID and v<N> are accepted, and empty/whitespace-only names are rejected. It does not mention permissions or response behavior, but the core side effects and validation are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences each earn their place: one states the operation, one clarifies what is not changed, and one defines accepted inputs and validation. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward rename operation with fully documented parameters, the description provides sufficient operational context: target, side effects, accepted identifier forms, and validation constraints. Since there is no output schema, a brief note on the result is missing but not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra value by reinforcing the accepted versionId forms and introducing the whitespace-only rejection detail, which is more specific than the schema's 'non-empty string' constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact action ('Rename'), the target resource ('a saved version's human-readable label'), and what the user sees. It also distinguishes itself from sibling rename_* tools and version-management tools by clarifying that the v<N> identifier is unaffected, so an agent can select it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear from the first sentence: when you need to change the display label of a saved version in the picker. The description does not explicitly name alternatives or state when not to use it, but the scope is specific enough that no competing sibling tool is ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_layerAInspect
Move a layer within its parent's siblings. newIndex is 0-based among siblings (root list when ungrouped, or the parent group's children when nested). 0 = bottom of that subtree; last = top.
| Name | Required | Description | Default |
|---|---|---|---|
| newIndex | Yes | 0-based index among siblings of the same parent. | |
| elementId | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It credibly conveys the non-obvious behavior: newIndex direction (0 = bottom, last = top), the subtree scope, and the root-vs-nested parent contexts. It stops short of disclosing edge cases such as out-of-range or negative newIndex, or what happens when newIndex equals the current position.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with zero filler; the purpose is front-loaded in the first clause and the index semantics follow immediately. Every sentence carries operational information that an agent needs before invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with no output schema, the description covers the call-enabling essentials: indexing base, direction, and parent scope. It would be more complete if it explicitly named move_layer as the tool for cross-parent moves and stated behavior for invalid indices, but such gaps are secondary given the simplicity of the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: newIndex and projectId are documented while elementId is bare in the schema. The description adds genuine value for newIndex by mapping values to z-order positions (bottom/top) and explaining the ungrouped-vs-nested parent scope, going beyond the schema's single line. elementId is the only gap, but it is inferable from the tool name and context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb–resource pair ('Move a layer') and immediately scopes it to reordering within the current parent ('within its parent's siblings'), which distinguishes it from cross-parent moves like the sibling move_layer. It also makes the ordering semantics unambiguous: 0-based, 0 = bottom, last = top.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than explicit: the description explains the two indexing contexts (ungrouped root list vs nested group children) but never states when to prefer reorder_layer over the near-duplicate sibling move_layer. In a sibling list of 95+ tools, the absence of any explicit when-to-use or when-not-to-use guidance leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_pagesAInspect
Move a page from from_index to to_index. The remaining pages shift to fill the gap; active_index is rewritten so it keeps pointing at the same page it did before the move. Fails on out-of-range indices.
| Name | Required | Description | Default |
|---|---|---|---|
| to_index | Yes | 0-based destination index for the page. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| from_index | Yes | 0-based index of the page to move. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, and it does so well. It explains that remaining pages shift, that active_index is rewritten to keep pointing at the same page, and that out-of-range indices cause failure. These are non-obvious side effects and error semantics that the schema alone does not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences deliver the operation, side effects, and failure mode without repetition or filler. The core action is front-loaded, and every sentence adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple reorder operation with three fully documented parameters and no output schema, the description is complete. It covers the move, the resulting list shift, the active_index behavior, and error conditions, so an agent has enough context to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The description references `from_index` and `to_index` in prose, but the schema already documents that they are 0-based indices. The description adds no new parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Move a page from `from_index` to `to_index`.' The resource is unambiguously a page, which distinguishes it from sibling tools like reorder_layer or move_band. It also names the two indices involved, leaving no ambiguity about what operation the tool performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this when a page needs to be reordered. However, the description does not explicitly name alternatives or state when not to use it, so the agent must infer the choice from the page-specific wording rather than receiving direct routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_versionAInspect
Load a saved version over the live project. Accepts either the version's UUID id or the v<N> shorthand (e.g. "v6" finds the bookmark with version_number=6); auto-snapshots are addressable by UUID only. Without page_index this replaces the ENTIRE project (every page) — an auto checkpoint named before restore: … is saved first whenever the current state has unsaved changes, so the overwritten state stays recoverable. With page_index it restores ONLY that page: the page is matched across versions by its stable id and replaced verbatim (canvas size and name included); other pages are untouched and the write is compare-and-swapped against concurrent edits. Errors if the version predates that page — restore the whole version instead. A restored page may reference assets deleted since the snapshot; those render as missing. An open editor reconciles the result into the live project within a few seconds — no refresh needed.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project to restore into. | |
| versionId | Yes | Version to restore. UUID `id` or `v<N>` shorthand (partner-facing bookmark number). | |
| page_index | No | Optional. 0-based index into the project's CURRENT pages (same indexing as select_page / delete_page). Restores only that page from the version; omit to restore the whole project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so thoroughly. It explains the auto-snapshot safety net, compare-and-swap concurrency handling, the error case, missing-asset rendering, and editor reconciliation. This is exemplary transparency for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence delivers operationally relevant information. The primary action is front-loaded, and the page_index distinction, safety checkpoint, concurrency guarantee, error condition, and reconciliation behavior are each covered without redundancy. The density is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive restore operation with no output schema and no annotations, this description is remarkably complete. It covers scope of effect, recoverability, concurrency, failure modes, post-restore asset issues, and live-editor behavior. There is no major gap that would leave an agent uncertain about how to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description significantly expands on parameter meaning. It clarifies that versionId accepts either a UUID or v<N> shorthand, that auto-snapshots are UUID-only, and that page_index uses stable page matching rather than positional matching across versions. These semantics are not inferable from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Load a saved version over the live project.' It clearly distinguishes between restoring the entire project versus a single page, and the sibling set (save_version, list_versions, delete_version, rename_version) makes the action unambiguous. The two modes are both accurately captured.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives detailed when-to-use guidance for the page_index parameter: omit it to replace the whole project, include it to restore only that page. It also explains the error condition for versions that predate a page and advises restoring the whole version instead. It does not explicitly contrast this tool with sibling alternatives, but the behavioral guidance within the tool is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
safe_zonesAInspect
Return horizontal 'safe band' y-ranges of the canvas where a clip's burned-in video text (subtitles, lower thirds, titles) does NOT appear, plus the inverse 'text bands' (where it does). Reads the OCR cache built at clip-upload time (see detect_text_regions). Coordinates returned in BOTH source pixels and CANVAS pixels — canvas coords already account for the video layer's fit/anchor/position. Use to lay out captions, titles, callouts so they never collide with the video's own text. Returns { ok: true, status: 'ready' | 'not-ready', data: { bands, safeBands, textBands } }.
| Name | Required | Description | Default |
|---|---|---|---|
| clip | Yes | Clip filename (video.<id>.clip). | |
| projectId | Yes | ||
| bandHeight | No | Vertical granularity in source pixels (default 32). | |
| minConfidence | No | OCR confidence floor (0–100) for considering a text region (default 70). | |
| occupancyThreshold | No | Fraction of frames that must contain text in a band to mark it occupied (default 0.10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explains that the tool reads a cache built at upload time, returns source and canvas pixel coordinates, and exposes a 'ready' | 'not-ready' status that hints at cache availability. It does not explicitly say it is side-effect free, but the read-oriented language and cache source strongly imply it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description earns its place: purpose, data source, coordinate behavior, use case, and return shape are all covered without redundancy. The most important information is front-loaded, and the return structure is compactly summarized at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by stating the return shape and the two possible statuses, which is critical for callers. It also clarifies the coordinate-space behavior that would otherwise be ambiguous. The 'bands' field is mentioned but not fully explained, leaving a small gap, so it falls just short of a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents most parameters. The description adds context about coordinate systems and the meaning of bands, but it does not add significant per-parameter semantics beyond what the schema provides. This aligns with the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns horizontal 'safe band' y-ranges and inverse 'text bands', making the resource and output explicit. It also distinguishes itself from the related detect_text_regions tool by framing this as a layout-oriented read operation on the OCR cache.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete use case: 'Use to lay out captions, titles, callouts so they never collide with the video's own text.' It references detect_text_regions as the source of the OCR cache, which implies when that tool matters, though it does not explicitly state when not to use safe_zones or exhaustively list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_versionAInspect
Save a version of the current project state. ALWAYS call this once after each meaningful set of changes you make on the user's behalf — the user flicks between versions to compare or roll back, so an unsaved edit is one they can't easily revisit. Use a short descriptive name (e.g. "add slide-in animation"); the user sees this verbatim in the picker. One version per logical change-set, not one per individual tool call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Short label describing what this set of changes accomplished. Defaults to a timestamp if omitted, but a description is much more useful to the user. | |
| projectId | Yes | Project to save a version of (filename stem). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the operation creates a save point, explains the user-facing picker behavior ('user sees this verbatim'), and highlights the importance of saving for rollback/comparison. It does not mention side effects like overwriting or failure conditions, but for a save operation these are minor omissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: the purpose is front-loaded, the usage rule follows, and naming guidance comes last. It is compact, well-ordered, and free of filler, achieving high information density without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple save operation with two parameters and no output schema, the description is remarkably complete. It covers when to use, how to name, why it matters, and the appropriate frequency. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds meaningful value by explaining the `name` parameter's user-visible role in the picker and recommending short descriptive labels, while also noting the timestamp default. This goes beyond the schema's plain 'short label' definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('save') and resource ('a version of the current project state'), and its role in the versioning workflow is unambiguous. It distinguishes itself from sibling tools like list_versions or restore_version by focusing on the creation of a version, not retrieval or restoration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit, prescriptive guidance: ALWAYS call after each meaningful set of changes, and specifically states 'not one per individual tool call.' It also gives a naming convention and explains the user-facing consequence, making the trigger condition and granularity crystal clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_pageAInspect
Switch which page is ACTIVE — the page the content tools target. Subsequent describe_video / inspect_layers / all content tools read and write this page until the active page changes again. Pages are addressed by 0-based index from describe_video's pages block. Selecting the already-active page is a harmless no-op; fails on an out-of-range index.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | 0-based index of the page to make active. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It discloses the no-op behavior for the already-active page, the failure mode for out-of-range indices, and the persistent effect of changing the target for subsequent content tools. It does not mention side effects beyond the active-page change, but that appears to be the complete behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, well-organized, and front-loads the core purpose in the first sentence. It then explains the scope of effect, addressing mechanism, and edge cases in a few dense sentences without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description fully covers what an agent needs: what the tool does, what page indices mean, how to obtain project ID, and the edge-case behaviors. There is no missing context that would prevent correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description reinforces that 'index' is 0-based and references describe_video's pages block, adding helpful context for deriving the index. It does not deeply elaborate on projectId because the schema already explains its role and origin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Switch which page is ACTIVE') and specifies that it targets the page that content tools read and write. It distinguishes itself by explaining the active-page mechanism, which is unique among siblings like add_page and delete_page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (to change the target of subsequent content tools) and provides useful conditions: selecting an already-active page is a no-op, and out-of-range indices fail. It does not explicitly name alternative tools, but none are directly alternatives because this is the only page-selection tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_canvas_sizeAInspect
Resize the ACTIVE page's canvas to width × height pixels. The composition is scaled UNIFORMLY to fit the new frame (a single factor s = min(newW/oldW, newH/oldH), so nothing distorts — a circle stays a circle) and then re-centred so the old composition centre maps to the new canvas centre. Every layer's position, size, group pivots, and x/y/width/height keyframes follow this fit+recentre; same-aspect resizes scale exactly, aspect changes letterbox the content centred. Each page owns its size, so this leaves sibling pages untouched — select_page then set_canvas_size again to resize another one. Common sizes: 1080×1920 (9:16 Reels/TikTok/Shorts), 1080×1350 (4:5 Instagram), 1080×1080 (1:1 square), 1920×1080 (16:9 YouTube).
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Canvas width in px (positive integer). | |
| height | Yes | Canvas height in px (positive integer). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing side effects. It does so thoroughly: uniform scaling via a single factor (min(newW/oldW, newH/oldH)), preservation of proportions, recentring, propagation to layer positions/sizes/group pivots/keyframes, and letterboxing on aspect change. This level of behavioral detail is exceptional and beyond what any annotation block would typically provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries distinct, high-value information: core action, scaling method, recentring, layer/keyframe consequences, sibling-page isolation, and common presets. The most operationally important detail ('ACTIVE page') is front-loaded. There is no filler or redundancy; the length is justified by the tool's genuine complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully self-contained for an agent to call correctly: it explains what happens to the canvas, layers, keyframes, sibling pages, and even gives the select_page workflow. Since no output schema is present, the description appropriately focuses on invocation and side effects rather than return values. Nothing an agent needs to know to use this tool safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameter descriptions are already clear. The description adds value by linking width/height to real-world presets (1080×1920 for Reels/TikTok/Shorts, etc.) and by clarifying that width/height refer to the resulting canvas after uniform scaling. The 'ACTIVE page' context is also critical for projectId semantics, even though the schema independently says projectId selects the existing project.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource pair: 'Resize the ACTIVE page's canvas to width × height pixels.' It distinguishes itself from siblings by emphasizing 'ACTIVE page' and by focusing specifically on canvas resizing, none of the sibling set_* tools cover this exact operation. The scope and expected effect are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains the per-page ownership: 'Each page owns its size, so this leaves sibling pages untouched — select_page then set_canvas_size again to resize another one.' This tells the agent not only when to use the tool but the exact prerequisite workflow for applying it to multiple pages. It also provides common size presets mapped to platforms, which gives practical usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_clip_speedAInspect
Play a clip slower or faster at a CONSTANT rate — the normal way to retime a clip. 1 = source speed, 0.5 = half speed, 2 = double speed; range [0.1, 8]. The trim is unchanged, so the clip's length on the timeline changes to suit: at 0.5x it occupies twice as many frames, at 2x half as many. Audio is time-stretched with pitch preserved. Use add_speed_keyframe instead only when the rate must CHANGE over the clip (a ramp).
| Name | Required | Description | Default |
|---|---|---|---|
| speed | Yes | Constant playback rate (1 = source speed, 0.5 = half, 2 = double), in [0.1, 8]. | |
| elementId | Yes | video.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key behaviors: constant-rate retiming, trim unchanged, timeline length changes in proportion to speed, and audio time-stretched with pitch preserved. These are behavioral consequences beyond what the schema or annotations would convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the core purpose, and each clause earns its place: purpose, speed scale+range, behavioral consequence, alternative tool. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple constant-rate mutation tool with no output schema and no annotations, the description is complete: it covers the action, the parameter's effect, side-effects on trim and length, audio handling, and sibling differentiation. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning to the speed parameter by explaining that 0.5x doubles the clip's timeline length and 2x halves it, and that speed is interpreted as a constant factor. This goes beyond the schema's bare 'constant playback rate' description, helping an agent choose appropriate values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact action ('Play a clip slower or faster at a CONSTANT rate'), names the resource ('a clip'), and clearly distinguishes itself from sibling add_speed_keyframe, which is for changing rate. This is a specific verb+resource with explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says this is 'the normal way to retime a clip' and provides a concrete alternative condition: 'Use add_speed_keyframe instead only when the rate must CHANGE over the clip (a ramp).' This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_custom_fontAInspect
Register a typeface Morpha does NOT ship, so text layers can use it by family name via font_family (exactly like a built-in family). Families already in the built-in catalogs (anything list_fonts returns from google/bunny/fontshare/fontsource/velvetyne) are REJECTED — they need no registration; just set font_family to them directly. src is EITHER a full URL (https://…) OR a font file already uploaded to the project's asset bucket (POST /api/upload-asset/, raw bytes + X-Filename header; .woff2/.woff/.ttf/.otf). Like add_image_layer, this does NOT verify an uploaded filename exists. Dedupes by family+weight+style, replacing a matching face. After registering, set a text layer's font_family to this family (add_text_layer / set_layer_text). NOTE: a pasted URL only loads if that host sends permissive CORS headers — uploading the font (served same-origin) is the robust path.
| Name | Required | Description | Default |
|---|---|---|---|
| src | Yes | A full font URL (https://…/font.woff2) OR an uploaded asset filename in the project's bucket. | |
| style | No | Optional face style. Defaults to normal. | |
| family | Yes | Family name text layers will reference via font_family, e.g. "Mylius Modern". | |
| weight | No | Optional specific weight (1-1000) this src provides. Omit for the 400/normal baseline. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: it discloses rejection of built-in families, the deduplication/replacement behavior by family+weight+style, the lack of verification that an uploaded filename exists, and the CORS limitation for pasted URLs. These are meaningful behavioral traits beyond what the schema alone reveals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, rejection rule, src formats, caveats, dedupe behavior, and follow-up usage. It is front-loaded with the core purpose and never wastes words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 5 parameters and no output schema, the description covers prerequisites, input alternatives, behavioral side effects, failure-prone scenarios (CORS, unverified filenames), and post-registration usage. An agent has enough to select and invoke this tool correctly without needing additional external context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema description coverage is 100%, the description adds critical semantics beyond it: src is elaborated as either a full URL or an uploaded asset with upload endpoint details, family is tied to how text layers reference it, and weight/style are implied in the dedupe-by-family+weight+style behavior. This materially enriches parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Register a typeface Morpha does NOT ship, so text layers can use it by family name via font_family.' It clearly differentiates this from simply setting a font_family on built-in fonts, and the distinction from list_fonts is implicit in the rejection of built-in catalog families.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: for typefaces Morpha does not ship, and when not to: built-in catalog families are rejected and should be referenced directly via font_family. It also names the follow-up actions (add_text_layer / set_layer_text), the alternative upload path, and the CORS caveat that makes upload the robust choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_durationAInspect
Author an EXPLICIT composition length in seconds, pinning it (duration_authored=true) so the auto-fit no longer drives it. Morpha normally DERIVES the comp length from content (the furthest keyframe / video window / audio end); this overrides that with a fixed length — the stage becomes a fixed canvas you author into, and content past the end is kept but not played or exported. Clamped to [1, 600] s. Use it to shorten a comp to a target length (e.g. a 15-second cut) or to reserve a longer stage than the current content fills. Call fit_duration_to_content to release the pin.
| Name | Required | Description | Default |
|---|---|---|---|
| seconds | Yes | Composition length in seconds (clamped to 1..600). 30 fps; durationInFrames = ceil(seconds*30). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers richly: it discloses the pinning behavior (duration_authored=true), the override of derived duration, the fixed-canvas effect, clipping semantics, clamping to 1..600 seconds, and the release path. This is far beyond what the schema or annotations alone would convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is substantial but every sentence earns its place: it states the core action up front, explains the default behavior being overridden, describes edge-case consequences, gives concrete use cases, and names the sibling that undoes the action. No filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-changing tool with no annotations and no output schema, this description is complete: it defines the operation, the behavioral change, the clamping constraints, the effect on playback/export, and how to reverse it. An agent has everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already well documented in the input schema, including clamping and frame-rate calculation. The description adds context about the effect of the seconds value but does not need to repeat parameter details; a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: author an explicit composition length in seconds. It clearly differentiates from the default auto-fit behavior and names the sibling fit_duration_to_content, so an agent can distinguish it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it—to shorten a comp to a target length or reserve a longer stage—and tells the agent to call fit_duration_to_content to release the pin. It also explains the consequence of content past the end being kept but not played/exported, giving clear decision context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_embed_originsAInspect
Replace the project's embed allowlist — the hostnames permitted to load this project through the public embed. Pass the full desired list; it overwrites the previous one. An empty array turns embedding OFF (the public embed endpoint 404s the project). Each entry is normalized to a bare lowercased hostname (scheme, port, and path stripped, e.g. "https://example.com/x" → "example.com"); duplicates are dropped.
| Name | Required | Description | Default |
|---|---|---|---|
| origins | Yes | Full desired allowlist. Each entry may be a bare hostname or a URL; it is normalized to a bare lowercased hostname. Empty array disables embedding. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full transparency burden and meets it: it discloses overwrite semantics, the disabling effect of an empty array, case normalization, scheme/port/path stripping, and duplicate removal. This is strong behavioral detail beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each earning its place: purpose, full-list behavior, empty-array behavior, and normalization rules. No redundant restatement of schema fields or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and no annotations, the description is complete: the agent knows what to pass, what happens on call, and both important edge cases. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters fully, so the baseline is 3. The description adds real value by explaining normalization mechanics, duplicate dropping, and the effect of an empty array, going beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Replace') and resource (the project's embed allowlist) and clearly defines what the allowlist controls. It is immediately distinguishable from incremental sibling tools like add_embed_origin and remove_embed_origin because it emphasizes full-list replacement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says the caller must pass the full desired list and that the call overwrites the previous allowlist, and it gives guidance for the empty-array edge case. It does not explicitly name add_embed_origin/remove_embed_origin as alternatives for incremental edits, but that distinction is inferable from the described overwrite behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_boxAInspect
Set a group's backdrop rect size. The rect is centred on (pivotX, pivotY) in group-local space and transforms with the group. Either dimension at 0 hides the backdrop entirely.
| Name | Required | Description | Default |
|---|---|---|---|
| box_width | Yes | Backdrop width in px (non-negative). | |
| elementId | Yes | group.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| box_height | Yes | Backdrop height in px (non-negative). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the rect is centred on (pivotX, pivotY), transforms with the group, and hides when either dimension is 0. This provides useful context about the behavior beyond the simple set operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, concise, and free of unnecessary details. It directly states the operation and key geometric behaviors.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides sufficient context for an agent to understand the tool's effect, including the coordinate system and edge case for zero dimensions. No output schema exists, so no return value explanation is needed. However, it lacks guidance on when to use it relative to similar tools, which is minor given its simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all four parameters with descriptions. The tool description does not add additional meaning to the parameters beyond referencing the centering and hiding behavior, which is more about the tool's effect than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sets a group's backdrop rect size, specifying the resource (group) and the property (backdrop rect size). It also clarifies the centering and transformation behavior, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus alternatives like set_group_window or set_pivot. It only states what it does, leaving the agent to infer when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_parentAInspect
Move an element into a group (or out to root). Refuses to place a group inside its own descendants.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based insert position among the new parent's children. Defaults to end. | |
| elementId | Yes | Full element id: video.<id>, image.<id>, shapes.<id>, or group.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| parentGroupId | Yes | Bare group id of the new parent, or null to move to root. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and it adds a meaningful invariant: it refuses to place a group inside its own descendants. It also signals this is a mutating operation, though it does not discuss other failure modes or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The primary action is front-loaded and the important cycle-safety caveat is stated immediately after.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity mutation with fully documented parameters, the description covers the operation, the root-detach option, and the key safety guard. It does not need to explain return values because there is no output schema, though it omits explicit alternative-selection guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description adds little beyond the schema, only echoing the null-to-root behavior encoded in parentGroupId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise operation: move an element into a group or detach it to root. The resource (element/group hierarchy) is clear and the behavior is distinct from related sibling tools like group_layers or reorder_layer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when reparenting an element, but it does not explicitly contrast with siblings such as move_layer, reorder_layer, group_layers, or ungroup_layers, nor does it state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_windowAInspect
TRIM a group's own visible window — the [start, start+duration) range over which the group and its subtree are drawn. The contents are NOT moved or deleted: this clips what is shown, so use it to hide the head or tail of a whole section. Writing a window overrides the group's derived contents-hull from then on. Two safety corrections apply automatically: the group's OWN keyframes are compensated for the change in start so its animation doesn't jump (reported as keyframesCompensatedBy), and the duration is grown if needed so the window can never hide one of the group's own authored keyframes (reported as grownToCoverKeyframes). To MOVE the group and its contents instead, use shift_group.
| Name | Required | Description | Default |
|---|---|---|---|
| start | Yes | First frame the group is drawn on, in its parent timeline (0-indexed, 30 fps). | |
| duration | Yes | How many frames the group stays drawn for (≥ 1). Grown automatically if it would hide the group's own keyframes. | |
| elementId | Yes | The group's id (group.<id> or the bare <id>). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses that contents are not mutated, that writing a window overrides the derived contents-hull, and that two safety corrections (keyframesCompensatedBy and grownToCoverKeyframes) happen automatically. It also names the reported fields despite the lack of an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but every sentence earns its place: it front-loads the core action, explains what it does not do, states the intended use, describes automatic safety behavior, and points to the relevant sibling. No filler or repetition is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, this description is unusually complete. It explains the behavioral effect, the safety corrections, the reported fields, and the main alternative. The agent has enough context to call it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for all four parameters, so the baseline is 3. The description adds meaningful semantics beyond the schema by explaining how start and duration define a visible window, how duration can be grown to avoid hiding keyframes, and how start changes trigger keyframe compensation. This enriches the agent's understanding without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'TRIM a group's own visible window' with an explicit range definition. It distinguishes this tool from shift_group by clarifying that contents are NOT moved or deleted, making its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use this tool: 'use it to hide the head or tail of a whole section.' It explicitly names the alternative for moving contents: 'To MOVE the group and its contents instead, use shift_group.' This gives the agent actionable selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_image_filenameAInspect
Repoint an existing image layer at a different uploaded asset — keeps the layer's id, position, size, animations, and styles; only the bitmap changes. The asset must already exist at users//assets// (uploaded via the editor's drag-drop, or POST /api/upload-asset/ with the raw bytes and an X-Filename header). Use this to swap a layer's image WITHOUT losing its keyframes — remove_layer + add_image_layer would mint a new id and drop the animations.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Asset filename in the project's assets bucket, e.g. drake.png. | |
| elementId | Yes | Image layer id, image.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states that the tool mutates an existing layer, only changes the bitmap, preserves other layer properties, and does not upload the asset itself. It also warns about the downside of the alternative approach, giving an agent a realistic model of the tool's effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The core behavior is front-loaded, followed by the prerequisite and then the use-case comparison. Every sentence adds necessary information for correct selection and invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity, lack of annotations, and absence of an output schema, the description is nearly complete. It covers the operation, the preservation semantics, the asset prerequisite, and why the alternative is inferior. It does not describe the response/return value or error behavior when the asset is missing, but this is a minor gap for a focused mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful context beyond the schema: it explains the asset path structure (users/<userId>/assets/<projectId>/<filename>), clarifies that projectId selects which existing project is mutated, and ties filename to an already-uploaded asset. This goes beyond simply restating parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Repoint') and resource ('an existing image layer at a different uploaded asset'), and clearly distinguishes the operation from sibling tools like add_image_layer and upload_image. It also explains what is preserved (id, position, size, animations, styles), so an agent can precisely understand the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: to swap a layer's image without losing keyframes. It names the alternative (remove_layer + add_image_layer) and explains why that alternative is worse because it would mint a new id and drop animations. It also provides the prerequisite that the asset must already exist and tells how it could have been uploaded.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_keyframes_batchAInspect
Add or overwrite MANY keyframes across MANY layers in ONE call — functionally equivalent to N add_keyframe calls but with one HTTP/MCP round-trip. Pass an array of entries; each entry has the same fields as add_keyframe. Validated atomically: any invalid entry rejects the whole batch. Use this whenever you'd call add_keyframe more than a couple of times (rippling grids, twinkling starfields, staggered text reveals).
| Name | Required | Description | Default |
|---|---|---|---|
| keyframes | Yes | One or more keyframe entries to apply. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It clearly reveals batch semantics, overwrite behavior, single HTTP round-trip, and atomic rejection of invalid entries. A minor gap is that it does not describe the call's return/result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. Purpose is front-loaded, and each sentence adds value: equivalence, atomicity, and usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with a nested array, the schema handles structural detail and the description handles usage scope and atomic behavior. The main omission is no mention of what the call returns or how success/failure is signaled, which matters more because no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter and nested field. The description adds helpful context by saying each entry has the same fields as add_keyframe, but it does not need to restate parameter details. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Add or overwrite'), a clear object ('MANY keyframes across MANY layers'), and the call's one-shot nature. It explicitly contrasts itself with add_keyframe, making it easy for an agent to distinguish from the many sibling keyframe tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use this tool ('whenever you'd call add_keyframe more than a couple of times') and names the alternative. Concrete examples such as rippling grids and staggered text reveals further anchor the selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_blockAInspect
Set (or replace) a layer's timeline BLOCK — the [start, start+duration) window it exists for. The layer is drawn ONLY inside that window, and its animation keyframes are sampled RELATIVE to the block start, so moving or trimming the block re-anchors its intro instead of leaving it behind. This is how a layer 'starts' at a point like an iMovie clip rather than being present for the whole composition. Works on any leaf or group. Frames are in the layer's parent timeline (composition frames at root; band-local inside an embedded morpha band). To place a whole embedded reel, use move_band.
| Name | Required | Description | Default |
|---|---|---|---|
| start | Yes | First frame the layer appears (0-indexed, 30 fps), in its parent timeline. | |
| duration | Yes | How many frames the layer lasts (≥ 1). Hidden outside [start, start+duration). | |
| elementId | Yes | Element id of the layer (image.<id>, video.<id>, text.<id>, shapes.<id>, or group.<id>). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the burden of behavioral disclosure, and it does so well: it reveals that the layer is only drawn inside the window, keyframes are sampled relative to the block start, and moving/trimming re-anchors the intro. It also clarifies the frame coordinate space. It doesn't cover side effects like reversibility or permissions, but the core mutation behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded: it defines the block, explains the behavioral consequence, gives an intuitive analogy, scopes where it applies, and ends with a routing pointer. Every sentence carries information; none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that all four params are fully documented in the schema and there is no output schema, the description supplies the missing conceptual model needed to call the tool correctly. It covers frame timing, parent timeline context, applicability to leaf/group layers, and the embedded-reel alternative. The agent has everything needed to select and invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds useful semantics beyond the schema by explaining that start/duration define the only visible window and that keyframes are relative to the block start. This clarifies the conceptual meaning of the parameters beyond their literal types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair ('Set (or replace) a layer's timeline BLOCK') and defines the block as a [start, start+duration) window. It clearly differentiates from sibling tools, especially by explicitly directing users to move_band for embedded reels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains when to use the tool: to make a layer 'start' at a point like an iMovie clip rather than existing for the whole composition. It also names the alternative (move_band) for embedded reels, though it doesn't contrast with other timeline-related siblings like set_duration or set_group_window.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_fillAInspect
Set a layer's fill. The canvas backdrop is the pinned is_background image_layer (its element id is exposed via describe_video as background.elementId; the literal 'background.canvas' is also accepted as a synonym); null is rejected on the backdrop. Shapes require a Fill (null/missing is rejected). Image / video / text / group layers accept a Fill object (or #rrggbb hex) to paint a backdrop, or null to clear it — clearing removes the layer's fill colour keyframes too, so an animated backdrop really does go away. Shapes paint their body; image/video paint behind the bitmap; groups paint a rect centred on the pivot sized by (box_width, box_height). REFUSED on a layer whose fill is ANIMATED (it has colour keyframes): the track wins at every frame, so a plain fill write would be invisible. Change it at a frame with add_color_keyframe, or pass clear_animation:true to replace the animation with this fill.
| Name | Required | Description | Default |
|---|---|---|---|
| fill | Yes | Either '#rrggbb' (promoted to solid) or a Fill object: {type:"solid",color} / {type:"linear",stops:[{pos:0..1,color}],angle?} / {type:"radial",stops:[{pos:0..1,color}],cx?,cy?,radius?} / {type:"mask",layer_id,color}. A gradient is ONE fill — don't fake it with stacked shapes. null (image/video/text/group only) clears the backdrop, including any fill colour keyframes on it. | |
| elementId | Yes | shapes.<id> / image.<id> / video.<id> / group.<id>. The pinned is_background image_layer is the canvas backdrop; the literal 'background.canvas' is accepted as a synonym. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| clear_animation | No | Only meaningful on a layer whose fill is animated. true = this fill REPLACES the colour animation (its keyframes are deleted). Omitted / false = the call is refused rather than writing a fill the animation would hide. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does it thoroughly. It discloses that null is rejected on the backdrop, that clearing removes fill keyframes, that the tool refuses animated fill layers, and exactly how each layer type is painted. It even explains why a plain fill would be invisible on an animated layer, giving the agent full insight into side effects and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core verb and resource, then builds out the special cases in logical order. It is longer than average, but every clause carries unique operational information and no sentence is filler. It is dense rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex mutation tool with high behavioral nuance, and the description covers all important branches: backdrop semantics, layer type differences, null-handling, side effects on keyframes, refusal conditions, and how to override the refusal. With no output schema and a required projectId that the schema already explains, nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies. The description adds value beyond the schema by explaining the per-layer-type semantics of fill (shapes paint body, image/video paint behind bitmap, groups paint a rect) and clarifying clear_animation behavior. This goes beyond the schema's property comments, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Set a layer's fill') and immediately differentiates among backdrop, shapes, and image/video/text/group layers. It names the exact resource type and the associated side effects, making it unambiguous which operation this performs and how it differs from related siblings like add_color_keyframe or set_style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use alternatives: on an animated fill, use add_color_keyframe, or pass clear_animation:true to replace the animation. It also clarifies the backdrop's special handling and which layer types allow null. No ambiguity remains about when to invoke this tool versus a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_textAInspect
Edit an existing text layer (text.). Patches its text content, font, size, colour, and full type styling — pass only the fields you want to change. Does NOT create layers and does NOT touch image layers; use add_text_layer to make a new one. font_family is a Google Fonts family name (e.g. "Anton", "Bebas Neue"). text_size is the font size in px (omit to keep the current size). text_color is #rrggbb. Styling: font_weight (100-900, e.g. 800 for a black/heavy logo look), font_style (italic), text_transform (uppercase/lowercase), letter_spacing (px, may be negative for tight tracking), line_height (multiplier), text_align, text_autofit ("wrap" default = fixed size + word-wrap, the size you set is what renders; "fit"=auto-size to fill the box, grows and shrinks; "shrink"=legacy shrink-only), text_valign (top/middle/bottom block alignment), an outline via stroke_width + stroke_color, and a text_shadow. To make text MASK another layer (video/image-filled letterforms) use set_matte_source with this layer's id as the matte source. Only elementId is required.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The text to render. Newlines are honoured as hard line breaks. | |
| curve | No | Curve the text onto an arc, in degrees of total sweep. 0 = straight (default). POSITIVE = a SMILE (⌣, ends rise); NEGATIVE = an ARCH (⌒, rainbow). Clamped ±135. A tasteful smile is ~+60. Applies to a SINGLE line — multi-line text is joined to one line while curved (the stored text is untouched, so curve:0 restores it). | |
| elementId | Yes | Text layer id, text.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| text_size | No | Font size in px. | |
| font_style | No | Italic toggle. Default normal. | |
| text_align | No | Horizontal alignment of each line. Default center. | |
| text_color | No | Text fill colour as #rrggbb. | |
| decorations | No | Per-character underline / strikethrough. { underline?: [{start,end}], strikethrough?: [{start,end}] } — each a list of half-open character ranges [start,end) (UTF-16 offsets) into `text`. E.g. underline the first word of "Big news": underline:[{start:0,end:3}]. Ranges are normalized (sorted + merged). null clears all decorations; editing `text` in the SAME call re-indexes existing ranges against the new text. Not rendered on curved text. | |
| font_family | No | Google Fonts family name, e.g. "Anton". | |
| font_weight | No | Font weight 100..900 (400 regular, 700 bold, 800 black). Default 400; the canvas synthesizes weights a static font doesn't ship. | |
| line_height | No | Line height as a multiple of font size (1.2 = 120%). | |
| text_shadow | No | Drop shadow { offsetX, offsetY, blur, color }; color is any CSS colour (rgba allowed). null clears it. | |
| text_valign | No | Vertical alignment of the text block within its box. "middle" (default) centres it; "bottom" pins it to the box floor so extra wrapped lines grow upward from a fixed baseline (captions use this so a wrapped line doesn't shift the others); "top" pins the ceiling. | |
| stroke_color | No | Outline colour as #rrggbb. Defaults to white when a width is set. | |
| stroke_width | No | Outline width in px (0 = no outline). | |
| text_autofit | No | How text fits its box. "hug" (default for new layers): hold text_size FIXED and DERIVE the box from the measured text plus padding, honouring the literal newlines you pass — the box shrink-wraps the exact content and grows/shrinks live as the text changes, so it can never re-wrap differently between the editor preview and the export (bake your own "\n" breaks; pair with set_text_background for a rounded caption box). "wrap": hold text_size FIXED in a fixed-size box and only word-wrap (hard-breaking a single over-wide word), never resize. "fit": ignore text_size and auto-size the font BOTH ways (grow and shrink) to the largest size whose wrapped block fills the box — resizing the box resizes the text. "shrink" (legacy): word-wrap then auto-shrink the font from text_size until the block fits; never grows. | |
| letter_spacing | No | Tracking between glyphs in px; may be negative. Default 0. | |
| text_transform | No | Case transform applied before layout. Default none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and provides deep behavioral detail: autofit grow/shrink semantics, curve single-line joining, decoration re-indexing on text edits, null-clearing behavior, and preview/export consistency for 'hug'. However, the claim 'Only elementId is required' contradicts the input schema, which also requires projectId, so the description is not fully reliable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately so for a 19-parameter styling tool; it front-loads the main action before exclusions, parameter conventions, and advanced use cases. Every sentence adds concrete detail or examples rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The prose is remarkably complete for behaviors and parameter semantics, but it is not fully safe to invoke from: the final sentence says only elementId is required while the schema requires projectId. An agent that trusts the description over the schema could send a failing request; no output/return info is provided, though that is less critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies, but the description adds significant meaning: Google Fonts family examples, smile/arch direction for curve, autofit mode differences, caption-friendly valign behavior, negative letter-spacing, and decoration range offsets. The required-fields contradiction ('only elementId') prevents a 5 because it misstates the projectId requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource: 'Edit an existing text layer (text.<id>)' and lists the patched properties (text content, font, size, colour, type styling). It also explicitly distinguishes from add_text_layer and image layers, so an agent can identify this tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: patch only fields you want to change, do not create layers, do not touch image layers, and use add_text_layer for creation. It also points to set_matte_source for masking, which covers the main alternative use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_transitionAInspect
Set how a layer ENTERS at the start of its on-timeline window and LEAVES at the end, instead of popping. The transition is EDGE-RELATIVE — only a length and a look are stored — so it rides the edge through every later trim, slide or clip retime. Prefer this over fade_layer / apply_preset whenever the intent is 'enters and leaves nicely': those write opacity keyframes at ABSOLUTE frames, which strand themselves the moment the edge moves, and clutter the timeline lanes. A layer created WITH a block is born carrying a short fade at each edge — whether you passed the block or the editor minted one — so check inspect_layers before adding one, rather than assuming there is none. Layers created before this default existed, and any edge cleared to "cut", carry nothing and do need setting. A layer with NO block is always-present, has no edges, and a transition on it is inert. Video clips default to a hard cut, because a hard cut between shots is the grammar of short-form video. kind "cut" clears the edge back to a hard cut. The length is a request: when the window is too short to hold both ramps they are squeezed proportionally at render time, and the stored values are left intact.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | Yes | Which edge to set. "in" is the start of the layer's window, "out" the end. | |
| kind | Yes | The look. "cut" = hard edge (clears any transition). "fade" = opacity ramp. "slide" = travels in/out from a direction while fading. "pop" = scales up from 80% with an overshoot. | |
| curve | No | Optional easing override (linear, easeIn, easeOut, easeInOut, outQuart, outExpo, outBack, inBack, inOutBack). Defaults suit the kind: entries decelerate in, exits accelerate away. | |
| frames | No | Ramp length in frames (30 fps). Default 6. Ignored for kind "cut". | |
| direction | No | For kind "slide" only. On the IN edge this is where the layer comes FROM; on the OUT edge, where it goes TO. Default "left". | |
| elementId | Yes | Element id of the layer (image.<id>, video.<id>, text.<id>, shapes.<id>, or group.<id>). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It explains edge-relative behavior, the absolute-keyframe pitfall of alternatives, default fades on block-created layers, hard-cut defaults for video clips, kind 'cut' clearing behavior, and render-time proportional squeezing of ramps. These are non-obvious side effects and constraints that materially affect agent decisions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, every clause earns its place: purpose first, then the core edge-relative insight, then alternatives, default conditions, edge cases, and the render-time caveat. There is no repeated schema content and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, this description is unusually complete. It covers purpose, selection among siblings, prerequisites, default behavior, inert cases, and a limitation at render time — everything an agent needs to decide whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is already solid. The description adds meaningful semantics beyond the schema: frames is 'a request' that can be squeezed at render time, kind 'cut' clears the edge back to a hard cut, and the edge-relative concept clarifies how parameters like direction behave on in vs out edges.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set how a layer ENTERS at the start of its on-timeline window and LEAVES at the end.' It further differentiates itself by naming fade_layer and apply_preset and explaining the key distinction: this tool stores an edge-relative transition rather than absolute keyframes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: prefer this over fade_layer/apply_preset for 'enters and leaves nicely' intent, and check inspect_layers first because layers created with a block already have a short fade. It also clarifies that no-block layers are always-present and transitions on them are inert, which prevents incorrect invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_visibleAInspect
Show or hide a layer instantly by writing a single opacity keyframe (1 or 0) at frame 0.
| Name | Required | Description | Default |
|---|---|---|---|
| visible | Yes | ||
| elementId | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though no annotations are provided, the description clearly discloses the key behavioral side effect: it writes a single opacity keyframe with value 1 or 0 at frame 0. This tells the agent that the operation is mutating and how the visibility change is implemented, which is valuable context beyond the bare tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence with no filler. It front-loads the core action and then adds the implementation detail, making it easy to parse efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter mutation tool with no output schema, the description covers the essential behavior and side effects. It could add more detail about overwriting existing keyframes or errors, but the given context is largely sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, with only projectId described. The description adds meaningful semantic context for the 'visible' parameter by tying it to opacity values 1 and 0, but it does not explain 'elementId' beyond what the tool name implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show or hide') with a clear resource ('a layer') and explains the mechanism (opacity keyframe at frame 0). It distinguishes this tool from animated visibility alternatives like fade_layer by emphasizing 'instantly' and the single keyframe at frame 0.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case: use this tool when you need an immediate, binary layer visibility change. However, it does not explicitly mention alternatives or state when not to use it, especially given many sibling tools involve keyframes and opacity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_loopAInspect
Set the project's loop section: the whole composition repeats once per value, with one field of one layer varying across the repeats. Builds one pass per value, each setting field of elementId to that value — e.g. a caption text layer cycling through several strings. Pass an empty values array to clear the loop (the comp plays once).
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | The layer field each pass overrides — e.g. "text", "text_color", "filename". Defaults to "text". | |
| values | Yes | One value per loop pass. Empty array clears the loop. | |
| elementId | Yes | Target layer — text.<id>, image.<id>, shapes.<id>, or video.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that one pass is built per value, that each pass overrides `field` of `elementId`, and that an empty `values` array clears the loop so the composition plays once. It does not cover return values, permissions, or whether an existing loop is overwritten, but the core side effects are clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the main concept appears in the first sentence, followed by a clarifying mechanism, a concrete example, and the clearing behavior. Every sentence contributes value without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with four fully documented parameters and no output schema, the description explains the operation's effect, the per-pass semantics, and the clear-loop case. It could mention return behavior or overwrite semantics, but the information needed to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds connecting meaning: it explains the relationship between `values`, `field`, and `elementId` (one pass per value setting that field), plus a concrete caption-text example. This goes slightly beyond the schema's per-property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Set') and a specific resource ('the project's loop section'), then clarifies the mechanism: the whole composition repeats once per value with a single layer field varying. This distinguishes it from siblings like set_track_loop by emphasizing the project-wide loop behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is clearly implied: use this when a composition should repeat with one field varying per pass, e.g. cycling caption text. However, it does not explicitly name alternatives or state when not to use it, leaving the agent to infer boundaries against sibling tools such as set_track_loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_matte_sourceAInspect
Set (or clear) a track matte — the host shows only where the matte source is opaque. The HOST can be a leaf (image., video., shapes., text.) OR a group. (a group is a layer of sorts): a group host clips ALL its composited children to the source shape's path — e.g. a marching chevron strip + black backing shown only inside an arrow / band shape. For a leaf host the source can be any leaf (use a text. source for video-/image-filled letterforms); for a group host the source must be a shape (shapes.). Make the source layer hidden so it acts purely as the stencil. Pass null to clear.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | Host being masked: image/video/shapes/text.<id>, or group.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| matte_inverted | No | Optional. Invert the mask (knock-out): the host shows everywhere EXCEPT where the source is opaque — a punch-through / spotlight. Honored on leaf hosts; ignored on group hosts. Omitted = preserve current; clearing the mask resets it. | |
| matte_source_id | Yes | Element id of the layer whose alpha drives the mask, or null to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral details: how the matte affects visibility, inversion behavior, handling of omitted parameters, and the effect of passing null to clear. However, it does not mention persistence, reversibility, or any side effects beyond the matte settings, which slightly reduces transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative but somewhat wordy, repeating examples and rephrasing the same idea across multiple sentences. It is well-structured and does not contain irrelevant details, but it could be tightened without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary context for using the tool: parameter behaviors, host type constraints, handling of omitted values, and the clearing mechanism. Even without an output schema, the description provides sufficient guidance for an agent to call the tool correctly in various scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Each parameter is clearly described in the schema and enriched by the tool description. The description adds context about host types (leaf vs group) and source constraints (e.g., group hosts require shapes). The 'matte_inverted' parameter is well explained with its optional behavior, and 'matte_source_id' clarifies null semantics. Full schema coverage is achieved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's primary function: setting or clearing a track matte, where the host shows only where the matte source is opaque. It also provides concrete examples (e.g., a marching chevron strip) and differentiates between host types, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool (to apply a matte to a leaf or group host) and mentions the behavior for group vs leaf hosts, but it does not explicitly contrast with alternatives or state when not to use it. The examples help, but explicit guidance on tool selection is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pivotAInspect
Set the rotation / scale pivot anchor for an image, video, shape, or text leaf. Picks one of the 9 standard bbox anchors — corners, edge midpoints, or centre — so the layer rotates and scales around that point instead of its centre. The pivot is normalized to the bbox, so resizing the layer keeps the pivot anchored to the same corner / edge / centre. Static (not animated). For groups, use move_layer with x/y to set the group's absolute pivotX/pivotY instead.
| Name | Required | Description | Default |
|---|---|---|---|
| anchor | Yes | Which of the 9 bbox anchors to pivot around. tl/t/tr = top row; l/c/r = middle row; bl/b/br = bottom row. c = centre (the default). | |
| elementId | Yes | image.<id>, video.<id>, shapes.<id>, or text.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that the pivot is normalized to the bbox, that resizing keeps the pivot anchored, that the operation is static rather than animated, and that it applies only to specific leaf types. It also clarifies the relationship between the pivot and rotation/scale behavior, which goes well beyond a bare 'sets pivot' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three focused sentences with no filler. The purpose is front-loaded, the key behavioral constraints follow, and the group alternative is given in the last sentence. Every sentence adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter setter with a fully self-documenting schema and no output schema, the description covers the operation scope, behavioral semantics, and the key alternative. Nothing critical is missing for an agent to decide whether and how to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and every parameter has a meaningful description: anchor explains the 9 enum values, elementId specifies allowed prefixes, and projectId explains its source and mutation role. The description adds contextual behavior but no new parameter-level detail, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set the rotation / scale pivot anchor for an image, video, shape, or text leaf.' It clearly defines the 9-anchor behavior and distinguishes itself from group-related operations by pointing to move_layer for groups. This makes the tool immediately distinguishable from its many set_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the target element types (leaf-level images, videos, shapes, text), notes that the pivot is static/not animated, and provides an explicit alternative: 'For groups, use move_layer with x/y to set the group's absolute pivotX/pivotY instead.' This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_styleAInspect
Set style fields on a layer. Only the fields you pass are changed; omit a field to leave it untouched. Covers border/radius/shadow (including borderAlign — inner|center|outer border position) plus image-only fields: fit (stretch|cover|contain), anchorX/anchorY (0..1, where the source anchors when cropping/letterboxing under cover/contain), tintColor (#rrggbb) + tintStrength (0..1) for a colour overlay painted source-atop, and alphaMask (linear gradient — see below) for a multiplicative alpha fade across the layer.
| Name | Required | Description | Default |
|---|---|---|---|
| fit | No | Fit mode (image + video layers). Default: stretch for image layers, cover for video layers. | |
| anchorX | No | Object-position X (0..1). 0=left, 1=right, 0.5=centre. Only meaningful with fit=cover|contain. | |
| anchorY | No | Object-position Y (0..1). 0=top, 1=bottom, 0.5=centre. Only meaningful with fit=cover|contain. | |
| alphaMask | No | Linear alpha-mask gradient (image layers). Multiplies the layer's alpha along a gradient line — used to fade a layer out partway across (the front half of a 'sandwich' covering text below it). Object: { type: 'linear', angle: number (deg, CSS-style; 0=to top, 90=to right, 180=to bottom, 270=to left), stops: [{offset:0..1, alpha:0..1}, ...] (≥2 stops, ordered by offset) }. Pass null to clear. | |
| boxShadow | No | CSS box-shadow string, e.g. "0 4px 12px rgba(0,0,0,0.5)". Pass an empty string "" or null to REMOVE the shadow. | |
| elementId | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| tintColor | No | #rrggbb tint colour painted source-atop over the image (image layers only). | |
| blend_mode | No | Photoshop-style layer blend mode (Canvas globalCompositeOperation). 'normal' is the default. Applies to every layer kind; allowed on group.<id> too (the only set_style field that is). | |
| chroma_key | No | Green-screen key (video / image layers). Makes pixels near `color` transparent at render time so layers below show through. Object: { color: '#rrggbb' (default '#00ff00'), similarity: 0..1 (match radius, default 0.4), smoothness: 0..1 (edge feather, default 0.1) }. Pass null to clear. | |
| borderAlign | No | Where the border sits relative to the layer's edge (design-tool "border position"). "inner" (default) draws the band INSIDE the box so it eats into the content; "outer" draws it entirely OUTSIDE so it frames the content without covering it; "center" straddles the edge 50/50. Rectangular boxes (image/video/text) only — shapes always stroke centred on their silhouette and ignore it. | |
| borderColor | No | #rrggbb. | |
| borderWidth | No | ||
| borderRadius | No | ||
| tintStrength | No | Tint blend strength 0..1. 0=no tint, 1=image silhouette filled with tintColor. Default 0 (no tint). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does well: it discloses patch semantics, image-only field restrictions, the source-atop tint behavior, and the multiplicative nature of alphaMask. It does not mention every side effect, such as borderAlign being ignored on shape layers, but that detail appears in the schema and the prose is substantially transparent about the main behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most important behavioral fact (patch semantics) and packs substantial field guidance into a single dense paragraph appropriate for a 15-parameter tool. The only structural flaw is the dangling 'see below' reference, since no following section exists in the description itself.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex style-mutation tool with no annotations and no output schema, the description plus the rich input schema covers the essential invocation information: patch behavior, field categories, and layer-type restrictions. It stops short of a 5 because it gives no return-value or error expectations and leaves two parameters (chroma_key and blend_mode) entirely out of the prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the baseline is 3, but the description adds meaningful classification beyond the schema: it groups fields into border/radius/shadow versus image-only, clarifies that anchorX/anchorY matter only under cover/contain, and explains the tint and alphaMask mechanics. It does omit chroma_key and blend_mode from the prose, though both are well-described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Set style fields on a layer') and then enumerates the covered domains: border/radius/shadow, image fit/anchor, tint, and alphaMask. This scope clearly separates it from sibling style-related tools such as set_layer_fill or set_pivot, even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The patch semantics ('Only the fields you pass are changed; omit a field to leave it untouched') are clear and helpful, giving the agent a precise invocation model. However, there is no explicit guidance about when to choose set_style over alternatives like set_layer_fill, set_pivot, or set_layer_transition, nor any exclusions listing what this tool does not handle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_text_backgroundAInspect
Add or update the rounded background box behind a TEXT layer (text.) in one call — sets the backdrop fill plus the box's padding, corner radius, and optional stroke. Pass only the fields you want to change. New text layers are already text_autofit "hug", so padding alone shrink-wraps the box to the text — ideal for caption / sticker chips; set_layer_text(text_autofit:"hug") is only needed when adding a box to an OLDER layer still on "wrap". THIS IS HOW YOU BUILD A BUTTON: a button / CTA / chip / tag / pill / labelled badge is ONE text layer with a native background, never a rounded-rect shape with a text layer parked on top — padding is what sizes the box around the label, so the two can't drift apart when the text or the scale changes and the user drags one layer instead of two. The one exception: the box is NOT painted on CURVED text (a straight box behind a bent line reads as broken), so an arc-shaped chip genuinely needs a shape behind it. Pass fill null to remove the box. Text layers only; for shapes/images/video use set_layer_fill.
| Name | Required | Description | Default |
|---|---|---|---|
| fill | No | Box fill: '#rrggbb' (promoted to solid) or a Fill object: {type:"solid",color} / {type:"linear",stops:[{pos:0..1,color}],angle?} / {type:"radial",stops:[{pos:0..1,color}],cx?,cy?,radius?} / {type:"mask",layer_id,color}. null clears the box; omit to leave the current fill. | |
| padding | No | Uniform inset (canvas px) between the box edge and the text. 0 / omitted ⇒ no explicit padding. | |
| elementId | Yes | text.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| strokeColor | No | Box outline colour as #rrggbb. | |
| strokeWidth | No | Box outline width in px. 0 / omitted ⇒ no outline. | |
| cornerRadius | No | Corner radius of the box in px. 0 ⇒ square corners. | |
| clear_animation | No | Only meaningful when `fill` is given AND the layer's backdrop fill is animated. true = the new fill REPLACES the colour animation. Omitted / false = the call is refused rather than writing a fill the animation would hide. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description fully carries the behavioral burden: it states the mutation ('Add or update... in one call'), partial-update behavior, fill-null removal, and the important limitation that the box is not painted on curved text. An agent can predict side effects before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is information-dense and front-loaded with the core action before usage guidance. The button-building paragraph earns its place, though it could be tightened without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100% schema coverage, 8 parameters, and no output schema, the description plus schema give an agent everything needed to invoke correctly: target layer type, optional fields, partial update, removal, curved-text limitation, and routing to sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds meaning beyond the schema by explaining that padding alone shrink-wraps the box, that fill null removes it, and that only changed fields should be passed. It does not re-document every parameter, but it does not need to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Add or update the rounded background box behind a TEXT layer (text.<id>)'. It also distinguishes this tool from siblings by stating that shapes/images/video should use set_layer_fill, so an agent can tell which tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: padding shrink-wraps a box for caption/sticker chips, and buttons should be one text layer with a native background rather than a shape plus text. It also names alternatives (set_layer_text with text_autofit:'hug' for older wrap layers, set_layer_fill for non-text layers) and calls out the curved-text exception.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_track_loopAInspect
Set the extrapolation mode for one property's animation track. Modes: "hold" (default — holds the boundary keyframe's value past the ends), "loop" (wraps frames past the last keyframe back to the first, restarting the animation), "ping-pong" (alternates direction each cycle, bouncing back and forth), "cycle" (wraps like loop but each cycle adds the boundary delta — used for endless rotation or scrolling). Has no effect on tracks with fewer than 2 keyframes.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | ||
| property | Yes | ||
| elementId | Yes | Layer id (video/image/shape/group). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does well by explaining exactly what each mode does and disclosing the no-op condition for tracks with fewer than 2 keyframes. It does not mention overwriting behavior or return output, but for a simple setter the mode semantics and edge-case caveat provide meaningful transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The primary action is front-loaded, the detailed mode definitions are necessary for correct invocation, and the short keyframe-count caveat is valuable. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four required parameters, no annotations, and no output schema, the description covers the key operational facts: what the tool sets, what each mode means, and when it does nothing. It is slightly incomplete only in not explicitly routing the agent away from the similarly named sibling set_loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, with elementId and projectId already explained. The description compensates for the mode parameter by thoroughly defining hold, loop, ping-pong, and cycle. It does not add much about the property enum, but those values are self-explanatory, and the phrase "one property's animation track" clarifies the role of property.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Set the extrapolation mode for one property's animation track." It is clearly scoped to a per-property track, which helps distinguish it from the sibling set_loop, though it never names set_loop explicitly. The four mode values are explained, adding precision to what the tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for configuring extrapolation after keyframes and explicitly notes it has no effect on tracks with fewer than 2 keyframes. However, it does not mention the sibling tool set_loop or any explicit condition for choosing this tool over alternatives. Usage context is present but alternate routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_video_clipAInspect
Repoint an existing video layer at a different uploaded clip — keeps the layer's id, position, size, animations, styles, and trim window; only the source mp4 changes. The clip must already exist at users//clips// (uploaded via the editor's '+ Add video' button or /api/upload-clip). Use this to swap a video layer's source WITHOUT losing its keyframes.
| Name | Required | Description | Default |
|---|---|---|---|
| clip | Yes | Clip filename in the project's clips bucket, e.g. mickey-tiktok.mp4. | |
| elementId | Yes | Video layer id, video.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description fully carries the behavioral burden. It clearly discloses that the tool mutates an existing layer, preserves its id/position/size/animations/styles/trim, and only changes the source mp4. This exceeds anything in the schema and is helpful. Still missing: any mention of error behavior if the referenced clip does not exist, or sync/async semantics, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is tightly structured: a first sentence describing the core action and preservation guarantees, followed by a second sentence giving the prerequisite and upload channels, and a short directive with the key value proposition. There is no repetition or filler; each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter tool with no output schema, the description covers what an agent needs to call it correctly: it explains behavior, the constraints (clip already exists), and the primary use case. It lacks error-handling details (e.g., what happens when the clip is missing) and explicit permission needs, but the tool is simple enough that these details are not essential. Overall it is complete enough for likely agent usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since the input schema already provides strong descriptions for all three parameters (clip, elementId, projectId), the baseline is 3. The description adds extra meaning by stating the exact path users/<userId>/clips/<projectId>/<clip> and the allowed upload methods, which helps an agent construct the clip parameter correctly. This goes beyond the schema's file name mention, giving concrete constraints and context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a clear verb+resource: "Repoint an existing video layer at a different uploaded clip," then spells out exactly which layer attributes are preserved and which change. This cleanly differentiates it from siblings like set_video_layer_trim, remove_layer, or add_video_layer. The use case is unambigous and no tautology or restating of the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this to swap a video layer's source WITHOUT losing its keyframes' and states the prerequisite that the clip must already exist at the specified path and be uploaded via specific means. It does not explicitly name alternatives or provides when-not conditions, but the target scenario is concrete and well-delineated from competing actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_video_layer_mutedAInspect
Mute or unmute a video layer's baked audio (silenced in both preview and export). The processing pipeline's audio-split step sets this true after demuxing the clip's audio into a standalone overlay track (NLE-style linked A/V), so the source audio doesn't double with the overlay. Pass muted:false to restore the baked audio.
| Name | Required | Description | Default |
|---|---|---|---|
| muted | Yes | true silences the layer's baked audio; false restores it. | |
| elementId | Yes | Video layer id, video.<id>. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that muting affects both preview and export, that the pipeline automatically sets muted:true after demuxing to prevent double audio, and that unmuting restores the baked audio. This gives a solid behavioral model without needing to infer side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact three-sentence block that front-loads the core functionality and immediately states the key behavioral scope. Every sentence adds meaningful context: the effect, the pipeline reason, and the restore action. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple boolean setter with three fully documented parameters and no output schema, the description is complete: it explains the purpose, the effect on export/preview, and the restore path. It could mention the relationship to overlay audio more explicitly, but the NLE-style linked A/V explanation covers the important context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters. The description reinforces the meaning of the 'muted' boolean (true silences, false restores) but adds little beyond what the schema states. Baseline 3 is appropriate when the schema fully covers parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Mute or unmute'), the resource ('a video layer's baked audio'), and the effect ('silenced in both preview and export'). It distinguishes the concept of 'baked audio' from any overlay track, which differentiates it from add_audio_overlay/remove_audio_overlay siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when the muted state is automatically set (by the audio-split step during demuxing) and instructs passing muted:false to restore, which gives clear invocation guidance. It does not explicitly name sibling alternatives or say when not to use it, but the context of muting vs. overlays is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_video_layer_trimAInspect
Patch a video layer's trim window: source_in_frame (frame in source to start), source_out_frame (frame in source to stop, or null for natural end), timeline_start_frame (where on the project timeline the slice begins). Only the fields you pass are changed. Use this to clip out a segment of a source mp4: duplicate the layer first (in the editor) so you have two pointing at the same clip, then set disjoint source windows.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | video.<id> of the layer to trim. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| source_in_frame | No | Frame in the source mp4 where playback begins (0-indexed, 30 fps). | |
| source_out_frame | No | Frame in the source mp4 where playback stops, or null to clear and play to the source's natural end. | |
| timeline_start_frame | No | Project-timeline frame where this slice begins playing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full transparency burden and does well: it discloses partial-update semantics ('Only the fields you pass are changed'), the null behavior of source_out_frame, and the workflow requirement to duplicate the layer first. It does not cover error cases, permissions, or reversibility, but the core behavioral traits of the mutating call are clearly communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation and is not bloated, and each section serves a purpose: operation, parameter summary, and usage guidance. The parenthetical field explanations partly duplicate the schema, but they are compact and help the agent quickly grasp the tool's intent without switching contexts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutating tool with no annotations and no output schema, the description is reasonably complete: it defines the operation, covers all trim-related fields, specifies partial updates, and provides a real-world procedure. It does not mention validation rules or failure behavior, but the provided context is sufficient for correct invocation in the common case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds value beyond the schema by clarifying the relationship between the three trim parameters and the intended workflow, especially the note that only passed fields are changed. It does not introduce new frame/fps details beyond the schema, but the usage context makes parameter behavior easier to internalize.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Patch a video layer's trim window,' making the tool's function immediately clear. It goes on to name the exact trim parameters and the intended use case, clipping a segment of a source mp4, which separates it from sibling tools like set_video_clip or cut_range.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete guidance on when to use the tool: to clip out a segment of a source mp4, with a clear prerequisite ('duplicate the layer first') and a strategy ('set disjoint source windows'). It does not explicitly name alternative tools or say when not to use them, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shift_groupAInspect
MOVE a group and everything inside it along the timeline, keeping its internal timing intact — the 'slide this whole section later' operation. A plain group is a relative CONTAINER: it has no window of its own, so on the timeline it spans the hull of its contents, and moving it slides the whole subtree as one rigid body. start is the ABSOLUTE frame the group's window should end up at, not a delta, so calling it twice with the same value is a no-op. Descendants keep their spacing; the move stops when the earliest thing inside reaches frame 0. Welded caption lines are deliberately left behind (they follow their clip's speech, not this group), and an embedded morpha band moves as one unit. Fails when the group is empty or holds an always-present layer — there is no bounded window to move. To CLIP what is shown of a group rather than move it, use set_group_window; for a single layer use set_layer_block.
| Name | Required | Description | Default |
|---|---|---|---|
| start | Yes | ABSOLUTE frame the group's window should start at after the move (0-indexed, 30 fps) — not an offset. | |
| elementId | Yes | The group's id (group.<id> or the bare <id>). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses idempotency for repeated identical start values, bounded stopping at frame 0, welded caption lines being left behind, morpha bands moving as one unit, and failure modes for empty/always-present groups. An agent can predict side effects and preconditions without additional documentation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence contributes a distinct behavioral or routing fact. It is front-loaded with the core action and analogy, then layers container semantics, constraints, exceptions, and alternatives in a logical order. Given the tool's complexity, the length is justified and not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and no annotations, the description is remarkably complete: it explains the core behavior, edge cases, failure conditions, interaction with nested elements, and alternatives. The only thing missing is return-value details, but that is not necessary for correct invocation. An agent has enough context to decide when and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents each parameter well, so the baseline is 3. The description adds value beyond the schema by clarifying that 'start' is interpreted as the group window's absolute destination and that calling it twice with the same value is a no-op. It also reinforces the accepted elementId forms and projectId selection behavior, though these largely mirror the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'MOVE a group and everything inside it along the timeline, keeping its internal timing intact.' It clearly distinguishes this operation from siblings by naming set_group_window and set_layer_block as the clipping/single-layer alternatives. The intuitive 'slide this whole section later' phrasing anchors the tool's purpose immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit conditions for use: move a whole group subtree as a rigid body, while clipping should use set_group_window and single-layer moves should use set_layer_block. It also states when the operation fails (empty group or always-present layer), which helps the agent avoid invalid calls. This is strong when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shift_trackAInspect
Bulk-shift every keyframe's VALUE on one property of one layer by delta. Mirrors the 'select all keyframes + nudge layer' gesture in After Effects / Premiere / FCP — preserves the relative spacing of the animation but slides the whole curve. Keyframe TIMES are untouched. Use for 'move all x by -30px' on a complex animation, retiming a fade by adjusting its base opacity, rotating an existing wobble by 10°, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| delta | Yes | Added to every keyframe's value on this track. Negative shifts the curve down/left. | |
| property | Yes | ||
| elementId | Yes | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden and handles it well. It states the exact effect on keyframe values, that relative spacing is preserved, that the whole curve slides, and that keyframe times are not changed. It also explains negative delta behavior ('Negative shifts the curve down/left').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation is front-loaded, followed by an analogy and concrete examples. Every sentence earns its place: the gesture analogy helps internalize behavior, the times-untouched point prevents a common mistake, and the examples clarify parameter usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no output schema and no annotations, this description is remarkably complete. It covers what changes, what doesn't, how negative deltas behave, and realistic scenarios, leaving little ambiguity for an agent deciding whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, and the description compensates with meaningful context: it defines delta's role, clarifies that elementId identifies a layer, and gives property-specific examples. It doesn't fully document every parameter, but the examples and first sentence add enough semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Bulk-shift every keyframe's VALUE on one property of one layer by delta.' It clearly distinguishes this from keyframe-time operations by stating 'Keyframe TIMES are untouched,' which separates it from sibling tools that add, remove, or re-time keyframes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete use cases: 'move all x by -30px', 'retiming a fade by adjusting its base opacity', 'rotating an existing wobble by 10°'. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough for an agent to select it for bulk value shifts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
split_caption_lineAInspect
Split one caption line into two at a COMPOSITION frame strictly inside its window (in the editor this is the playhead). The right half is a full clone — style, band geometry, weld — and the text divides at the word gap nearest the split point (a single-word line keeps its text on the left; the right half starts empty). A welded line stays welded on both halves (the frame converts to the clip's source timeline); a standalone line splits its block. Returns { left, right, splitFrame }. Retime the halves afterwards with set_layer_block; fix the wording with set_layer_text.
| Name | Required | Description | Default |
|---|---|---|---|
| atFrame | Yes | Composition frame to split at — must be strictly inside the line's on-timeline window (see describe_video / inspect_layers for windows). | |
| elementId | Yes | The caption line to split, "text.<id>". | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden, and it delivers: it explains cloning, style/band/weld inheritance, word-gap text division, welded-line source-timeline behavior, the return shape, and the recommended follow-up operations. This is unusually transparent for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and front-loaded with the core action, then layers necessary edge-case behavior, return value, and follow-up steps. Every sentence carries distinct information and the formatting keeps the complex rules readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description provides enough detail to invoke it correctly: input constraints, exact split behavior, clone properties, edge cases, return structure, and next steps. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning beyond the schema: it maps atFrame to the editor playhead and explains the resulting split behavior for single-word lines and welded lines. The schema already covers 'strictly inside' and projectId semantics, so the added value is real but modest.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Split'), a precise resource ('one caption line'), and a distinctive condition ('at a COMPOSITION frame strictly inside its window'). It clearly separates this from siblings like merge_caption_lines by describing the resulting two halves and the follow-up tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: the split point must be strictly inside the line's window, it describes the playhead mapping, and it covers edge cases like single-word lines and welded lines. However, it does not explicitly contrast this with alternatives or state when not to use it, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_clipAInspect
Return the cached transcript of a clip's audio. Generated client-side in the Morpha editor (transformers.js Whisper) and cached in R2 next to the clip; if absent, it is produced when the clip is opened in the editor. Independent of the clip's video codec — runs on the audio track only, so it works on HEVC/AV1 clips that the OCR pipeline can't decode. Returns { ok: true, status: 'ready' | 'not-ready', data: { text, word_count, words: [{ word, start, end }], vtt? } }.
| Name | Required | Description | Default |
|---|---|---|---|
| clip | Yes | Clip filename (video.<id>.clip). | |
| projectId | Yes | Project the clip belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly. It discloses the client-side Whisper generation path, R2 caching location, lazy generation on editor open, audio-only processing, codec independence, and the exact status values including 'not-ready'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. The first sentence states the core function, the second explains the generation and caching behavior, and the third provides codec context and the return contract. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description includes a complete return shape with status values, data fields, word objects, and optional VTT. It also covers runtime behavior, caching, and compatibility, leaving little uncertainty about how to invoke and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters (projectId and clip) already documented. The description adds no additional parameter-specific semantics, but it does reinforce that the tool works on a clip within a project. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Return the cached transcript of a clip's audio.' It further distinguishes itself by highlighting that it operates on the audio track independently of video codec, which separates it from OCR-based tools like describe_video or detect_text_regions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: when a cached audio transcript is needed, including for HEVC/AV1 clips that the OCR pipeline cannot decode. It does not explicitly name alternatives or exclusions, but the codec independence and cache semantics make the intended use case apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ungroup_layersAInspect
Dissolve a group: its children are spliced into the group's parent at the group's old position. The group's animation tracks are discarded — children survive at their last positions but inherit none of the group's keyframes.
| Name | Required | Description | Default |
|---|---|---|---|
| groupId | Yes | Bare group id (no 'group.' prefix), e.g. "header" for group.header. | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It clearly discloses that the operation is destructive to the group's animation tracks, that children survive but inherit none of the group's keyframes, and that children are repositioned into the parent. This is strong behavioral disclosure, though it does not mention return values or error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The core operation is stated first, followed by the important side-effects regarding keyframes and children. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two fully documented parameters, and the behavior is described in meaningful detail. No output schema exists, but none seems critical for this mutation. Minor omissions such as prerequisites (e.g., group must exist) or return behavior keep it just shy of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both groupId and projectId are already well documented. The description adds useful context about group behavior but does not substantially extend parameter-specific semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Dissolve a group', then explains the exact structural effect (children spliced into parent at the group's old position). This makes the tool's purpose unmistakable and distinguishes it from siblings like group_layers or rename_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied: use this when you want to dissolve a group while preserving its children at their current positions. However, it does not explicitly mention when not to use it or point to alternatives such as group_layers or set_group_parent, so guidance is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_audio_overlayAInspect
Patch an existing audio overlay. Only the fields you pass are changed. Pass endFrame:null to clear it (revert to natural-length playback).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| gain | No | Linear gain 0..2. | |
| endFrame | No | End frame, or null to clear and use the asset's natural length. | |
| filename | No | ||
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. | |
| startFrame | No | ||
| fadeInFrames | No | ||
| fadeOutFrames | No | ||
| sourceLayerId | No | Weld the overlay to a video layer ("video.<id>") so it renders as a clip footer and drags with the clip, or null to detach it back into a standalone track. | |
| denoiseStrength | No | Clean-strength wet/dry mix 0..1 for an overlay with an AI-cleaned track: 1 = fully cleaned, 0 = fully original, between = blend. null clears it (full clean). Ignored while the Original track is selected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states that only passed fields are changed and that endFrame:null clears the value, which is important mutation semantics. It does not mention errors, authentication, or side effects, but the disclosed partial-update behavior is meaningful and non-obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main action is front-loaded, and the important special case for endFrame:null is stated in the second sentence. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 10 parameters, no output schema, and no annotations, so the description must compensate for a lot. It covers the core patch behavior well, but an agent still lacks guidance on return values, error behavior, and the meaning of several undocumented parameters. This is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, and the description adds the general patch semantics that only passed fields are changed, which helps all parameters. However, it does not clarify several undocumented parameters like filename, startFrame, fadeInFrames, or fadeOutFrames. The endFrame:null note mostly repeats what the schema already describes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Patch an existing audio overlay.' This clearly distinguishes it from siblings like add_audio_overlay and remove_audio_overlay. The partial-update phrasing further defines what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for modifying an existing overlay rather than creating or removing one, which gives clear context. It does not explicitly name alternatives or when-not-to-use conditions, but 'existing audio overlay' and 'patch' make the intended use reasonably unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_audioAInspect
Upload an audio track into a project by fetching a public http(s) URL server-side — the ONLY way to get an audio file's bytes into a project over MCP/HTTP (add_audio_overlay / update_audio_overlay only reference a filename that must already be uploaded). The worker downloads the .mp3/.m4a/.wav/.ogg/.aac, stores it in the project's asset bucket, and returns { filename, sizeBytes, contentType }. Then pass the returned filename to add_audio_overlay (add a second track) or update_audio_overlay { id, filename } (replace an existing track's file — find the id via describe_video's audio_overlays). The url must be a direct, publicly-fetchable http(s) link (not an auth-walled page). Buffered in Worker memory, so capped at 16 MiB.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Direct, publicly-fetchable http(s) URL of the audio file (.mp3/.m4a/.wav/.ogg/.aac). | |
| filename | No | Optional stored filename (.mp3/.m4a/.wav/.ogg/.aac). Defaults to the basename of the URL path; sanitised to lowercase a-z0-9._-. | |
| projectId | Yes | Project to add the audio to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: the worker downloads, stores in the project's asset bucket, returns { filename, sizeBytes, contentType }, and buffers in memory with a 16 MiB cap. It also discloses the server-side fetching mechanism and the constraint on public URLs. This is thorough, honest behavioral disclosure beyond what any annotation would typically supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each sentence in the description contributes essential information: the core purpose and uniqueness, the workflow and return value, the downstream usage of the filename, the URL constraints, and the memory cap. The description is front-loaded with the primary purpose and maintains a logical flow from action to result to subsequent steps, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description is remarkably complete: it explains the entire operation lifecycle, return value shape, how to chain the result with sibling tools, how to find the overlay id, supported formats, URL constraints, and a critical size limitation. An agent has everything needed to invoke this tool correctly and integrate it into a workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: it explains the purpose of the returned filename and how to use it in subsequent overlay operations, reinforces the URL constraints, and clarifies the optional filename's default behavior. This elevates the value beyond what the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific action ('Upload an audio track into a project by fetching a public http(s) URL server-side'), the exact resource, and explicitly distinguishes itself as 'the ONLY way' to get audio bytes into a project, contrasting with siblings that only reference filenames. This leaves no ambiguity about what the tool does or how it differs from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool, names the sibling tools it differs from (add_audio_overlay, update_audio_overlay), and explains the downstream workflow: pass the returned filename to add_audio_overlay or update_audio_overlay. It also specifies url requirements (direct, publicly-fetchable http(s), not auth-walled) and a size cap, making the usage context fully actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageAInspect
Upload an image into a project by fetching a public http(s) URL server-side (the still-image counterpart of upload_clip). The worker downloads the .png/.jpg/.jpeg/.gif/.webp/.svg, stores it in the project's asset bucket, and returns { filename, sizeBytes, contentType } — pass the returned filename to add_image_layer. Use this when you already have a direct image URL; to search an openly-licensed image pool instead, use find_public_image. The url must be a direct, publicly-fetchable http(s) link (not an auth-walled page). SVGs are rejected if they carry a , an inline event handler, a , a javascript: URL, or an external resource reference — supply a static, self-contained SVG. Buffered in Worker memory, so capped at 16 MiB.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Direct, publicly-fetchable http(s) URL of the image file (.png/.jpg/.jpeg/.gif/.webp/.svg). | |
| filename | No | Optional stored filename (.png/.jpg/.jpeg/.gif/.webp/.svg). Defaults to the basename of the URL path; sanitised to lowercase a-z0-9._-. | |
| projectId | Yes | Project to add the image to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden, and it delivers: it discloses server-side download/store behavior, the exact return shape { filename, sizeBytes, contentType }, SVG rejection criteria (script tags, event handlers, foreignObject, javascript: URLs, external resource references), and the 16 MiB cap with its cause ('Buffered in Worker memory'). This is far richer behavioral disclosure than most mutation tools provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description earns its place: purpose, behavior plus return contract, usage routing, URL constraint, SVG security policy, and size limit. The most decision-critical information is front-loaded, and nothing duplicates what the input schema already documents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description covers everything an agent needs to call it correctly: purpose, input constraints, return value shape, downstream chaining, and failure-relevant security and size limits. No critical operational detail is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful constraints beyond what the schema states: URLs must not be auth-walled, SVGs must be static/self-contained or they will be rejected, and the returned filename is meant to be passed to add_image_layer. This gives the agent selection semantics and downstream chaining context the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upload an image into a project') plus the mechanism ('fetching a public http(s) URL server-side'), making the operation unambiguous. It differentiates from siblings by naming itself as 'the still-image counterpart of upload_clip' and by pointing to find_public_image as the alternative image-pool search flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Use this when you already have a direct image URL; to search an openly-licensed image pool instead, use find_public_image.' It also states the exclusion criterion ('not an auth-walled page') and explicitly contrasts with upload_clip, so an agent knows exactly when to select this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
95 tool updates
- First observed
add_audio_overlay - First observed
add_caption_track - First observed
add_color_keyframe - First observed
add_curve - First observed
add_embed_origin - First observed
add_from_collection - First observed
add_image_layer - First observed
add_keyframe - First observed
add_keyframes - First observed
add_morpha_layer - First observed
add_page - First observed
add_shape - First observed
add_speed_keyframe - First observed
add_text_layer - First observed
add_to_collection - First observed
add_video_layer - First observed
apply_preset - First observed
apply_preset_stagger - First observed
clip_processing_status - First observed
create_account - First observed
create_project - First observed
cut_range - First observed
delete_page - First observed
delete_project - First observed
delete_version - First observed
describe_video - First observed
detect_text_regions - First observed
duplicate_layer - First observed
duplicate_project - First observed
fade_layer - First observed
find_public_image - First observed
fit_duration_to_content - First observed
freeze_frame - First observed
group_layers - First observed
inspect_layers - First observed
list_collection - First observed
list_fonts - First observed
list_projects - First observed
list_versions - First observed
list_workspaces - First observed
merge_caption_lines - First observed
move_band - First observed
move_layer - First observed
move_project_to_workspace - First observed
open_project - First observed
reid_project - First observed
remove_audio_overlay - First observed
remove_color_keyframe - First observed
remove_embed_origin - First observed
remove_from_collection - First observed
remove_keyframe - First observed
remove_layer - First observed
remove_speed_keyframe - First observed
rename_group - First observed
rename_layer - First observed
rename_project - First observed
rename_version - First observed
reorder_layer - First observed
reorder_pages - First observed
restore_version - First observed
safe_zones - First observed
save_version - First observed
select_page - First observed
set_canvas_size - First observed
set_clip_speed - First observed
set_custom_font - First observed
set_duration - First observed
set_embed_origins - First observed
set_group_box - First observed
set_group_parent - First observed
set_group_window - First observed
set_image_filename - First observed
set_keyframes_batch - First observed
set_layer_block - First observed
set_layer_fill - First observed
set_layer_text - First observed
set_layer_transition - First observed
set_layer_visible - First observed
set_loop - First observed
set_matte_source - First observed
set_pivot - First observed
set_style - First observed
set_text_background - First observed
set_track_loop - First observed
set_video_clip - First observed
set_video_layer_muted - First observed
set_video_layer_trim - First observed
shift_group - First observed
shift_track - First observed
split_caption_line - First observed
transcribe_clip - First observed
ungroup_layers - First observed
update_audio_overlay - First observed
upload_audio - First observed
upload_image
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Edit video by talking to your AI — search footage, cut timelines, apply effects, add captions.
Create and edit AI videos from chat: plan shots, generate scenes, and export stories and ads.
AI video editing + publishing: turn clips into vertical shorts, post to TikTok/Instagram/YouTube.
- VidmoatOAuthcom.vidmoat
AI video editor: create projects, edit timelines, add captions and effects, and render videos.
Related MCP Servers
AlicenseAqualityAmaintenanceEnables turning e-commerce products into short-form vertical videos for TikTok, Instagram Reels and Stories, with tools for importing products, editing creative direction, and rendering videos.100MIT- AlicenseNot gradedqualityCmaintenanceEnables AI agents to autonomously edit videos into publish-ready vertical short-form content, including silence removal, subtitle generation, voiceover synthesis, color grading, and composite pipeline creation.MIT

Rendley MCPofficial
AlicenseNot gradedqualityFmaintenanceGives an AI assistant a full video editor: connect it once, then create and edit video by describing what you want.Apache 2.0- FlicenseNot gradedqualityBmaintenanceEnables AI agents to read, edit, and export real video projects with a full multitrack timeline, effects, captions, and export capabilities.2-
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
The tool set has several clusters that overlap conceptually: add_keyframe/add_keyframes/set_keyframes_batch, move_band/move_layer/shift_group/set_group_window, and fade_layer/set_layer_transition/set_layer_visible all target similar actions. However, each tool's description is distinct and detailed enough for an agent to disambiguate after careful reading. The sheer volume of 95 tools still creates meaningful selection risk.
Tool names overwhelmingly follow a verb_noun snake_case pattern (add_, remove_, set_, list_, rename_, create_, delete_), which is predictable and readable. Minor inconsistencies exist: plural variants like add_keyframes vs add_keyframe, mixed specificity like remove_keyframe vs remove_color_keyframe, and a few oddballs like reid_project and clip_processing_status. Overall the pattern is strong and helps navigation.
95 tools is far beyond the well-scoped range and will overwhelm agents; even a comprehensive video editor could consolidate keyframe batch operations, overlay/track manipulations, and page/group window controls. Many tools are highly specific (reid_project, safe_zones, move_band) and place burden on the agent to pick among near-synonym verbs. While the broad domain justifies many operations, this count is excessive for a coherent tool surface.
The surface covers a broad editing lifecycle: layers, keyframes, text, captions, audio, pages, groups, versions, projects, workspaces, and collections, including batch operations. However, there is no MCP tool to render/export the final MP4 (explicitly delegated to an SDK) and no upload_video tool for bringing in a clip file, leaving major end-to-end gaps. For the stated purpose of building and editing videos, these are significant omissions that force agents to stop short of delivery.