MorphaReels
Server Details
AI editor to build, animate & export layered short-form video projects via one tool catalog.
- Status
- Healthy
- Uptime
- 100.0% over 42 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 100 tools
Most tools target distinct operations, but several clusters overlap: add_keyframe/add_keyframes/set_keyframes_batch; apply_preset/apply_preset_stagger; fade_layer/set_layer_transition; add_video_layer/set_video_clip/set_video_layer_trim. The detailed descriptions help, but with 100 tools an agent can still easily pick the wrong variant.
Names are consistently snake_case and mostly follow verb_noun (add_text_layer, remove_layer, set_layer_fill). Minor deviations include noun/status-style names such as safe_zones, render_status, clip_processing_status, and the odd reid_project.
A 100-tool server is an extreme mismatch for a single MCP toolset, well beyond the 50+ threshold for severe over-scoping. The video-editor domain is complex, but the surface needs consolidation or grouping rather than exposing every operation separately.
Coverage is very broad: project/page CRUD, layers, keyframes, styles, text, audio, captions, groups, versions, workspaces, embeds, rendering, uploads, OCR, and transcription. Remaining gaps include no MCP-side video upload, no workspace deletion or membership management, and no audio volume/fade controls.
Available Tools
100 toolsadd_audio_overlayAdd audio overlayAInspect
Add an audio overlay (mp3/m4a/wav/ogg) scheduled at a frame-aligned start. The asset must already be uploaded (upload_audio, or the editor for a file from the person's disk); pass the upload's returned filename, and its name as the track's label. 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. | |
| name | No | Optional label people see on the track: pass the upload's returned `name`. | |
| endFrame | No | Optional end frame; omit to play the asset's full natural length from startFrame. | |
| filename | Yes | The stored audio filename an upload returned. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=false and destructiveHint=false already declared, the description sensibly focuses on effect rather than safety: the overlay "Plays in the editor preview and is mixed into the MP4 export," which tells the agent where the change surfaces. It does not cover failure modes (e.g., bad filename, overlapping overlays), but output schema covers the response 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?
Four dense sentences, front-loaded with purpose first and prerequisites second, with no filler. The only mild redundancy is restating the upload's `filename`/`name` binding that the schema also 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 9-parameter mutation tool with an output schema and annotations, the description supplies the important missing context: accepted formats, the upload prerequisite, the fps math, and the ultimate effect on preview/export. Minor gaps remain around error behavior and how this interacts with an existing overlay on the same track.
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 earns above baseline by supplying the conversion rule "frames = round(s * 30)" at 30 fps and tying `filename`/`name` to the upload's returned values, which directs how to populate required and optional fields. The remaining params (gain, fades, sourceLayerId) are documented adequately in the schema itself.
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?
Opens with a specific verb + resource ("Add an audio overlay") and enumerates accepted formats (mp3/m4a/wav/ogg), plus the frame-aligned scheduling constraint. It also names the sibling that must run first (upload_audio), so an agent can place this tool in the workflow without opening a 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?
States a clear prerequisite ("The asset must already be uploaded") and points to upload_audio as the alternative entry point, plus how to derive the label from the upload's returned `name`. It stops short of naming update_audio_overlay/remove_audio_overlay as the alternatives for editing or deleting an existing overlay, so the when-not case is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_caption_trackAdd 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say the tool is not read-only and not destructive; the description carries the full behavioral burden and does so richly. It discloses hold-eased opacity keyframes, active-line karaoke behavior, the always-wrapped 'captions' group, welding semantics with clip trim, and the return of element ids plus groupElementId. All of this goes well beyond the structured 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 dense but every sentence earns its place: mode explanation, karaoke effect, styling, defaults, grouping, return value. It front-loads the core purpose and then increments detail in a logical order. 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 tool with 9 parameters, two modes, nested line objects, and welding behavior, the description covers defaults, frame semantics, group wrapping, return values, and the relationship to other tools like transcribe_clip. The existing output schema is mentioned and the return ids are explained. Nothing an agent needs to invoke 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 parameters are well documented in the schema itself. The description adds extra semantics on top, including the 30fps frame-index convention, the default lower-third position, and the practical purpose of clip_element_id for spreading lines across split source clips. This is meaningful interpretive 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-resource pair ('Build a caption track from pre-timed lines') and immediately clarifies the two modes. It is clearly distinct from sibling tools like add_text_layer, merge_caption_lines, and split_caption_line because it describes building a complete timed caption track with wrapping and styling.
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 usage context, including the provenance of input ('derived from transcribe_clip's word timings'), the default lower-third placement, and the caption-group wrapping behavior. It does not explicitly name alternative tools or say 'use this instead of X', but the detailed behavior makes the intended scenario obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_color_keyframeAdd color keyframeADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is known. The description adds valuable behavioral context: 'Add or overwrite' (idempotent overwrite semantics), 'adjacent keyframes crossfade stop-by-stop' (interpolation behavior), '30 fps; frame is 0-indexed' (timing convention), and the special background.canvas synonym. This goes beyond the schema and 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?
Four dense sentences with zero filler. The core action and target are front-loaded, followed by the special-case background synonym, value semantics, and timing convention. Every sentence earns its place and adds non-redundant 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 essential call semantics: what is mutated, the target format, the value type, interpolation behavior, and timing. The output schema exists, so return values don't need explanation. Minor gap: it doesn't mention whether the keyframe is inserted into an existing track or creates one, but the 'fill track' phrasing and overwrite semantics make this largely inferable.
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 6 parameters thoroughly, including the Fill object variants and easing enum. The description adds a few nuances (crossfade stop-by-stop, 0-indexed frame, background.canvas synonym) but mostly reinforces what the schema already says. 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 states a specific verb ('Add or overwrite'), a precise resource ('colour keyframe on a fill track'), and the target scope ('leaf (shapes.<id>, image.<id>, video.<id>, group.<id>)'). It clearly distinguishes itself from generic add_keyframe/add_keyframes siblings by specifying the fill track and color value semantics.
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 this tool: when targeting a fill track with a color/Fill value. It also clarifies the special 'background.canvas' synonym for the pinned is_background image_layer. However, it doesn't explicitly state when NOT to use it or name alternatives like set_layer_fill or remove_color_keyframe, 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.
add_curveAdd 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) already establish it as a non-destructive mutation. The description adds that the curve is 'editable' and explains arrowhead behavior, but it does not discuss side effects, reversibility, or interaction with existing content. Given annotation coverage, this is adequate but not extensive.
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, front-loaded with purpose and use case, then parameter details. No redundant or vague phrasing. 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 description covers endpoints, bend, color, stroke, arrowhead, and use case. The required projectId is described in the schema with context ('selects which existing project this call mutates'). An output schema exists (per context signals), so return format is not needed. It is reasonably complete for an add 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?
With 89% schema coverage, the baseline is 3, but the description adds meaningful clarifications: 'bend pushes the midpoint perpendicular (px, 0 = straight line, positive/negative curves either way)' and the default for arrow_head ('none|end|both (default end)'). It also clarifies units ('canvas pixels'), going beyond the schema 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 states the tool draws an editable arrow/curved line, a stroked quadratic bezier with arrowhead. It specifies the verb (draw), resource (arrow/curved line), and even a concrete use case ('callout arrows'), distinguishing it from siblings like add_shape or add_text_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?
It explicitly provides a when-to-use context: 'Use this for callout arrows (e.g. swooping into a link).' This gives clear guidance on when to apply the tool. However, it does not mention alternatives or when not to use it, which would elevate it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_embed_originAdd 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). Morpha sends that website no request; any page on it may then load the project. Reference: https://morphareels.ai/docs/tools#addembedoriginorigin
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' readOnlyHint=false and destructiveHint=false, the description discloses idempotency ('re-adding an existing entry is a no-op') and the normalization rule (scheme/port/path stripped to a bare lowercased hostname). It also adds the security-relevant detail that Morpha sends the allowlisted website no request, so an agent understands what granting embed access entails.
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 sentences plus a documentation reference, with the primary purpose front-loaded. Each sentence earns its place: purpose, idempotency, normalization, and the no-request security note. The prose is slightly dense for a simple 2-param tool, which keeps it from a perfect score.
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 2-param tool with 100% schema coverage, a true output schema, and annotations covering the mutation safety profile, the description covers everything an agent needs: purpose, idempotency, normalization, and access implications. The reference link provides an escape hatch for deeper questions, and return-value details are left to the output schema.
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 fully documented in the input schema, so the description carries no additional parameter burden. The description's normalization note mirrors — rather than extends — the schema's own origin field description. Baseline 3 is appropriate when the schema does the heavy lifting.
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: 'Add one hostname to the project's embed allowlist.' It distinguishes itself from the many sibling add_* tools (add_audio_overlay, add_caption_track, etc.) by naming its exact target, and the 'one hostname' phrasing separates it from set_embed_origins and remove_embed_origin. An agent can select it correctly 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 clear context — this is an incremental, idempotent addition to the allowlist, explicitly scoped to a single hostname per call. It does not explicitly name alternatives like set_embed_origins for wholesale replacement or remove_embed_origin for removal, so exclusions are left implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_from_collectionAdd 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly discloses behavior beyond annotations: it creates a fully detached copy with fresh ids, brings children with groups, carries image/clip/font bytes, preserves canvas position, and guarantees source deletions/changes never affect the copy. It also explains live-editor pickup behavior within seconds and the return value, giving the agent a complete mental model.
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 unique, necessary information: core operation, parameter mapping, copy semantics, prerequisites, live pickup, and return shape. It is front-loaded with the primary purpose and maintains a logical flow without repetition 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 tool with copy semantics, group behavior, detachment guarantees, and prerequisites, the description covers everything an agent needs to call it correctly: what ids to pass, what happens during the copy, what constraints exist, and what to expect in the response. An output schema exists, so return-value documentation is not a 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?
The schema already documents all three parameters with 100% coverage, so the baseline is 3. The description adds value by clarifying the roles of projectId (destination) versus sourceProjectId (home project), explicitly tying elementId to list_collection output, and reinforcing that fresh ids are generated.
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: adding an item from the user's Collection into a project as a self-contained copy. It clearly distinguishes this from sibling tools like add_to_collection, which moves items into a collection, and list_collection, which lists collection items.
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 invocation context: use list_collection to obtain sourceProjectId and elementId, and pass the destination projectId. It also states prerequisites (the element must be in the source project's collection and readable), though it does not explicitly contrast with alternatives like add_to_collection or remove_from_collection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_image_layerAdd image layerAInspect
Add an image layer. The image must already be uploaded: upload_image takes a web URL or a file attached in the chat, and a file from the person's disk is uploaded in the editor. Every upload returns { filename, name, width, height }: pass filename (the stored file's id) here, and name as the layer's label. SIZE THE BOX TO THE PICTURE: pass width alone (or height alone) and the other side is filled from the image's own aspect, so the picture is never stretched; a box with both sides that does not match the image's aspect stretches the picture to fill it. 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. | |
| name | No | Optional label people see in the Inspector and Timeline: pass the upload's returned `name`. Without it the layer is labelled by an older project's own filename, or by kind; never by a stored id. | |
| 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 | No | Width in px (> 0). Omit it to derive it from `height` and the image's aspect. | |
| height | No | Height in px (> 0). Omit it to derive it from `width` and the image's aspect; the usual call passes `width` alone. | |
| filename | Yes | The stored filename an upload returned (an id such as 3f2a9c1e-….png, or an older project's own name). | |
| projectId | Yes | Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly=false, destructive=false, openWorld=false, so the bar is lower. The description still adds valuable behavior: the aspect-preserving sizing rule (passing both non-matching sides stretches the picture), and the auto-assigned fresh id when duplicating. It doesn't state permissions or what happens on an invalid/missing filename, but the sizing-stretch warning is exactly the kind of trap 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?
Front-loaded with purpose and prerequisite, which is good. But the block/name/filename semantics are partially duplicated from the already-detailed schema descriptions, and the all-caps 'SIZE THE BOX TO THE PICTURE' plus repeated aspect explanation adds bulk. It's informative but not tightly trimmed.
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-param, nested-object, mutation tool with an output schema, the description covers the key traps: upload prerequisite, filename-vs-name mapping, aspect-based sizing, and duplication. The `block` default (persistent overlay vs bounded clip) is left entirely to the schema, but the output schema means return values needn't be explained. Mostly 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 100%, so baseline is 3. The description nonetheless adds semantics beyond the schema: it maps the upload's returned `filename` to the stored id and `name` to the label, and clarifies that passing width alone derives the other side. The duplication-by-filename trick is a meaning-level addition not 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?
States a specific verb and resource ('Add an image layer') and distinguishes itself from siblings by explaining the upload prerequisite via upload_image versus reusing an existing filename to duplicate. An agent can tell this apart from add_shape, add_text_layer, or upload_image 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?
Explicitly names upload_image as the prerequisite and its two input modes, and gives the alternative path for duplicating an existing layer by reusing its filename. The 'usual call passes width alone' guidance, mirrored in the schema, adds a clear default behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_keyframeAdd keyframeADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations by disclosing overwrite behavior, override of static base values, absolute vs. offset coordinate spaces for leaves/groups, 30 fps timing, scale pivot behavior, and opacity range. This fully complements destructiveHint=true with concrete mutation semantics.
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 adds necessary semantic information, starting with the core action and then layering coordinate rules, group behavior, scale/opacity conventions, and the override caveat. There is no filler or 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 nuanced tool with curved, width, height, and group-specific behavior, the description is mostly rich but incomplete: it omits semantics for width, height, and curve keyframes, and never addresses when the specialized sibling keyframe tools should be preferred. An output schema exists, so return values need not be explained, but the property coverage gap remains.
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?
With 83% schema coverage, the baseline is already good, and the description adds meaningful semantics for value and frame: canvas units, degrees, scale relative to 1, opacity 0..1, and fps. The main gap is that width, height, and curve property values are not semantically explained beyond the schema 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 clearly identifies the action as adding or overwriting a keyframe on a layer's animation track, which is a specific verb and resource. However, it does not explicitly differentiate itself from sibling tools like add_color_keyframe or add_speed_keyframe, so it stops short of full sibling distinction.
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 explicit statement of when to use this tool versus specialized siblings such as add_color_keyframe, add_speed_keyframe, or set_keyframes_batch. The detailed coordinate semantics imply animation use, but the agent is left to infer routing between alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_keyframesAdd keyframesADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag mutating/destructive behavior, and the description adds useful side-effect context: it can fold set_track_loop into the same call and factors elementId/property out of the caller's loop. It does not spell out whether existing keyframes are replaced or appended, but that is not required once destructiveHint and output schema are present.
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 distinct jobs: purpose, use case, alternative. The purpose and key constraint are front-loaded, and the examples are compact and illustrative 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?
For a 5-parameter mutation tool, the description plus rich schema, annotations, and output schema cover what the tool does, when to use it, and how it differs from the closest sibling. No critical calling decision is left unaddressed.
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 (80%) and already documents elementId, keyframes, projectId, and loop with enums/defaults. The description adds contextual meaning for elementId/property factoring and loop-mode folding, but it does not materially explain parameter formats beyond the schema, so the high-coverage 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-plus-resource statement: 'Add many keyframes to ONE element's ONE property in a single call,' then narrows scope (per-layer tracks) and explicitly contrasts with set_keyframes_batch. This makes the tool unambiguous among the many add_* and 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?
It states the intended scenario ('idiomatic form when every layer in a multi-element animation gets its own track') and gives explicit alternative routing ('Use set_keyframes_batch instead when you need to mix elements/properties in one atomic call'). This is exactly the when/when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_pageAdd 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. Versions or options of one video (styles to pick from, hooks, languages, a sheet's rows) are pages of ONE project (add_page, duplicate_index), never separate projects: the preview turns pages and exports one video per page. To edit the copies, select_page each one and describe_video for its element ids; to export them, use the editor's Videos option or renderVideo with page.
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds real behavioral context beyond that — no page-count limit, the new page becomes active, its index is returned, and deep-copy mints a fresh id. These are operationally important facts an agent cannot get from the 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?
Front-loads the core action and mode distinction, then follows with the conceptual model and follow-up tooling. It is somewhat dense and long, but nearly every sentence carries operational value; only the conceptual 'versions are pages' explanation could be trimmed marginally.
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?
An output schema exists so return values needn't be detailed, yet the description still notes the index is returned. Combined with the mode explanations and sibling routing, an agent has everything needed to call this 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 is 3, but the description goes further by explaining the two distinct modes of duplicate_index (deep-copy at a 0-based index vs blank append) and the canvas sizing of blank pages. It adds meaningful semantics over the schema's terse parameter text.
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?
Starts with a specific verb+resource ('Append a page to the project') and immediately clarifies scope by noting it works on any project and converts single-page videos into multi-page ones. This clearly distinguishes it from siblings like create_project, duplicate_project, and reorder_pages.
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 splits behavior on the duplicate_index parameter: blank append without it, deep-copy with it. It also names follow-up siblings (select_page, describe_video) and export routes (editor Videos option, renderVideo with page), and clarifies that styles/hooks/languages/rows are pages of ONE project rather than separate projects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_shapeAdd 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. A new shape stacks ON TOP of every existing layer: for a background colour or gradient use set_layer_fill on "background.canvas", not a canvas-sized shape, and to place a shape behind other layers follow with reorder_layer. A shape that covers the whole canvas returns a warning naming the layers it hides.
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, destructiveHint=false) but the description adds crucial beyond-schema behavior: new shapes stack ON TOP of every layer, default positioning in canvas centre when x/y/w/h omitted, and a warning when a shape covers the whole canvas naming the hidden layers. It doesn't mention permissions or the return payload, but that's a minor gap given the output schema exists.
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?
Front-loaded with purpose, then kind enumeration, then behavioral warnings. The 38-item kind list is long but serves the required enum and reinforces vector-not-image intent, so it earns its place. Slightly dense but efficient.
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 8 params, nested block object, an output schema, and read-only annotations, the description supplies the layer-stacking, default-position, and background-alternative context needed to call correctly. Missing only minor details like what the response returns (covered by output schema) and block-timing guidance beyond the schema.
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 has to compensate, and it does for the most ambiguous params: it explains kind values (redundantly with the enum but emphasizes native-vector intent) and the default position behavior for omitted x/y/w/h. It adds no detail on color format beyond the schema or on block timing, leaving a partial gap.
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 ('Add a shape layer') and immediately enumerates the exact primitive kinds the kind parameter accepts, distinguishing the tool from add_image_layer by insisting on native vectors. An agent can tell it apart from siblings 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?
Explicitly names the alternatives and when to use them: 'never substitute an image layer', 'for a background colour or gradient use set_layer_fill on "background.canvas"', and 'to place a shape behind other layers follow with reorder_layer'. This is textbook when/when-not/alternatives routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_speed_keyframeAdd speed keyframeADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation is known. The description adds valuable behavioral context: the curve is anchored to the clip, moving the clip carries the ramp and never changes duration, and the ramp multiplies the layer's constant speed. It also explains the derived timeline length. This goes beyond the 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 well-structured and front-loaded with the core action. Every sentence adds value: the overwrite behavior, the frame constraint, the anchoring behavior, the alternative tool, and the rate semantics. No 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 output schema exists and annotations cover the destructive nature, the description is complete. It covers the key behavioral nuances (anchoring, duration derivation, rate range, frame constraint) that an agent needs to invoke the tool correctly. The alternative tool is named, and the mutation target is clear.
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 parameters. The description adds meaning by explaining the relationship between frame and the clip's timeline_start_frame, and how rate values map to real-time/half-speed/double-speed. It also clarifies that the curve is anchored to the clip, which is not 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 clearly states the tool's function: 'Add or overwrite a speed-ramp (time-remap) keyframe on a video layer' with a specific rate that changes over the clip. It distinguishes itself from set_clip_speed for constant speed, and from sibling tools like add_keyframe and remove_speed_keyframe by specifying the speed-ramp context.
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 this tool vs alternatives: 'For a constant slower/faster clip use set_clip_speed instead.' It also provides constraints like frame must sit on the clip and rate range, giving clear context for when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_text_layerAdd 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 "Hanken Grotesk", 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.), plus text_box (the painted box, measured from the font's glyphs), fits ({canvas, safe_area}, judged at the layer's static position) and, when the text runs past either, a warning naming the text_size that fits: add \n line breaks or lower text_size.
| 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". Defaults to "Hanken Grotesk". | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint=false and destructiveHint=false, the description adds substantial behavioral context beyond them: the returned values (layer id, element id, text_box, fits, and an overflow warning naming a fitting text_size), the block/keyframe sampling semantics, curve clamping (±135, single-line only), and the caveat that decorations are not rendered on curved text. That is rich disclosure 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 purpose is front-loaded in the first clause and the densest material (autofit modes, block semantics, return values) comes later, so an agent can stop early. It is a long, single-paragraph block and repeats a few schema details, which keeps it just below the top score, but for a 23-parameter tool most sentences carry real 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?
Given the complexity (23 params, nested objects, enums) and the presence of an output schema, the description covers what it must: purpose, defaults, the block/always-present decision, autofit trade-offs, curve behavior, and even a summary of the return payload. Nothing an agent needs in order to call this 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 largely restates what the schema already documents (defaults for x/y/width/height/font_family, the outline and shadow params, the derivation rule for text_size) rather than adding syntax or format detail the schema lacks. It does not materially compensate for anything, so the baseline stands.
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 opening sentence gives a specific verb+resource ('Create a new text layer') and immediately characterizes what kind of object it produces ('a first-class leaf that animates, groups, and z-orders exactly like an image or shape'). This cleanly separates it from the other add_* leaf tools such as add_image_layer and add_shape, so an agent can identify it without opening a 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 genuine context cues: it says the default (no `block`) is 'what an agent-placed watermark / lower-third almost always wants' and enumerates when each `text_autofit` mode is appropriate. It does not, however, explicitly route the agent against alternatives like add_caption_track or set_layer_text, so it stops just short of the 5 anchor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_to_collectionAdd 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=false and destructiveHint=false; the description carries the full burden of behavioral disclosure. It explains that adding copies the entire subtree and asset bytes, making copies immutable, and that editing/deleting the source won't affect placed copies. It also notes that teammates can access the collection if the project is in a workspace. This is rich behavioral context with no contradiction 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 is front-loaded with the core purpose, then systematically explains input types, side effects (immutability), team sharing, and a prerequisite. Every sentence adds unique value—no filler. Though lengthy, it is appropriately sized for the tool's complexity and reads 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?
The description covers all necessary aspects: what it does, what inputs are valid, what happens to the element, how copies behave, applicability to solo projects, and a naming prerequisite. It also references related tools (list_collection, add_from_collection). With an output schema present, return details are not needed. Nothing essential is missing for an agent to invoke this 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 both parameters are already documented. The description adds value beyond the schema by detailing what elementId can accept (leaf or group ids with examples like lower-third, logo sting) and emphasizes naming before adding. This goes beyond the schema's generic description, though projectId is not elaborated 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 verb ('Add') and resource ('layer to the user's reusable Collection'). It distinguishes from siblings like add_from_collection (which places a copy into another project) and list_collection (which lists the collection). The explanation of leaf vs. group ids further clarifies scope, 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 tells when to use this tool (to add a layer to the reusable collection) and points to the alternative add_from_collection for placing a copy elsewhere. It also provides a prerequisite (rename the layer first) and clarifies applicability to solo projects, giving the agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_video_layerAdd video layerAInspect
Add a video layer. The clip must already be uploaded; clips are uploaded in the MorphaReels editor. An upload returns { filename, name }: pass filename (the stored clip's id) as clip, and name as the layer's label. 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 | The stored clip filename an upload returned (an id such as 3f2a9c1e-….mp4, or an older project's own name). | |
| name | No | Optional label people see in the Inspector and Timeline: pass the upload's returned `name`. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds real context beyond that: the upload prerequisite, the shape of the upload return ({ filename, name }), and that the editor auto-assigns a fresh id on duplication. It does not describe failure modes (e.g. what happens with an invalid clip), keeping it from a 5.
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?
Front-loads the action, then prerequisite, then the parameter mapping, then the duplication shortcut. Each sentence earns its place, though the clip/name mapping is somewhat dense relative to what the schema already conveys.
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 an output schema present, return values need not be explained, and the prerequisite plus id semantics are covered. The main remaining gap is the absence of any failure/validation behavior, which is minor for this create 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 coverage is 100% and the schema already documents each parameter, including that `clip` is a stored filename and `name` is the label. The description's mapping of the upload's { filename, name } onto `clip`/`name` largely restates that, so the baseline 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?
States a specific verb and resource ('Add a video layer') that is immediately distinguishable from the sibling add_image_layer, add_text_layer, and add_audio_overlay. The scope 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?
Gives a clear prerequisite ('The clip must already be uploaded; clips are uploaded in the MorphaReels editor') and a specific alternative path ('To duplicate an existing layer, reuse its clip filename'). It does not explicitly name sibling tools or state when-not to use this tool, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_presetApply presetCDestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that the tool is destructive and mutating; the description adds no behavioral detail beyond that. It does not disclose what gets overwritten, such as existing keyframes or animation settings, nor does it mention any prerequisites 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?
A single, front-loaded sentence states the essence of the tool with no filler or repetition. It earns its place entirely, even though other dimensions lack 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?
Combined with the schema's descriptions for projectId and startFrame, the destructive annotation, and the self-explanatory preset enum, the agent probably can invoke the tool correctly. However, the description remains thin around parameter semantics and the exact effect on the layer's existing animation.
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?
With 50% schema description coverage, the description should compensate for undocumented parameters, but it does not. It gives no meaning to elementId or the preset enum values, and the only indirect hint is that the target is a layer.
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 operation (apply), the resource (a layer), and the kind of input (a canned animation preset). It does not explicitly distinguish itself from the sibling apply_preset_stagger, 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 when-to-use or when-not-to-use guidance is provided. The description does not point to alternatives like apply_preset_stagger or fade_layer, nor does it explain when a plain preset is appropriate versus a custom animation or staggered application.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_preset_staggerApply preset staggerADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true. The description adds the startFrame calculation and ordering semantics, which is useful context, but it does not disclose specific side effects beyond what annotations carry (e.g., whether existing animations are overwritten or whether it is reversible).
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 no filler: the main purpose is front-loaded, followed by use cases, then the exact calculation and ordering instruction. 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 has an output schema and clear annotations, so the description needn't cover return values. It explains the core behavior, formula, and ordering, and distinguishes from apply_preset. Minor gaps like edge cases (negative stagger) or prerequisites are 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 coverage is 80%, so the baseline is 3. The description adds meaning beyond the schema by explaining the relationship between startFrame, stagger, and elementIds with the formula `startFrame + i * stagger` and the ordering requirement, which is not present 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 ('Apply'), resource ('the same preset to a LIST of layers'), and the distinguishing feature (per-element startFrame offset). It explicitly contrasts with apply_preset and gives concrete use cases, so an agent can immediately tell it apart from 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?
It clearly names apply_preset as the alternative and explains when to use this tool ('one call instead of N apply_preset calls', 'For diagonal pop-in grids...'). It lacks an explicit when-not clause, but the context is strong enough that an agent can infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clip_processing_statusClip processing statusARead-onlyInspect
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, and the Morpha editor builds any missing proxy for every page's clip when the project is opened. The other steps run in the editor too. Returns { ok: true, data: { clips: [{ clip, processed, steps: { proxy, audio_split, transcript, text_regions } }], allProcessed } }, where each step is 'ready' | 'pending' | 'running' | 'unavailable' | 'cancelled' | 'error'. 'cancelled' is a transcript the user stopped in the editor: it stays stopped across opens, and only the editor's Re-run starts it again. audio_split stays 'pending' until the user splits the clip's audio into its own track in the editor (Inspector → Audio → Split audio); it never gates processed, and an unsplit clip plays its own sound. 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/non-destructive annotations by disclosing that processing never runs on the server, that the preview proxy is mandatory and auto-built by the editor on project open, the 'cancelled' transcript persistence behavior, and that audio_split never gates `processed`. These are non-obvious behavioral traits an agent cannot infer from 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?
Purpose and usage are front-loaded effectively, but the long prose walkthrough of the return object and its enum values is largely redundant given an output schema exists. The 'cancelled'/'audio_split' notes earn their place; the inline response shape does not.
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?
Covers the full behavioral picture for a read-only status probe and explains the step-state semantics thoroughly. It is more complete than needed since the return format is duplicated from the output schema, but nothing an agent needs 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 parameters including the 'omit clip to report every video clip' semantics. The description restates that omission behavior rather than adding syntax or format detail beyond the schema, so the baseline 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?
States a specific verb (report) and resource (clip processing status), and enumerates exactly what the pipeline covers: proxy build, audio split, transcription, OCR. An agent can immediately distinguish this read-only status probe from the mutation siblings like transcribe_clip 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?
Explicitly names the downstream alternatives it gates: 'Use it to know whether transcribe_clip / detect_text_regions will return data.' It also states the precondition that processing is browser-side, not server-side, so the agent knows this is the only way to learn the state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectCreate projectAInspect
Create a new project and return its server-minted id. The id is an opaque v4 UUID assigned automatically, not chosen by the caller; people see the project's 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. Options or versions of one video (styles to pick from, hooks, languages) are pages of ONE project (add_page, duplicate_index), not new projects: the chat preview turns pages, and separate projects cannot be flicked between.
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The project that was created, blank or cloned. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is not read-only and not destructive; the description adds substantial context beyond that – what gets copied on clone (JSON, assets, clips), workspace inheritance, the edit-role requirement, the hard failure for view-only sources, and the editor not auto-refreshing. That is exactly the kind of behavioral detail an agent cannot infer from 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?
Front-loaded with the core action and return value, but the single block mixes creation, cloning, workspace rules, and page-vs-project guidance; it is dense and could be broken into clearer sentences. Every sentence is relevant, but the structure is harder to scan than ideal.
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 an output schema and rich sibling set, the description covers default behavior, override paths, failure modes, and disambiguation from related tools. Nothing an agent needs in order to call it correctly appears to be 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 nevertheless adds meaning – that name is user-facing, that fromProjectId triggers cloning with specific copy semantics, and the three-way behavior of workspaceId (omit=follow source, id=place, null=personal). It does not add syntax beyond the schema but reinforces the operational consequences of each 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?
States a specific verb and resource ('Create a new project') and immediately clarifies the returned id is server-minted and opaque. It explicitly contrasts with sibling duplicate_project and with add_page/duplicate_index, so an agent can tell this apart from cloning or page-level 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?
Gives explicit when/when-not conditions: blank project by default, pass fromProjectId ONLY to clone, pass workspaceId or null to control placement, and use add_page/duplicate_index for versions of one video. It names the alternatives (duplicate_project, add_page, duplicate_index) and the failure mode when cloning a view-only workspace project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_workspaceCreate workspaceAInspect
Create a new workspace (a shared team space) owned by the caller, and return it as { id, name, role, memberCount }. Use this when the user wants a new place to group projects — then move_project_to_workspace files projects into it, and create_project can place new ones there directly. The caller becomes its owner. Requires an account with an email (workspace membership is email-based), so a keyless identity cannot create one. Refuses with a conflict if the caller already owns a workspace with the same name, which is almost always a repeated request rather than a genuine second workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable workspace name, shown verbatim in the workspace switcher. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: discloses the return shape { id, name, role, memberCount }, the ownership side effect, the email-account requirement (keyless identities cannot create), and the conflict-on-duplicate-name behavior. Annotations only state it's non-read-only and non-destructive.
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?
Purpose is front-loaded, return shape is early, and each sentence carries distinct information (what it does, when to use, follow-on tools, auth requirement, conflict behavior). Dense but well-organized; only the parenthetical is slightly expendable.
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?
Covers return values, side effects, prerequisites (email account), error behavior (conflict), and integration points with sibling tools. With an output schema present, the return-value sentence is still useful for agent planning; nothing material 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 `name` parameter is already documented (verbatim in switcher). The description adds the uniqueness constraint (duplicate name → conflict), which meaningfully extends 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?
Specific verb+resource ("Create a new workspace") with a parenthetical clarifying what a workspace is and stating the caller becomes owner. Clearly distinguishes from sibling list_workspaces, rename_workspace, and move_project_to_workspace.
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 says when to use it ("when the user wants a new place to group projects") and names the follow-on tools (move_project_to_workspace, create_project) that consume the created workspace. Also explains the conflict-refusal case for repeated requests.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cut_rangeCut rangeADestructiveInspect
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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantial behavioral context: it shifts every keyframe/marker/audio overlay/loop region/start_at, splits straddling video layers, truncates interior audio overlays, refuses on speed-ramp layers, shrinks composition length, and clamps endFrame. This goes far beyond the annotations and is critical 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 dense and front-loaded with the core operation, then details consequences and refusals. It is long but every sentence adds a distinct behavioral fact. It could be slightly more concise, but the complexity of the operation justifies the length.
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 complexity of a ripple delete with source-aware video layers, speed ramps, audio overlays, and composition length changes, the description covers all the edge cases an agent needs to predict the outcome. The output schema exists, so return values don't need explanation. 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 description coverage is 100%, so the schema already documents all three parameters. The description adds meaning by explaining the frame semantics (0-indexed, 30 fps, exclusive endFrame, clamped to composition length) and the delta calculation, which is not fully in the schema. It doesn't add per-parameter detail beyond that, but the schema already covers the basics.
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 ('Ripple-delete'), the resource ('a time window [startFrame, endFrame)'), and the exact effect ('remove that span and pull all later content earlier by delta'). It clearly distinguishes this from other timeline operations like set_video_clip or move_band, and the title/description align.
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 (ripple delete / close gap) and when NOT to: it 'REFUSES to cut across a video layer that carries speed-ramp keyframes' and instructs to 'remove them, or cut outside that layer's span, first.' This is explicit exclusion guidance beyond what the schema provides.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_pageDelete pageADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive, and the description adds meaningful edge-case behavior beyond that: out-of-range failure, the one-page minimum, and exactly how active_index changes when the active page is deleted. This is the kind of behavioral context that agents need.
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, front-loaded with the primary action, then the edge cases. Every sentence carries necessary information and there is no 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?
With a destructive annotation, a full output schema, and 100% parameter coverage, the description adds exactly what was missing: the project invariant and active-index fallback behavior. Nothing an agent needs to call this correctly is absent.
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 parameters are already documented in the schema. The description reinforces that `index` is the page position, but it doesn't add meaningful 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 uses a precise verb-resource pair ('Remove the page at `index`') and immediately distinguishes itself from related operations like add_page, reorder_pages, and delete_project. The scope (a single page within a project) 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?
It clearly states the context in which the call succeeds and the invariant that limits it (a project must keep at least one page). It does not explicitly name alternatives, but the failure conditions give enough guidance to avoid misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_projectDelete projectADestructiveInspect
Move a project to Recently deleted. It leaves every project list at once and can be restored for 30 days, with restore_project or from the person's projects page; after that it is deleted for good, with its saved versions, uploaded images and clips. Returns { name, purgeAt, restorable: true }, where purgeAt is when it will be deleted for good (epoch ms). Deleting for good before then is the person's own step on their projects page; no tool does it. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/readOnlyHint annotations by disclosing reversibility and its 30-day limit, what is ultimately destroyed (saved versions, uploaded images, clips), the auth roles accepted, the opaque not-found response for unauthorized callers, and the last-project edge case. This is unusually rich behavioral context 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?
Front-loads the core action in the first clause, then layers restore window, return shape, auth, and edge case in descending order of importance. Every sentence carries distinct information with 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 one-parameter destructive tool, the description covers reversibility, timing, authorization, error behavior, edge cases, and return shape. Even though an output schema exists and return values needn't be restated, the inclusion is accurate and harmless; nothing an agent needs to call this 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% for the single projectId parameter, so the schema already carries the parameter meaning and the baseline of 3 applies. The description adds no syntax, format, or ID-source guidance 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 with the exact semantics of the operation: 'Move a project to Recently deleted,' which immediately signals a reversible soft-delete rather than a hard delete. This distinguishes it from siblings like delete_version and restore_project without the agent needing to open any 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?
Explicitly names the counterpart tool (restore_project) and the 30-day window in which it applies, and clarifies that permanent deletion is the person's own step on their projects page — 'no tool does it' — closing off a plausible alternative the agent might otherwise hunt for. It also enumerates the exact access conditions required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_versionDelete versionADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds substantial behavioral context beyond that: it is permanent, accepts both UUID and v<N>, the v<N> sequence keeps gaps causing external snippets to fail, and it is idempotent with a no-op for non-existent versions. This is exactly the kind of side-effect and post-condition disclosure that agents need.
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 minimal waste. It front-loads the primary purpose, then provides the two most important operational details (accepted identifiers and side effects) in compact, well-structured sentences. 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?
For a delete operation with two parameters, destructive annotations, and an output schema present, the description is complete. It covers what is deleted, how to identify it, the irreversible side effect, the v<N> gap behavior, and idempotency. There is no missing information an agent would need to call this 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 100%, so the baseline is 3. The description adds value beyond the schema by explaining the consequences of using v<N> shorthand (gaps remain, external references break) and by clarifying idempotent behavior for non-existent versions. This is meaningful semantic enrichment even though the schema already documents both 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 clearly states the tool's action: 'Permanently delete one saved version (bookmark or auto-snapshot).' It uses a specific verb and resource, and distinguishes this from sibling tools like delete_page, delete_project, and restore_version by naming the target as a saved version. The mention of UUID and v<N> shorthand further clarifies the exact 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 gives clear context for use: it is for permanently deleting a saved version, which implies the appropriate situation. However, it does not explicitly name alternatives such as restore_version or list_versions for comparison, nor does it state when NOT to use this tool. It stops short of the explicit 'use X instead' guidance seen in top-tier examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_videoDescribe videoARead-onlyInspect
Structural OVERVIEW of the composition (the table of contents) — canvas size, duration, platform_safe_area (the part of the canvas TikTok / Reels UI and Instagram's feed crop leave visible: keep text, captions, logos and buttons inside it; null when nothing is covered or cropped), 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; a hug text layer's is its painted box, measured from the font, with metrics saying so), fits for every text layer ({canvas, safe_area} at its static position), 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive=false, but the description adds substantial context beyond them: it discloses what is deliberately excluded (keyframe values and styles, because they are unbounded), the semantics of platform_safe_area including the null case, that the tree describes the ACTIVE page, and the shape of the pages block. This is exactly the extra behavioral context the annotations cannot carry.
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?
Front-loaded with the core purpose and the primary alternative, and nearly every clause carries information an agent needs. It is, however, a single dense paragraph with heavy parenthetical nesting, which slightly hurts scannability for such a long description.
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 though an output schema exists (so return values need not be explained), the description still describes the returned structure well enough to set expectations, and it covers scope (active page), exclusions, and next steps. 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?
There is one parameter and schema coverage is 100%, so the schema already fully documents projectId. The description adds no syntax or format detail for the parameter itself (only notes that content tools target the active page). Baseline 3 is appropriate when the schema does the work.
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?
Names a specific verb+resource ('Structural OVERVIEW of the composition') and enumerates exactly what the overview contains: canvas size, duration, platform_safe_area, backdrop, and a z-ordered layer tree with elementId, type, geometry, fits, and animated properties. It explicitly draws the boundary against inspect_layers, so an agent can distinguish it from siblings without opening any 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?
Gives explicit routing: 'Start here, then call inspect_layers([elementId, …]) for full detail on the specific layers you'll change,' plus a negative instruction ('Don't guess keyframe/style values from this overview'). It also explains the multi-page case and points to select_page / add_page / delete_page / reorder_pages for page management.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_text_regionsDetect text regionsARead-onlyInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false)Skip; the description adds substantial behavioral context: 0.3s sampling at upload, one-time OCR for images, R2 caching, status values, source-pixel coordinate space, and confidence range. This goes well beyond what annotations alone 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 dense but every sentence carries distinct information: scope, input selection, processing cadence, caching, return shape, coordinate space, and an explicit use case. It is front-loaded with purpose and avoids 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 read-only analysis tool with a clear output shape, the description covers all call-relevant concerns: input selection, coordinate system, confidence semantics, and a practical application. Nothing an agent needs to invoke 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% and the schema already documents clip, image, and projectId. The description enriches this by clarifying the mutual-exclusion rule, what 'clip' and 'image' filenames refer to, how each source is processed, and that image results have a single frame. That is meaningful 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 precise verb and resource: 'Return the OCR text regions detected in a clip's video frames OR a still image asset.' It clearly distinguishes itself from transcribe_clip and other media-analysis tools by focusing on text-region detection for graphics collision avoidance.
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 usage context: '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.' It also explains the clip-vs-image choice with 'not both.' It does not explicitly name alternatives or state when not to use the 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.
duplicate_layerDuplicate 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the exact per-step math (i·(dx,dy), i·d_rotation, d_scale^i), states that 'Styles are copied', and suggests a follow-up animation workflow. These details go well beyond the annotations, which only indicate a non-read-only, non-destructive 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?
Dense but efficient: the first sentence defines the operation, the second gives canonical use cases, and the third closes with workflow advice. Every sentence earns its place 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?
For a seven-parameter composition primitive, this is complete: it defines legal element ids, the transform math, examples, and what happens to styles, while the output schema covers return values. The annotations cover the mutation profile, so no safety 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 schema already documents every parameter. The description adds relational meaning by explaining how parameters accumulate across copies and by naming the d_scale^i formula, going just beyond the 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 ('clone') and resource ('leaf (image.<id> / video.<id> / shapes.<id> / text.<id>)') and includes an exact cumulative transform formula. The 'Composition primitive' framing separates it from add_* layer tools and duplicate_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?
Gives clear usage context: 'One call instead of dozens' plus concrete patterns (circle of stars, row of chevrons, fractal, staggered grid). It doesn't explicitly name alternatives or say when not to use it, but the examples strongly imply copy-with-transform scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_projectDuplicate 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; people see the name). 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. Versions or options of one video (styles to pick from, hooks, languages, a sheet's rows) are pages of ONE project (add_page, duplicate_index), never separate projects: the preview turns pages and exports one video per page.
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare non-read-only, non-destructive, non-open-world), it discloses the workspace inheritance rule, the edit-role prerequisite, the hard-failure instead of silent fallback, the returned workspaceId, and that the user's editor won't auto-refresh. These are substantive side effects and failure modes not present in structured fields.
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?
Front-loads the core purpose and the copy contents before moving into the WORKSPACE block. It is long, but the density is largely justified by the non-obvious workspace-routing rules; a few clauses (e.g. the picker/reload note) could be tightened.
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?
An output schema exists, yet the description still calls out the salient returned field (workspaceId) that resolves the ambiguous destination. Combined with the failure semantics and defaults, an agent has everything needed 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 schema already documents name, projectId, and workspaceId. The description adds meaning beyond it: the edit-capable role requirement for workspaceId, the null-forces-personal semantics, and the edge case of a project shared from a workspace the user isn't a member of.
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 ('Duplicate an existing project into a brand-new one') and enumerates exactly what is copied (layers, animations, styles, uploaded assets, clips). It also explicitly distinguishes itself from sibling concepts by clarifying that versions/options of one video are pages of ONE project (add_page, duplicate_index), not separate projects.
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 and when-not guidance: it names list_workspaces as the source for workspaceId, explains the default workspace-following behavior, and states the failure case (view-only source) with the two remedies. It also routes the agent away from duplicating pages via add_page/duplicate_index.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
embed_projectEmbed projectAInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=false) by disclosing the internal mechanics (layers inlined, re-keyed to fresh ids, pinned to an immutable source version) and the crucial non-propagation guarantee: edits to inner layers affect only THIS video. That is exactly the kind of behavioral context annotations cannot express.
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?
Front-loads the core action in the first sentence and keeps each subsequent sentence purposeful (mechanism, params, local-edit semantics, identification cue). It is slightly dense at six sentences, but no sentence is redundant with the schema or annotations.
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 mutating tool with an output schema (return values needn't be explained), the description covers purpose, mechanics, parameter roles, side-effect scope, and a distinguishing identification cue via describe_video. Nothing an agent needs in order to invoke 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 the baseline is 3, but the description adds conceptual framing that the schema lacks: it explains the host-vs-source relationship (projectId = the project being mutated, source_morpha_id = the project being embedded) and that version is an optional label. This clarifies how the parameters relate rather than merely restating them.
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?
Names a specific verb+resource (embed another project as a version-pinned band) and immediately describes the resulting artifact (inlined layers, collapsible group, re-keyed ids). It also explicitly distinguishes the produced band from a plain group ('describe_video marks an embedded band with morpha:true'), so an agent can tell it apart from group_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?
Gives clear operational context: which id to pass (source_morpha_id), the optional version label, and the re-pin path via the editor Inspector. However, it does not name or exclude the potentially confusable siblings (add_embed_origin, set_embed_origins), leaving the agent to infer when embed vs. embed-origin is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fade_layerFade layerADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the description doesn't need to re-state that it mutates the project. The description adds a key detail: it performs the fade in one call, implying it replaces manual multi-step keyframing. However, it doesn't explain what happens to existing keyframes or opacity settings, which is a gap. Since annotations cover the safety profile, a 3 is appropriate.
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, concise sentence that communicates the action and scope efficiently. It is front-loaded with the main purpose, uses no filler words, and is easy to parse. This is an excellent example of minimal, high-value prose.
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 6 required parameters and an output schema, so the description doesn't need to explain return values. However, it doesn't clarify the exact behavior of the fade (e.g., interpolation type, whether existing keyframes are overridden). For a mutation tool with destructiveHint=true, this lack of behavioral detail slightly compromises completeness. The core purpose is clear, but additional context on effects would improve 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 description coverage is 50%: two parameters (fromOpacity, toOpacity) have descriptions ('0..1.'), and projectId has a description. The tool description does not explain the meaning of fromFrame/toFrame or elementId further, but the schema likely has enough context via property names. The description adds no new parameter semantics beyond the schema, so a baseline of 3 is correct given the 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 states a clear verb ('Fade') and specific resource ('a layer's opacity') plus the scope ('between two frames in one call'). It clearly distinguishes from siblings like 'set_layer_visible' or 'add_keyframe' by focusing on a single operation. This is precise and 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 when to use this tool (when you need to fade opacity over frames), but it doesn't explicitly state when not to use it or mention alternatives like 'add_keyframe' for more complex animations. There is no discussion of prerequisites or edge cases, so the guidance is minimal but not misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fit_duration_to_contentFit duration to contentADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint false, destructiveHint true), the description discloses the destructive clearing action, the auto-fit behavior, the 1-second floor, and a significant edge case where it can under-fit in headless mode and later self-correct. This adds valuable behavioral context not present in the 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 efficient and front-loaded with the core purpose. The note about headless under-fitting is long but necessary and clearly separated. Overall it is well-structured without unnecessary 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 description covers the primary behavior, the inverse relationship with set_duration, and a critical edge case that affects correctness. Since an output schema exists, return value details are not required. For a single-parameter mutation tool, this is complete and actionable.
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 a thorough description of projectId (opaque v4 UUID, from list_projects/create_project, selects project to mutate). The tool description does not add any additional parameter details, but with 100% schema coverage, the baseline is 3. No extra value is needed.
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: 'Clear an authored composition length and return to AUTO-FIT', specifying the resource (composition length) and the behavior (tracks furthest content with a 1-second floor). It also identifies itself as the inverse of set_duration, which distinguishes it from sibling tools like set_duration.
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 names set_duration as the inverse, providing a clear alternative and implying when to use this tool (to revert to auto-fit). It also gives a specific condition (headless with null source_out_frame) where under-fitting may occur, helping the agent decide when to invoke it and what to expect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
freeze_frameFreeze frameADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the destructive behavior (clip is cut), matches the destructiveHint annotation, and explains the resulting image layer is editable ('resize, split, move or delete it like any other layer'). It also clarifies the output field 'frozenSourceFrame' differs from 'frame' on retimed clips, adding value beyond annotations. No contradictions with the 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 thorough but not bloated. It front-loads the core action, then explains the mechanism, the layer nature, the prerequisite, the output field, and the constraint. Each sentence adds value, though it's slightly longer than minimal. It earns a 4 for being appropriately detailed without waste.
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 tool with 5 parameters and an output schema, the description covers all critical aspects: the timeline effect, the layer editability, the image upload prerequisite, the default holdFrames, the output semantics, and the frame constraint. Nothing essential 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%, and the schema already describes each parameter's meaning (frame, image, elementId, projectId, holdFrames). The description adds context (e.g., the still is an image layer, holdFrames default matches), but these are largely restatements. It doesn't add significant new semantics beyond the schema, so 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 clearly states the action: 'Freeze the picture at a frame: the clip is CUT there and a still of that frame is inserted between the halves.' It specifies the resource (clip) and the effect (frame hold), and distinguishes it from other layer operations by describing the unique NLE behavior. No sibling tool does this, so it's 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 it ('This is how you hold a moment — play, freeze, continue') and provides a clear prerequisite: the PNG must be uploaded first ('rendering one needs a browser, so capture and upload it first'). It doesn't mention alternatives, but there is no obvious competing tool in the sibling list, so this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_layersGroup layersADestructiveInspect
Wrap sibling elements in a new group, which the Layers panel shows as one named row the person can select, move and animate as one thing (a butterfly assembled from wings + body + antennae, an icon built from primitives, a card + its title + badge, a lower-third). name is that row's label. 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true but say nothing about mechanics; the description supplies the non-obvious behavior: transforms compose onto descendants, pivot rotates/scales at (pivotX, pivotY) seeded to the child centroid, and group x/y track values are translation offsets around that pivot with no static body. This is substantive disclosure well beyond what the annotations carry and does not contradict them.
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 clause, and the paragraph is dense but mostly earns its length through pivot and composition semantics. The four illustrative examples and some re-explanation of the parent constraint are slightly redundant and could be trimmed.
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 structural mutation with an output schema present (so return values need not be explained), the description covers the action, the required precondition, pivot seeding, transform composition, and translation semantics. An agent has everything needed 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 description coverage is 100%, so elementIds and projectId are already documented, and the description's parent-sharing constraint restates the schema text. It adds mild meaning for `name` (the label of the new panel row) but no format or edge-case detail beyond the schema, 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?
States a specific verb and resource ('Wrap sibling elements in a new group') and immediately clarifies the observable result in the Layers panel, distinguishing it from unrelated mutations. The parenthetical examples (butterfly, icon, card, lower-third) make the operation concrete 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?
It provides a real precondition (all elementIds must share the same parent, root or one existing group), which is genuine usage context. However, it never names alternatives such as ungroup_layers or set_group_parent, nor states when a group should be preferred over another structural operation, leaving usage implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_layersInspect layersARead-onlyInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: it returns complete records with animation tracks, keyframes, extrapolation modes, and style, and it warns against pulling the whole project. It doesn't describe pagination or response size limits, but the output schema exists and the read-only nature is clear. A 4 is appropriate because the description adds value beyond annotations without contradicting them.
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 zero waste. The first sentence front-loads the core purpose and return contents; the second gives the workflow guidance. Every clause earns its place, and the structure is easy to scan.
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 inspection tool with a full output schema, 100% parameter coverage, and annotations covering safety, the description is complete. It tells the agent what to pass, where to get it, what to expect back, and how to use it efficiently. 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 description coverage is 100%, so the schema already documents both parameters. The description adds value by explaining the source of elementIds (from describe_video's tree) and the intended usage pattern (only for layers about to mutate). It also clarifies the element id format implicitly by referencing describe_video. This goes beyond the schema's basic descriptions, so a 4 is warranted.
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 ('inspect'), a resource ('layers'), and the exact scope: per-element drill-in returning complete records including fields, animation tracks, keyframes, extrapolation modes, and style. It explicitly positions itself as 'the open this layer half of the browser,' distinguishing it from describe_video and other sibling tools. An agent can immediately tell what this tool does and what it returns.
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: pass elementIds read from describe_video, and pull detail only for the handful of layers you're about to mutate, not the whole project. It also implies the alternative (describe_video for the overview) and the workflow relationship. This is clear, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_collectionList collectionARead-onlyInspect
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 | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive, and the description adds meaningful behavioral detail: the exact return shape, the semantics of personal vs. team scope, the fact that items are self-contained copies when reused, solo-account behavior, and that it takes no arguments. This goes well beyond what the annotations alone 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 dense but every sentence adds value: what a Collection is, what the response contains, how scope works, how to present it to the user, and how the results connect to add_from_collection. It is front-loaded with the core purpose and avoids 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 an output schema is present, the description provides all the operational context an agent needs: return item fields, scope meaning, downstream usage, and solo-account behavior. Nothing necessary 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?
There are zero parameters, so the input schema is already complete. The description reinforces this by stating "takes no arguments," which is useful confirmation for an agent. Baseline for 0 params is 4, and the description does not need to do more.
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 user's reusable Collection," and clarifies exactly what a Collection contains with concrete examples (lower-thirds, logo stings, brand intros). It also distinguishes itself from related collection tools by saying the returned identifiers feed add_from_collection, so an agent can tell list_collection apart from add_to_collection and remove_from_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 for when this tool is relevant: when the user wants to view reusable collection items, especially as a precursor to add_from_collection. It does not explicitly state when-not-to-use or name alternative tools like add_to_collection/remove_from_collection, so it stops 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.
list_fontsList fontsARead-onlyInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true, the description adds meaningful behavior: the aggregated multi-source listing, the 'custom' source surface, the limit/max behavior, and the guarantee that returned families work directly in font_family without manual mapping. This goes well beyond the annotation and tells the agent exactly what to expect.
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 sentences with no filler: the scope is front-loaded, followed by use case, return format, filtering options, and a critical integration note. Every sentence earns its place and the structure is ideal for scanning.
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 its simplicity and the presence of annotations, the description covers everything needed to invoke it correctly: the exact return shape, the four parameters (all schema-documented), the filter/limit behavior, and the downstream integration with the text tools. Nothing an agent needs 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 mostly restates the schema's q/source/limit semantics, though it does add a useful note about 'custom' returning only uploaded faces and the integration guarantee. There is no significant added 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 names a specific verb ('List'), a concrete resource ('available font families'), and the full scope (every source plus custom uploads), which clearly distinguishes it from the mutation tools around it such as set_layer_text and add_text_layer. The inclusion of the return shape and the mention of the font sources removes any ambiguity about what this tool produces.
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 to use this tool before set_layer_text/add_text_layer when you don't know what to pick, which is strong contextual guidance. It doesn't state exclusions or when not to use it, but for a read-only discovery tool the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsARead-onlyInspect
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 the editor never shows them). editorUrl is a link that opens that project in the editor. 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The caller's projects. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds scoping behavior beyond that: personal projects are returned by default, workspaceId switches to workspace (including teammates') projects and adds ownerEmail, and name falls back to 'Untitled'. It stops short of describing pagination or volume limits.
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?
Front-loads what the tool returns before branching into the workspace case, and every sentence carries information. It is slightly dense with three field explanations plus two usage clauses, but nothing is wasted.
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 an output schema present, return structure needn't be re-described, and the description still supplies the field semantics, the default-vs-workspace behavior, and the triggering scenario. An agent has everything needed 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 coverage is 100%, so the baseline is 3, and the description adds real meaning: the default (omit for personal projects), the membership requirement, that workspace results include teammates', and that each gains an ownerEmail. This exceeds what the single schema field 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?
States a specific verb+resource (list projects) and immediately clarifies the return shape and the meaning of each field (id maps to projectId, name is the editor label, editorUrl opens the project). It distinguishes the default personal-project listing from the workspace listing, so an agent can tell it apart from list_workspaces and the create/rename/delete_project 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?
Explicitly names the trigger ('what projects do I have?' or when no project is named but one must be operated on) and points to list_workspaces as the source of workspaceId. Both when-to-use and the alternative path are covered without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_trashList trashARead-onlyInspect
List the projects in Recently deleted as { id, name, trashedAt, purgeAt, deletedBy, canEdit } entries. Each can be restored with restore_project until purgeAt (epoch ms), 30 days after it was deleted. deletedBy is { kind: "you" | "person" | "agent", label }: the caller, a teammate (label is their email), or a connected assistant (label is its name). canEdit says whether the caller may restore it. By default lists the caller's own personal projects; pass workspaceId (from list_workspaces) for that workspace's.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Optional workspace id (from list_workspaces). When given, lists that workspace's deleted projects instead of the caller's personal ones; requires membership. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/non-destructive annotations by disclosing the retention rule (purgeAt is epoch ms, 30 days after deletion), what deletedBy encodes (you/person/agent with label semantics), and what canEdit gates. This is exactly the behavioral context an agent needs to decide whether restoration is still possible.
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?
Front-loads what is listed, then the purge/restore constraint, then the field semantics, then the default scoping — a sensible order. Slightly dense with backtick-heavy field explanations, but nearly every clause carries information the agent can act on.
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 though an output schema exists, the description usefully explains the retention/restore path and default scoping, leaving no gap an agent would need to guess at for a zero-required-parameter list 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 single parameter's description already covers the from-list_workspaces sourcing, the scope change, and the membership requirement. The description restates that behavior rather than adding new meaning, so the baseline 3 for a fully documented schema 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 (List) and resource (projects in Recently deleted) with the exact shape of each entry, which cleanly separates it from siblings like list_projects and list_versions. An agent knows exactly what it will get back 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?
Explains the default scope (caller's personal deleted projects) versus the workspaceId-scoped behavior, and points at list_workspaces as the source of the id and restore_project as the follow-up action. It never explicitly says when NOT to use it (e.g., use list_projects for live projects), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_versionsList versionsARead-onlyInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, the description goes far beyond by detailing the semantics of the returned fields: 'kind' differentiates bookmarks (deliberate saves, partner-pinnable) from auto-snapshots (restore-only), 'version_number' stability rules (deletes leave gaps, numbers never re-shuffle), and 'cp' meaning (page changes, special values like '*' and absence). It also discloses that the tool returns summaries, not the inner project JSON. This is rich behavioral context that helps the agent interpret results correctly.
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 function ('List every saved version of a project, newest-first') and then systematically explains each relevant field. Every sentence provides necessary context (kind distinctions, version_number stability, cp semantics, and downstream usage). The length is justified by the complexity of the output fields; it is not verbose or 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 an output schema exists (as indicated by 'Has output schema: true'), the description does not need to detail the return structure. It covers all essential operational aspects: what is returned, field semantics, ordering, and how to use the output with related tools. Combined with the annotations, there is nothing an agent needs to call this tool correctly that 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 provides 100% coverage for projectId ('Project whose versions to list.'), so the description does not need to add parameter details. The description does not explicitly restate the parameter, but the baseline for fully covered parameters is 3, and no additional semantic value is required or added.
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 ('List every saved version of a project'), the resource ('saved versions of a project'), and the ordering ('newest-first'). It clearly distinguishes itself from sibling tools like save_version, restore_version, rename_version, and delete_version by focusing on the read-only listing nature and explicitly noting it returns summaries, not the inner project JSON.
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 usage context by explaining the returned fields (kind, version_number, cp) and explicitly directs the user to use the returned id with restore_version, rename_version, or delete_version. It does not explicitly state when to use this tool over alternatives, but the intent is obvious given the sibling set and the read-only nature. A minor gap is the lack of explicit 'when not to use' guidance, but the context is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesList workspacesARead-onlyInspect
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. The id is the workspaceId argument of create_project, move_project_to_workspace and list_projects; name is the label people see in the workspace switcher. Returns an empty list when the account has no email (workspace membership is email-based, so a keyless/dev identity sees none).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine value beyond that: the role enumeration (owner/admin/editor/viewer), the permission implication (only owner/admin/editor can add projects), and the empty-list edge case for keyless/dev identities. Minor gap: no statement about ordering or pagination, though openWorldHint=false implies a bounded set.
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 tight sentences, front-loaded with what is listed and what comes back. Every clause carries distinct information: the entry shape, role/permission meaning, the id cross-reference, and the empty-list condition. No restatement of the title or annotations.
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 an output schema present, return values need not be re-explained, yet the description still adds the role enum semantics, sibling id mapping, and the empty-list failure mode. Nothing an agent needs in order to call this zero-arg read 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?
The tool takes zero parameters, so the baseline of 4 applies. The description instead documents output field semantics (role values, id mapping) rather than parameters, which is above the floor even though an output schema already exists.
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 ('List the workspaces (shared team spaces) the account belongs to') and even enumerates the returned shape {id, name, role, memberCount}. An agent can distinguish this from siblings like list_projects or create_workspace without opening any 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?
Names the consuming siblings explicitly — the returned `id` is the workspaceId argument of create_project, move_project_to_workspace and list_projects — which tells an agent when this tool is a prerequisite. It stops short of an explicit when-not clause or a direct comparison against list_projects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_caption_linesMerge caption linesADestructiveInspect
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>". |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds specific behavioral details: the earliest line survives, others are removed, and texts are joined in time order with a union window. It also warns about the constraint on other lines. This goes beyond annotations without contradicting them, though it doesn't describe failure modes or return 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?
Two sentences that front-load the main action and outcome, then state constraints and a hint. No filler or repetition; 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?
For a mutation tool with clear constraints, the description covers the essential behavior, prerequisites, and the reason for the destructive hint. It is complete for an agent to know when and how to invoke it, especially with the sibling split tool available for contrast.
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 well-documented (projectId as opaque UUID, elementIds as text.<id> list). The description adds minimal new parameter semantics beyond the schema, so 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 states a specific verb and resource: 'Merge two or more caption lines into one.' It also details the outcome (earliest survives, union window, time-ordered texts) and distinguishes from the sibling split_caption_line by focusing on the merge action. This is clear and non-tautological.
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: all lines must share one flavour (same clip or standalone) and no other line may sit inside the merged span. It even suggests a workaround ('move or include it first'). It implicitly differentiates from split_caption_line by specifying merge behavior. This provides strong 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.
move_layerMove layerADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false and destructiveHint=true, but the description adds significant context beyond these: keyframe overrides, refusal behavior, clear_animation semantics, and group-specific limitations (no width/height/rotation; use add_keyframe for group rotation). This fully discloses side effects and edge cases, so the agent is well aware of potential pitfalls.
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, front-loading the primary purpose and then detailing constraints. However, it is somewhat dense—the section on keyframe overrides could be seen as lengthy. Each sentence adds important information, so it earns a high score, but a slight restructure could improve readability.
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 (10 parameters, different layer types, animation interactions) and rich schema annotations, the description fully covers what an agent needs to use this tool correctly. It explains the keyframe interaction, group behavior, coordinate systems, and clear_animation usage. The output schema exists, so return values are not needed in the description. This is 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?
The schema already covers 100% of parameters with detailed descriptions, giving a baseline of 3. The description adds substantial value by explaining the interaction between parameters and the keyframe system, particularly for scale/opacity with clear_animation. It also clarifies that group layers use different properties (pivotX/pivotY). This exceeds the baseline and makes the parameter meanings even clearer.
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: setting a layer's static base transform (x/y/w/h/rotation), scale, and opacity. It specifies the exact resource types and properties affected (image.<id>, video.<id>, shapes.<id>, group.<id>) and distinguishes group behavior. This enables an agent to understand it as the static-transform tool, distinct from animation-focused tools like add_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?
The description explicitly instructs when to use this tool vs. alternatives: 'use add_keyframe to animate, move_layer to set the un-animated default.' It also explains when the tool will refuse to write (if a property has an existing keyframe track) and how to override that with clear_animation:true. This is comprehensive guidance for correct selection and invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_project_to_workspaceMove project to workspaceADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description does not contradict this; it adds valuable behavioral detail: visibility to all members with role-based edit/view, and the clean dropping of old membership when switching workspaces. It also discloses permission requirements. This goes beyond the annotation's generic destructive flag, providing concrete 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?
The description is front-loaded with the core action and immediately covers both usage modes. Every sentence adds essential information—permissions, side effects, and parameter guidance—with no filler or repetition. It is concise yet complete for a tool of this 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 mutation with an output schema, the description covers all essential aspects: the action, the two distinct use cases, required permissions, membership behavior, and the source of the workspace ID. An agent has everything needed to call the tool correctly and anticipate its effects, without needing to open the schema or guess return 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?
Schema coverage is 100%, so both parameters are documented. The description adds extra semantics beyond the schema: it specifies that workspaceId should come from list_workspaces, explains the null case for returning to personal space, and clarifies the effect of each mode. This enrichment justifies a score above the baseline 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 (move a project) with a specific verb and resource, and explicitly covers both modes: into a workspace or back to personal space. It distinguishes itself from siblings like move_band and move_layer by focusing on project-to-workspace movement, making selection 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 provides clear context for when to use it: to place a project in a workspace (with workspaceId from list_workspaces) or detach it back to personal (with null). It also states prerequisites (edit-capable role in target workspace, write access to project) and notes the effect on membership. It does not explicitly name alternatives or exclusions, but the conditions are sufficiently clear for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_projectOpen projectARead-onlyInspect
Get a link that opens a project directly in the editor (the editor loads exactly this project from the URL), where the person can see the work, change it by hand and export it. Returns { name, editorUrl }; name is the project's label.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Id of the project to open. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The project, as a person would refer to it. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuine context beyond that: the returned link loads this exact project in the editor and enables manual editing and export, which tells the agent what the artifact is for. It stops short of noting link expiry, permission requirements, or whether the recipient needs an account.
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 the core purpose front-loaded, and the return shape stated compactly. The parenthetical about the editor loading exactly this project is slightly wordy but does carry meaning, so little is wasted.
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 one-parameter read-only tool with an output schema, the description covers purpose, the nature of the returned link, and the return shape, so an agent has what it needs to invoke it. Minor gaps (link lifetime, access requirements for the recipient) are the only thing left unaddressed.
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 a single parameter with 100% schema description coverage, so the schema fully documents projectId and the baseline is 3. The description's phrase 'the editor loads exactly this project from the URL' gestures at the identifier's role but adds no format, constraint, or lookup guidance 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?
States a specific verb+resource: 'Get a link that opens a project directly in the editor,' and clarifies the URL loads exactly that project. However, it never distinguishes itself from close siblings like show_project, embed_project, or create_project, so an agent must infer the boundary from name alone.
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 clause 'where the person can see the work, change it by hand and export it' implies the use case (handing a project off to a human editor), which is real implied guidance. But there is no explicit when-to-use, when-not-to-use, or named alternative such as show_project or embed_project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reid_projectRe-id projectADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that the operation 'deletes the old id' and preserves version history, which is essential for a destructive re-key. It also reveals the side effect that the editor 'won't auto-refresh — reload to see the new id in URLs.' This goes well beyond the annotations by explaining what is destroyed, what is preserved, and the post-call 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?
Four sentences cover the operation's effect, its relationship to create_project, the id policy, and the no-auto-refresh quirk without padding. The core action is front-loaded in the first sentence, and each subsequent sentence carries a distinct piece of 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 what gets changed (id, JSON, versions, assets, clips), what is preserved (version history, name), and the observable side effect (no editor auto-refresh). An output schema exists, so return-value details are not required. This is complete for an agent invoking a destructive re-key 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?
The input schema already describes both parameters, and the description largely restates the newId policy ('v4 UUID', omit to mint) rather than adding new meaning. With 100% schema coverage, there is little for the description to compensate for, so the baseline score applies. The description does reinforce what projectId refers to, but adds no extra parameter-level detail.
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: 'Change a project's id LOSSLESSLY' and enumerates the exact scope (JSON, every saved version, all assets + clips). It also contrasts with 'create_project (clone)', distinguishing the tool from its closest sibling. An agent can immediately understand what the operation does and how it differs.
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 differentiates this tool from create_project by noting 'Unlike create_project (clone), version history is preserved,' giving an agent a basis for choosing between re-id and clone. It also states that a project's name is untouched, implying the name-change path belongs to the rename_project sibling. However, it doesn't provide explicit when-not-to-use exclusions or name all relevant alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_audio_overlayRemove audio overlayADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the destructive nature is covered by structured data. The description adds that the object destroyed is an audio overlay selected by id, but gives no further behavioral context such as permanence, side effects, or permissions. It does not contradict the 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 a single, front-loaded sentence with no filler: action first, then object, then selection method. Every word earns its place and it remains easy to parse at a glance.
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 only two required parameters, full schema parameter descriptions, an output schema, and annotations covering destructive behavior, the description is nearly complete. It could name the sibling alternative or state that deletion is permanent, but the missing context is minor given the surrounding structured data.
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 id and projectId already have clear descriptions in the input schema. The description adds only the 'by id' cue, which marginally reinforces the id parameter but does not add 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 uses the specific verb 'Delete' and names the target resource ('audio overlay') and the selection key ('by id'). This clearly differentiates it from siblings like add_audio_overlay and update_audio_overlay, and from other remove_* tools by 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?
Usage is implied by the verb 'Delete' but not explicitly stated. The description does not mention when to choose this tool over update_audio_overlay, add_audio_overlay, or remove_layer, nor does it provide exclusions like 'only for existing overlays.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_color_keyframeRemove color keyframeADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate destructiveness, so the description is not burdened with stating that. It adds valuable behavioral detail: the operation is a no-op when no track or matching keyframe exists, and removing the last keyframe drops the track entry. No contradiction with 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?
Three concise sentences each earn their place: action and scope, no-op behavior, and the last-keyframe edge case. No redundant wording 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?
Given the output schema and annotations exist, the description covers the essential behavioral edge cases and scope. It is missing only optional guidance about when to choose this over sibling removal tools, but the definition is otherwise complete 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 50%, and the description compensates partly by explaining that the frame must match exactly and that the property is fill-related. However, it does not clarify frame units or matching semantics beyond 'exact frame', and elementId/projectId rely mostly on their schema 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 the exact operation ('remove the colour keyframe'), the target resource ('on a fill track'), and the precise condition ('at an exact frame'). This clearly distinguishes it from sibling tools 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?
The fill-track and color-keyframe language implies when the tool is appropriate, but there is no explicit guidance against using generic remove_keyframe or other keyframe removal tools. No exclusions or alternative-tool routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_embed_originRemove embed originADestructiveInspect
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). Morpha sends that website no request; a page on it stops loading the project. Reference: https://morphareels.ai/docs/tools#removeembedoriginorigin
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the description's job is to add nuance beyond that. It does so thoroughly: it reveals idempotency, the no-op behavior for absent entries, the consequence of removing the last entry (embedding turned OFF, endpoint 404s), and the real-world effect on the referenced website. This goes well beyond the annotations and gives the agent a complete picture of what happens.
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 exceptionally tight: one sentence states the core purpose, one sentence covers idempotency, one sentence covers the destructive edge case, and one sentence gives a real-world consequence. Each clause earns its place, and the reference link is appended without clutter. It is front-loaded and easily scannable.
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 tool with an output schema and annotations covering destructiveness, the description is complete. It covers the operation, edge cases, and consequences. The output schema handles return-value documentation, and the schema descriptions cover parameter provenance. Nothing an agent needs to invoke this 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% and the parameter descriptions are already rich: origin explains normalization and its relationship to add_embed_origin; projectId explains it's a UUID from list_projects/create_project and that it selects the project to mutate. The tool description adds no additional parameter information, so the baseline 3 for high schema coverage applies. No deduction is needed since the schema already carries the semantic weight.
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, specific verb+resource: 'Remove one hostname from the project's embed allowlist.' It states exactly what the tool does and implicitly distinguishes it from related tools like add_embed_origin and set_embed_origins by focusing on a single removal. The purpose is unambiguous and actionable.
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 important contextual guidance: it notes idempotency (removing a non-existent entry is a no-op) and the critical side effect that removing the last entry disables embedding. It also warns about the downstream effect on the website. While it does not explicitly name alternative tools or when to use them, the side-effect warnings effectively guide safe usage. This is strong usage guidance for a simple removal operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_collectionRemove from collectionADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnlyHint=false and destructiveHint=true, so mutation is expected. The description adds meaningful behavioral details beyond those annotations: removal only affects the Collection, copies in other projects remain self-contained, and the call is a no-op for unknown ids. This clarifies the destructive scope and prevents an agent from overestimating 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 three concise sentences, each earning its place: it states the purpose, gives the key input provenance, and explains edge-case behavior. The most important information is front-loaded, and there is no redundant wording 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 two-parameter mutation tool with complete schema documentation and an output schema, the description covers the essential behavioral edges: input provenance, no-op behavior, and limited destructive scope. Nothing an agent needs to invoke it correctly appears to be 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 elementId and projectId. The description adds extra semantic value by specifying that elementId should come from add_to_collection and that unknown ids are harmless no-ops. It does not add projectId context, but the schema already covers that parameter fully.
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 ('Remove') and a clear resource ('layer from the user's Collection') and states the intended consequence ('no longer offered for reuse'). It also distinguishes itself from related sibling tools like remove_layer and add_to_collection by clarifying that the operation targets the reusable Collection rather than placed project 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 gives clear context on when to use it: to remove a previously added collection element, and it tells the agent to pass the element id from add_to_collection. It does not explicitly list exclusions or compare with all alternatives, but the 'no-op if the id isn't in the collection' and 'copies are unaffected' guidance usefully shape invocation expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_keyframeRemove keyframeADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as destructive, and the description consistently describes removal. It adds valuable extra context by disclosing that removing the last keyframe restores the layer's static base value, which is not derivable from the annotations. No contradiction with 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?
Two sentences, front-loaded with the action, and every sentence earns its place by either defining the operation or explaining an important edge behavior. 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 destructive 4-parameter tool, the core action and one edge case are covered, and an output schema is present so return values need no explanation. However, the description does not specify what happens when no keyframe exists at frame N, how the property parameter maps to a track, or any prerequisites, leaving some ambiguity 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 only 25% (only projectId is documented), and the description does not compensate. It references 'frame N' but never explains elementId, property, or how the property selects the track; the enum values carry what meaning they can, but the description adds little 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 (remove) and resource (keyframe at frame N on a layer's track), so an agent can tell it is a keyframe-removal tool. It does not explicitly contrast with the sibling remove_color_keyframe or remove_speed_keyframe tools, so it stops short of full 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?
The behavior note about removing the last keyframe implies when the tool matters and hints at the effect, but no alternative tools are mentioned and no explicit when-to-use or when-not-to-use guidance is given. This is adequate but leaves the choice between this and sibling keyframe-removal tools to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_layerRemove layerADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint=true, the description discloses a non-obvious cascade effect: deleting a video layer also removes its welded audio overlays and caption lines. It also surfaces error conditions on groups and pinned layers, giving the agent an accurate model 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?
Three sentences carry only decision-relevant information: what is deleted, what fails, and what collateral damage occurs. No filler or schema 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 two-parameter destructive tool with an output schema, the description covers the main decision factors: valid targets, invalid targets, and consequential deletions. An agent has enough information to call it correctly and predict outcomes.
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 meaning for elementId by specifying accepted leaf target types and stating that group.<id> is not a valid input. This goes beyond the schema's type examples.
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: 'Delete a video, image, text, or shape LEAF layer.' It immediately distinguishes non-leaf targets by noting errors on group.<id>, which separates it from grouping tools and other layer 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?
It gives explicit when-not-to-use guidance: 'Errors on a group.<id> (dissolve it with ungroup_layers instead)' and mentions pinned layers such as the canvas backdrop. This lets the agent route to ungroup_layers when appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_speed_keyframeRemove speed keyframeADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds a valuable behavioral nuance: removing the last keyframe clears the speed_keyframes array entirely and restores 1× playback. This goes beyond the annotation and adds context about the consequence.
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 that front-load the main action and include the key side effect. Every word earns its place, with no 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 presence of an output schema and rich annotations, the description adequately covers the core action and a key side effect. It does not mention error handling for missing keyframes, but that is likely captured by the output schema.
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 all parameters, but the description adds meaning by explaining that the frame is a PROJECT-timeline frame consistent with add_speed_keyframe and inspect_layers, and it clarifies the effect on the speed_keyframes array, which is not 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 explicitly states the action (remove), the resource (speed-ramp keyframe), and the location (at a specific frame on a video layer). It clearly distinguishes from generic remove_keyframe and remove_color_keyframe by specifying 'speed-ramp 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?
The description references add_speed_keyframe and inspect_layers to clarify the frame semantics, implying usage context. However, it does not explicitly state when to use this tool over remove_keyframe or remove_color_keyframe, nor provide exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_groupRename groupBInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, openWorld=false. The description adds genuine context beyond them: the rename has no functional effect and only surfaces as a label in the Inspector and describe_video output, which tells the agent the change is display-only.
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 tight sentences, front-loaded with the action and immediately followed by the scope caveat. Nothing extraneous.
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?
An output schema exists so return values need not be explained, and annotations cover the safety profile, but the description leaves the groupId and name parameters undocumented for a 3-param tool. Adequate for intent, incomplete for 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% (only projectId is documented). The description mentions no parameters at all, so groupId and name are left entirely undescribed in both schema and prose. It fails to compensate for the coverage gap.
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 ('Rename a group') and the 'pure cosmetic' clause clarifies the effect, distinguishing it from functional siblings like rename_layer or set_group_parent. It does not explicitly name an alternative, but the resource scope 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?
The description never says when to use this versus the many sibling rename_* and group_* tools, nor any prerequisites. 'Pure cosmetic' hints at intent but is not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_layerRename 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious context: the name feeds the auto-derived <morpha-video> embed attribute, and an empty string clears it so callers fall back to the filename stem. It stops short of stating behavior for an unknown elementId or idempotency, which keeps it off a 5.
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 single dense sentence front-loads the primary effect (the label and the embed attribute), followed by the empty-string edge case and the sibling routing. No filler sentences.
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?
An output schema exists so return values need no explanation, and the annotations cover safety. The description supplies the cross-cutting side effect, the clearing behavior, and the group alternative — everything an agent needs 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 is 3 and the schema already documents all three params including the empty-string semantics. The description still adds meaning by explaining that `name` is not just a display label but the basis for the derived embed attribute, which the schema does not say.
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 (set the name) and resource (video/image/shape/text layer) and pins the scope to the human-readable label shown in the Inspector. It explicitly routes group renaming elsewhere, so an agent can separate it from rename_group without opening either 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?
Names the sibling alternative and the condition that selects it ('For groups use rename_group'), and gives the edge-case behavior for clearing a name. Both the when and the when-not are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_projectRename 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false; the description reinforces and sharpens that profile by asserting it touches no layers, animations, or styles. That is genuine added context about blast radius, though it omits permission requirements or whether the change is undoable.
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, front-loaded with the core action, followed by the empty-string rule and the scope boundary. Every clause carries information; 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?
For a two-parameter rename with an output schema covering return values and annotations covering safety, the description supplies everything an agent needs: what changes, what does not, and the reset 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?
Schema description coverage is 100%, so both parameters are already documented, including the empty-string fallback. The description restates that contract rather than adding new syntax or format detail, so the baseline 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?
States a specific verb+resource ('Update a project's human-readable name') and immediately scopes it to the editor's project picker label, which cleanly separates it from siblings like rename_layer, rename_group, rename_version, and rename_workspace. An agent can identify the exact target 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?
Gives clear context for invocation (the visible picker label only) and an explicit edge-case instruction — pass an empty string to clear and revert to the id. It does not name a sibling alternative or say when not to use this tool, so it falls 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.
rename_versionRename 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, and the description usefully adds scope: only the display name changes, so existing identifiers and presumably version content are untouched. It also discloses validation behavior (empty/whitespace-only names are rejected), which is genuinely extra context beyond the annotations, though it says nothing about permissions or idempotency.
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 tight sentences with zero filler, front-loading the core action and immediately following with the scope constraint and accepted input forms. Every sentence carries information an agent needs.
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?
An output schema exists, so return values need not be described, and the annotations cover the safety profile. The description covers identity semantics (label vs `v<N>`) and validation, but omits whether a permission level is required and whether the name must be unique, which would round out a 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 description coverage is 100%, so all three parameters (name, projectId, versionId) are already documented in the schema, including the UUID/`v<N>` shorthand for versionId and the non-empty requirement for name. The description largely restates those same facts, so baseline 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?
Specific verb (rename) plus precise resource (a saved version's human-readable label), with a parenthetical clarifying exactly what the label is ('what the user sees in the picker'). It also explicitly distinguishes this from changing the `v<N>` identifier, which cleanly separates it from rename_layer, rename_group, rename_project and rename_workspace 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 gives clear context for when this tool is appropriate (changing the display label only) and states what it does NOT do (the partner-facing `v<N>` identifier is unaffected). It doesn't name an explicit alternative tool or state prerequisites/permissions, so it falls short of the full when/when-not/alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_workspaceRename workspaceAInspect
Rename an existing workspace. Requires an owner or admin role in it (the same roles that may change its membership); an editor or viewer is refused. Takes the workspace id from list_workspaces. Touches only the label — membership, projects and roles are unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New human-readable name. | |
| workspaceId | Yes | Id of the workspace to rename (from list_workspaces). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only assert the generic non-destructive/write profile; the description goes further by disclosing the authorization requirement (owner/admin, editors and viewers refused) and the exact blast radius ('touches only the label — membership, projects and roles are unchanged'). That is meaningful behavioral context an agent cannot get from the hints.
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, all load-bearing: purpose, permission gate, and mutation scope, in that order. Nothing is repeated or padded, and the verb 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 simple two-parameter rename with an output schema present, the description covers everything the agent needs: what it does, who may call it, where the id comes from, and what is left untouched. Return values are legitimately omitted because an 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% and both parameters are documented there, including the '(from list_workspaces)' provenance for workspaceId, which the description merely repeats. No syntax or format detail is added beyond the schema, so the baseline 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?
States a specific verb (Rename) and resource (existing workspace) in the first sentence, which cleanly separates it from the many sibling rename_* tools (rename_project, rename_layer, rename_group, rename_version). An agent can pick the right one without opening any 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?
Gives a concrete prerequisite (owner or admin role) and an explicit exclusion (editor or viewer is refused), plus where to obtain the id from list_workspaces. It does not name an alternative tool for the case where the caller lacks the role, so it falls just short of the full when/when-not/alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_statusRender statusARead-onlyInspect
Check a server render started by render_video, and get its download link. Returns { ok: true, status: 'not-ready' } while it is still rendering (wait and call again), or { ok: true, status: 'ready', data: { downloadUrl, editorUrl, expiresAt, videoSeconds, scale } } once the MP4 is ready. downloadUrl is a plain https link needing no Morpha account — give it to the person; it stops working when the render is deleted at expiresAt (7 days). A render that failed answers ok:false with a plain reason and uses no allowance. Only the account that started a render can read it.
| Name | Required | Description | Default |
|---|---|---|---|
| renderId | Yes | The renderId render_video returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, non-destructive, non-open-world); the description adds substantial behavioral context beyond them: the not-ready/ready envelope, the 7-day expiry that kills downloadUrl, that failed renders return ok:false with no allowance consumed, and that only the originating account can read the render.
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?
Front-loads the purpose, then the response shapes, then the operational caveats. Every sentence carries distinct information (polling, URL lifetime, failure semantics, ownership) with no repetition of the schema or annotations.
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 an output schema existing, the description enumerates the return fields an agent must act on, and adds the non-obvious constraints (expiry, ownership, allowance-free failures) that the structured fields cannot express. Nothing needed to invoke or interpret the call 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% for the single parameter, and the schema already states renderId is what render_video returned, so the description adds no syntax, format, or constraint detail beyond it. Baseline 3 applies when the schema does the heavy lifting.
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 ('check a server render started by render_video') and ties it directly to the sibling that produces the input. It also names the artifact obtained (download link / MP4), so an agent can distinguish it from render_video itself and from unrelated status 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?
Gives clear polling guidance: call again when status is 'not-ready', and describes the two terminal states. It does not mention an alternative or exclusion (e.g. the sibling clip_processing_status for non-render polling), so it stops just short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_videoRender videoADestructiveInspect
Render the project to an MP4 on Morpha's servers, for an agent that has no browser to drive (a chat app, a Linux box). Returns { renderId, status: 'rendering', next } — call render_status with that renderId after about 30 seconds. It needs a subscription and draws on the account's render allowance, so a longer composition and a larger scale each use more of it. The editor renders the same MP4 with no allowance: every project result carries an editorUrl, and there the person can choose Share, then Download (Render MP4 on a phone), free and with no watermark. Renders at 2x the canvas by default, the same as the editor; pass scale: 1 for the canvas's own size, which is faster and uses less allowance. The allowance is checked before the render starts, so a render that would exceed it is refused up front rather than failing partway. Refused for a composition longer than 30 minutes, when the remaining allowance will not cover it, or while 3 renders are already running for this account. The finished file stays downloadable for 7 days, then it is deleted; the project stays and can be rendered again. The render downloads the project's fonts from their hosts, including a custom font's own URL (set_custom_font). Reference: https://morphareels.ai/docs/tools#rendervideopage-scale
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Optional 0-based page index for a multi-page project. Omit for the project's active page; render one page per call. | |
| scale | No | Optional output scale: 2 (the default) renders at twice the canvas, roughly 4K for a portrait project; 1 renders at the canvas's own size for a faster file that uses less allowance. Nothing else is accepted. | |
| projectId | Yes | Project to render. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry the generic write/open-world/destructive flags; the description goes well beyond them, disclosing subscription and allowance requirements, that longer compositions and larger scales cost more, upfront allowance checking, concurrency limits, 7-day file retention with the project surviving, and outbound font fetches. This is exactly the operational context annotations cannot express.
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?
Purpose and the follow-up call are front-loaded, and most sentences carry real operational payload. It is on the long side and the editor-alternative paragraph could be tighter, but there is little genuine waste.
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 mutating, allowance-consuming, async render tool, the description covers prerequisites, async handoff, cost model, refusal conditions, and retention. With an output schema present it needn't explain the return payload, yet it still names the returned fields, so nothing an agent needs 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 schema already documents page, scale, and projectId, including the scale=1 vs 2 tradeoff and 'nothing else is accepted'. The description reinforces scale's allowance implication but adds little semantic detail beyond what the schema states, so the baseline 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?
States a specific verb and resource ('Render the project to an MP4 on Morpha's servers') and immediately scopes it to 'an agent that has no browser to drive'. It distinguishes itself from render_status (the follow-up) and from the editor's own export path, so an agent can route correctly without opening a 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?
Explicit when-to-use ('an agent that has no browser to drive'), explicit alternative (the editor's Share/Download path, free and unwatermarked), explicit next step ('call render_status with that renderId after about 30 seconds'), and explicit refusal conditions (composition > 30 min, insufficient allowance, 3 renders already running). Nothing 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.
reorder_layerReorder layerADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the description is not required to restate mutability. It adds useful ordering behavior (0 = bottom, last = top) and clarifies the parent scope, but it does not describe any additional side effects or irreversibility; the added context is helpful but not rich.
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 dense sentences: the action is front-loaded and the index semantics are tucked into a compact parenthetical. There is no filler 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?
With an output schema present and annotations carrying the destructive flag, the description only needs to make call semantics clear. It covers index bounds and parent/root scoping; the only notable omissions are a definition of elementId and explicit routing to move_layer for cross-parent changes, neither of which is fatally 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 67%, and the description materially enriches the newIndex parameter by defining 'root list when ungrouped, or the parent group's children when nested' and mapping numeric bounds to visual order. It does not define elementId, but the semantic additions lift it above the 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?
The description opens with a specific verb and resource: 'Move a layer within its parent's siblings.' That scoping phrase distinguishes it from sibling tools like move_layer (moving between parents) and reorder_pages (reordering pages), so an agent can pick it 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 concrete usage context by explaining the meaning of newIndex in both ungrouped (root list) and nested (parent group's children) cases. It stops short of explicitly naming alternatives or saying when not to use this tool, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_pagesReorder pagesADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations (destructiveHint=true, readOnlyHint=false) by disclosing precise side effects: remaining pages shift to fill the gap, active_index is rewritten to keep pointing at the same page, and out-of-range indices cause failure. This is exactly the behavioral context an agent needs before invoking a destructive 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?
Three sentences, each carrying distinct information: the core operation, the side-effect mechanics, and the failure mode. Front-loaded with the verb+operation and no filler or repetition 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?
For a 3-parameter destructive mutation with a full output schema and complete annotations, the description covers the operation, side effects, and error behavior. Minor gaps remain (behavior when from_index equals to_index, exact bounds of 'out-of-range') but nothing an agent needs to invoke 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 description coverage is 100%, so the baseline is 3. The description adds the out-of-range failure condition and frames from_index/to_index as a move relationship, but the schema already documents each parameter clearly (0-based indices, projectId provenance). The contribution is marginal but not zero.
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 page from...') and names the exact index parameters involved. The operation is unambiguously about reordering pages within a project, which distinguishes it from siblings like reorder_layer, add_page, delete_page, and select_page without any 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 behavioral detail (pages shift to fill the gap, active_index preserved, fails on out-of-range) implicitly tells an agent when this tool is appropriate, but no alternative tools are named and no when-not conditions are given. With several close siblings (reorder_layer, move_layer, move_band), explicit routing guidance would meaningfully help an agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_projectRestore projectAInspect
Bring a project back from Recently deleted, with its versions, files, workspace and sharing as they were. Returns { projectId, name }. Scheduled social posts cancelled by the delete stay cancelled. Requires edit access, as delete_project does; take the id from list_trash.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project to restore (an id from list_trash). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the exact restore scope (versions, files, workspace, sharing) and a non-obvious irreversible side effect: social posts cancelled at delete time stay cancelled despite destructiveHint=false. It also states the auth requirement and the return shape, which the agent cannot infer from readOnlyHint/openWorldHint alone.
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, front-loaded with the action and scope, then the side effect, then the prerequisite and sourcing hint. Every clause carries distinct information 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?
For a single-parameter restore tool with an output schema present, the description covers scope, side effects, permission requirements, and argument sourcing. Nothing needed 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% and the single projectId parameter is already documented as 'an id from list_trash'. The description's 'take the id from list_trash' merely repeats the schema, adding no format or syntax detail, so the baseline 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?
States a specific verb (restore) and resource (project) and immediately scopes it to the 'Recently deleted' state, distinguishing it from delete_project, show_project, and restore_version. An agent can identify the operation 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?
Explicitly tells the agent where to obtain the argument ('take the id from list_trash') and states the permission prerequisite ('Requires edit access, as delete_project does'), naming a sibling for comparison. It does not, however, contrast itself with restore_version, which restores a version rather than a whole trashed project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_versionRestore versionADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though destructiveHint=true already signals mutation, the description discloses critical extra behavior: an auto-checkpoint named 'before restore: …' is saved first, page-restores are compare-and-swapped against concurrent edits, missing asset references render as missing, and open editors reconcile without refresh. This is substantial behavioral context beyond the 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 long but dense; every sentence contributes a distinct behavioral or usage fact. It front-loads the core purpose, then expands into mode-specific behavior and edge cases. Slightly more compact phrasing would be possible, but very little is wasted.
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, dual-mode restore operation with no output schema to lean on, the description covers the full error surface: pre-restore checkpointing, single-page CAS semantics, page mismatch with version age, deleted assets, and editor reconciliation. An agent has enough context to invoke the tool safely 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?
Schema coverage is 100%, but the description adds real semantic value: it explains the v<N> shorthand resolution, notes that auto-snapshots are addressable only by UUID, clarifies that page_index indexes the project's CURRENT pages, and ties page_index to the sibling select_page/delete_page indexing. Both required and optional parameters gain meaning beyond their schema 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 opens with a specific verb and resource: 'Load a saved version over the live project.' It then clearly separates the two modes (entire project vs single page), which distinguishes the tool from sibling versioning tools like save_version and delete_version.
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 condition-based guidance: omit page_index for whole-project restore, provide it for single-page restore, use UUID for auto-snapshots, and restore the whole version if a page predates the version. It does not explicitly name alternative sibling tools or say when not to use restore_version, but the operational context is clear enough to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
safe_zonesSafe zonesARead-onlyInspect
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. This is about the clip's own burned-in text: where TikTok and Instagram Reels cover the canvas with their UI is describe_video's platform_safe_area. 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: it reads the OCR cache built at clip-upload time, returns coordinates in both source and canvas pixels with canvas coords already transformed for fit/anchor/position, and includes a status field ('ready' | 'not-ready') signaling possible unavailability. This goes beyond the annotation baseline.
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 information-dense but each sentence adds value: purpose, data source, coordinate system, usage, and distinction from a sibling. It is structured with the core function first, then details, then return format. Slightly long, but justified given the complexity and the need to disambiguate from similar tools.
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, data source, coordinate semantics, usage context, distinction from a related tool, and the return shape with status and data fields. The output schema is present (per context), and the description supplements it with band definitions. For a read-only analysis tool, nothing critical is missing for an agent 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 80% (four of five parameters have descriptions). The schema already documents clip, bandHeight, minConfidence, and occupancyThreshold with clear meanings. The description does not add new parameter-level detail beyond what the schema provides, so it sits at the baseline 3 for high coverage. It does clarify the coordinate context for bandHeight (source pixels), but that is minor.
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 ('Return horizontal safe band y-ranges'), defines the exact scope (burned-in video text) and the inverse output (text bands). It explicitly distinguishes itself from describe_video's platform_safe_area and names the sibling detect_text_regions as the data source, so an agent can tell it apart from nearby tools 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?
The description gives a clear use case: 'Use to lay out captions, titles, callouts so they never collide with the video's own text.' It also names the alternative describe_video for platform UI safe areas, routing the agent correctly. It does not list explicit 'when not to use' conditions, but the contrast with describe_video is 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.
save_versionSave versionADestructiveInspect
Save a version of the current project state. The person flicks between versions in the editor to compare or roll back, so one version per logical change-set (not one per tool call) is what they can revisit. name is shown verbatim in the version picker, so a short description reads best (e.g. "add slide-in animation").
| 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, openWorldHint=false, destructiveHint=true), so the description only needs added context. It supplies that by explaining that versions are revisited in the editor for comparison/rollback and that `name` is rendered verbatim in the picker, clarifying downstream effect. It leaves the tension with destructiveHint unaddressed.
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?
Purpose is front-loaded in the first sentence, with granularity and naming guidance following. Slightly wordy in the middle clause ('what they can revisit'), but every sentence carries actionable 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?
With annotations covering safety and an output schema handling return values, the description is nearly complete for a 2-param tool. Minor gap: it does not clarify the destructiveHint=true annotation against an additive 'save' 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 coverage is 100%, so the baseline is 3, but the description adds genuine value: it explains where `name` appears (the version picker) and gives a concrete style example ('add slide-in animation'), which shapes how the agent should format the string.
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 precise verb+resource ('Save a version') and scopes it to 'the current project state', which cleanly separates it from list_versions, delete_version, restore_version, and create_project. An agent can identify the operation 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?
Gives explicit invocation guidance: 'one version per logical change-set (not one per tool call)', which tells the agent when and how often to call. It does not name alternatives (e.g. restore_version for rollback), so it stops short of a full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_pageSelect 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only indicating readOnlyHint=false, destructiveHint=false, and openWorldHint=false, the description adds substantial behavioral context: pages are 0-based from describe_video's pages block, selecting the same page is a harmless no-op, and invalid indices cause failure. These details go beyond the annotations and tell the agent exactly what to expect when invoking the 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 compact set of four sentences, each earning its place: it states the core function, explains the persistence model, specifies how to address pages, and covers the two edge cases. It is front-loaded with the main purpose 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 simple two-parameter switching tool with an output schema present, this description is complete. It explains the state change, the source of the index, the no-op behavior, and the failure mode. There is no missing information an agent would need to call 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% and parameters are already described clearly, the description adds extra meaning by specifying that the index comes from 'describe_video's pages block.' This source hint helps the agent know how to obtain a valid value, going slightly beyond the schema's '0-based index of the page to make active.'
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 ('Switch which page is ACTIVE') and clarifies its role as the target for 'content tools,' which distinguishes it from sibling tools like add_page, delete_page, and reorder_pages. It also names the related tools (describe_video / inspect_layers) that consume this state, 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 clearly explains when to use the tool: before content operations to target a specific page, and that the selection persists until changed. It also gives practical edge-case guidance (no-op for already-active page, failure on out-of-range index) but does not explicitly name alternatives or exclusion conditions, though sibling names make those obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_canvas_sizeSet canvas sizeADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true and readOnlyHint=false. The description goes far beyond by explaining the uniform scaling algorithm (min ratio), recentering behavior, effects on layer positions, sizes, pivots, and keyframes, letterboxing on aspect changes, and per-page scoping. This provides a rich behavioral model that the annotations do not 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 detailed but every sentence earns its place: it front-loads the core action, then explains scaling, recentering, layer/keyframe effects, per-page scope, and finally provides practical size presets. There is no fluff or redundancy; the structure is logical and efficient.
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 an output schema present, return values are not needed. The description covers all essential operational details: scaling behavior, recentering, effects on composition elements, per-page isolation, and typical use cases. An agent has everything needed to invoke the tool correctly and predict outcomes.
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 each parameter is already documented. The description adds value by specifying 'pixels' for width/height (matching schema) and listing common aspect-ratio presets, which helps agents choose correct values. It does not repeat the projectId description, relying on the schema, which is fine given full 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 verb 'Resize' and the resource 'the ACTIVE page's canvas' with explicit dimensions. It distinguishes from siblings by emphasizing 'ACTIVE page' and mentioning that sibling pages remain untouched, and even names the companion tool select_page. This makes the tool's 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 explicitly states when to use it (after selecting a page) and when not to (for other pages, it says 'select_page then set_canvas_size again to resize another one'). It also implies the context of resizing within a project, and provides common size presets that signal typical usage. No alternatives are needed beyond the select_page instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_clip_speedSet clip speedADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses the trim remains unchanged, how timeline length changes (twice/half frames), and that audio is time-stretched with pitch preserved. These are meaningful side effects that the agent needs to know, adding value beyond structured 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 three sentences, front-loads the core behavior and range, then adds behavioral consequences and a usage pointer. No filler; 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?
For a constant-rate retime operation, the description covers the effect on trim, timeline length, audio, and the range. It names the sibling alternative. With an output schema present and annotations providing the destructive flag, nothing an agent needs to invoke 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 coverage is 100%, so the baseline is 3. The description adds interpretive meaning for the speed parameter (explaining its effect on timeline length and audio) beyond the schema's simple range note. It does not add extra context for elementId or projectId, but those are already well described. Thus a 4 is warranted.
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 ('Play a clip slower or faster at a CONSTANT rate') and identifies the resource ('a clip') and the mode ('the normal way to retime a clip'). It clearly distinguishes from add_speed_keyframe by name, 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?
Explicitly provides when-to-use ('the normal way to retime a clip') and when-not-to ('Use add_speed_keyframe instead only when the rate must CHANGE over the clip'), naming the alternative and the exact condition. This leaves no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_custom_fontSet custom fontADestructiveInspect
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 (.woff2/.woff/.ttf/.otf) already uploaded to the project in the editor: pass the filename the upload returned. 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. A URL is not fetched when this tool runs: Morpha's renderer and every browser that opens the project download it later. Reference: https://morphareels.ai/docs/tools#setcustomfontfamily-src-weight-style
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, and the description substantiates both: it discloses that dedupe replaces a matching family+weight+style face, that it does NOT verify the uploaded filename exists (paralleling add_image_layer), and that a URL is not fetched at call time but downloaded later by the renderer and every opening browser. The CORS caveat is exactly the kind of behavioral context annotations cannot 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?
Purpose and the built-in rejection are front-loaded, and nearly every sentence carries actionable content (dedupe, no-verification, CORS, deferred fetch). It is on the long side and the trailing docs URL plus some restatement of schema fields could be trimmed, but there is little true 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?
An output schema exists, so return values need not be explained, and the description still covers the whole workflow: what registers, how layers reference it, dedupe behavior, failure/caveat modes (CORS, no filename validation), and the downstream calls. 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% and the schema already describes family, src, weight, and style. The description still adds meaning beyond it: src accepts the exact filename an upload returned, and the weight/style pair is dedupe-scoped ("replacing a matching face"), which the schema does not state. Slight edge over the baseline 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?
States a specific verb and resource ("Register a typeface Morpha does NOT ship") and immediately scopes it against the built-in catalogs, explicitly naming list_fonts as the sibling whose output is excluded. An agent can distinguish this from list_fonts and the add_text_layer/set_layer_text tools without opening a 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?
Gives explicit when-to-use (non-shipped typefaces), when-not (built-in families from google/bunny/fontshare/fontsource/velvetyne are REJECTED), and the alternative action for that case (set font_family directly). It also routes the follow-up step (add_text_layer / set_layer_text) and prefers upload over URL for CORS reasons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_durationSet durationADestructiveInspect
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. 1-second floor, no ceiling. 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 (1-second floor, no ceiling). 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals key behavioral details: it pins duration_authored to true, disables the auto-fit derivation, and clarifies that content past the new end is retained but not played or exported. This is rich, honest context for a mutating 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 core behavior is front-loaded in the first sentence, followed by the default behavior it overrides, edge-case handling, use cases, and the sibling release path. Every sentence earns its place with 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 bounding-mutation tool with an output schema, the description is complete: it explains the override semantics, the fate of content beyond the new duration, the minimum/ceiling limits, intended use cases, and how to undo the pin. 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 description coverage is 100%, so the baseline is 3. The description adds conceptual meaning like pinning and fixed-canvas authoring, but most concrete parameter details—seconds floor, no ceiling, fps conversion, and projectId selection—are already 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?
States a specific verb/resource combination: authoring an explicit composition length in seconds. It is clearly distinguished from the sibling fit_duration_to_content by describing the pinning behavior and the auto-fit override. An agent can understand exactly 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?
Provides explicit use cases: shortening a comp to a target length or reserving a longer stage than current content fills. It also calls out the alternative/release mechanism, fit_duration_to_content, and explains the default behavior it overrides.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_embed_originsSet embed originsADestructiveInspect
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. Morpha sends the listed websites no request: the list decides which of them may load the project, so any page on an allowed host can show it. The embed serves only saved bookmarks (save_version), never unsaved edits, and leaves out who the project is shared with. Reference: https://morphareels.ai/docs/tools#setembedoriginsorigins
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a destructive mutating call (destructiveHint=true, readOnlyHint=false), and the description adds substantial behavior beyond them: entry normalization (scheme/port/path stripped, lowercased, with concrete example), duplicate dropping, empty-array-disables-embedding (404), 'Morpha sends the listed websites no request,' and the embed serving only saved bookmarks (save_version) never unsaved edits. No contradiction with annotations — the destructive hint aligns with the overwrite semantics.
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 information-dense; every sentence adds a distinct fact (overwrite semantics, normalization rule, duplicate handling, off-behavior, security context, saved-versus-unsaved scoping). It is front-loaded with the core purpose before edge cases, and closes with a reference link. Slightly verbose but fully justified — 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 an output schema exists (so return values need not be explained) and annotations carry the destructive/safety profile, the description covers everything an agent needs: overwrite semantics, normalization behavior, the empty-array-off edge case, duplicate handling, security implications, and the saved-bookmark scoping. For a tool of this complexity it is essentially 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 100%, so the schema already documents both parameters in detail (normalization, empty-array meaning, opaque UUID projectId). The description adds modest incremental value over the schema — the concrete normalization example 'https://example.com/x' → 'example.com' and the duplicate-dropping note — but most parameter meaning is already carried by the schema, matching the baseline 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 states a precise verb-resource pair: 'Replace the project's embed allowlist.' It distinguishes itself from the incremental siblings (add_embed_origin, remove_embed_origin) by emphasizing 'Pass the full desired list; it overwrites the previous one,' making the whole-list semantics unmistakable. An agent can select this tool over its add/remove counterparts without opening any 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 phrase 'Pass the full desired list; it overwrites the previous one' clearly conveys that this is the replace-style variant, implicitly contrasting with incremental add/remove siblings. However, it never explicitly names add_embed_origin or remove_embed_origin nor states 'use this when you want to set the entire list at once,' so the routing is implied rather than spelled out — clear context, but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_embed_startSet embed startADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=false), so the description only needs to add semantics. It does: the band's window length is preserved, and if the band had no window it spans from the given start to the composition end. It does not say what prior start value is overwritten or whether the edit is reversible, which matters for a destructive 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 action is front-loaded in the first clause and every sentence carries information (origin semantics, default span, id provenance). It is delivered as one dense paragraph, so the conditional default-length rule is slightly harder to scan than it could be.
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?
An output schema exists, so return values need not be explained. Given three required params at full schema coverage, the description supplies the missing pieces an agent needs: where bandId comes from, what happens to window length, and the default span when none 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 coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: bandId must come from describe_video and belong to a group with morpha:true, and 'start' is the origin the whole inner reel plays relative to rather than a mere window boundary.
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 – placing an embedded morpha band and setting its time origin on the host timeline – and explains the immediate effect (inner reel plays relative to that frame). An agent can distinguish it from the nearby siblings add_embed_origin, set_embed_origins and remove_embed_origin without opening a 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?
Usage context is given indirectly through the stated problem it solves ('the fix for "the embedded intro doesn't animate"'), which tells the agent when this tool is the right call. It also tells the agent how to obtain the required bandId from describe_video. It never explicitly names an alternative tool or an exclusion, so it falls 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.
set_group_boxSet group boxADestructiveInspect
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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds meaningful behavior: the rect is centered on (pivotX, pivotY) in group-local space, transforms with the group, and a zero dimension hides the backdrop. This does not contradict the destructiveHint or readOnlyHint flags.
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, front-loaded with the action, then two tightly-scoped behavioral details. Every clause carries information; there is no filler or 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?
For a simple four-parameter mutator with a full output schema and annotations covering safety, this description is complete. It covers the geometric behavior, the hide special case, and leaves element/project identification to the well-documented schema.
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 four parameters with types and roles, so the baseline is 3. The description adds value by explaining how box_width and box_height relate to the pivot and group transform, and by specifying the zero-dimension hide behavior, which 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: 'Set a group's backdrop rect size.' This clearly distinguishes it from sibling tools like set_group_window or set_pivot by naming the backdrop rect as the target.
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 need to set a group's backdrop rectangle size. However, it does not explicitly state when to prefer this over related siblings like set_group_window or set_pivot, nor does it mention prerequisites such as the group having a pivot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_parentSet group parentADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/mutating behavior; the description adds non-obvious behavioral detail by warning that a group cannot be placed inside its own descendants. It does not describe other side effects, but this is valuable beyond the 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?
Two short sentences carry the core operation and a critical guardrail; 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?
Given the complete schema, output schema, and annotations, the description is essentially sufficient for correct invocation. It could be slightly richer about when to choose this over sibling grouping tools, but nothing needed to call it 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 adds the parent/child relationship context, but the schema already documents the null-root behavior and ID formats; the descendant-cycle rule is a useful cross-parameter 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 states a precise operation ('Move an element into a group') with an explicit scope ('or out to root'), and names a key boundary condition (refuses descendant cycles). This is enough for an agent to distinguish it from sibling tools like group_layers or move_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 intended use is clearly conveyed: reassigning an element's parent, with null meaning root. It does not explicitly name alternatives or exclusion conditions, so it falls short of a 5, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_group_windowSet group windowADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substantial nuance: it clarifies that contents are not moved or deleted, only clipped. It discloses that writing a window overrides the derived contents-hull, and explains two automatic safety corrections (keyframesCompensatedBy and grownToCoverKeyframes). This goes far beyond the annotation and provides rich behavioral context 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 concise despite covering multiple aspects: purpose, effect, safety corrections, and alternative. It is front-loaded with the core action ('TRIM a group's own visible window') and efficiently packages all essential information in three sentences. No word is wasted.
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 complexity of a destructive window-setting operation, the description covers all necessary context: what the window is, what it does to contents, how safety corrections work, what gets reported, and the alternative for moving. It also mentions the output fields (keyframesCompensatedBy and grownToCoverKeyframes), and since an output schema exists, return details are likely covered there. The description is complete 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 the baseline is 3. The description adds value by explaining that duration is automatically grown to avoid hiding keyframes and that start compensation affects keyframes. It also clarifies that the window is [start, start+duration) and that it's in the parent timeline at 30 fps, which the schema already mentions. The added nuance about safety corrections exceeds the schema's 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 states the tool trims a group's visible window, defining the exact range and effect (clips what is shown, not moved/deleted). It distinguishes from shift_group, which moves contents, and mentions the sibling explicitly. The verb 'TRIM' and resource 'group' are specific and 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 says when to use it: 'use it to hide the head or tail of a whole section.' It also provides a clear alternative: 'To MOVE the group and its contents instead, use shift_group.' This gives both positive and negative guidance, leaving no ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_image_filenameSet image filenameADestructiveInspect
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 image must already be uploaded (upload_image for a web URL or a file attached in the chat; the editor for a file from the person's disk); pass the filename the upload returned, and its name as the label. 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 |
|---|---|---|---|
| name | No | Optional label people see for the layer: pass the upload's returned `name`. Omit to keep the current label; null or an empty string clears it. | |
| filename | Yes | The uploaded file's id: the `filename` its upload returned. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as a write with destructiveHint=true; the description adds the essential nuance that the mutation is narrowly scoped – the bitmap is replaced but id, position, size, animations and styles survive. It also discloses the prerequisite chain (upload_image for a web URL or chat attachment, the editor for a local file), which the annotations cannot 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?
Two sentences, front-loaded with the action and its scope, followed by the prerequisite and the sibling comparison. No filler, and every clause carries distinct 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?
Annotations cover the safety profile, the schema is fully documented, and an output schema exists, so the description need not explain returns. What remains – what gets preserved, where the asset must come from, and why not to use the remove/add pair – is all 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, and the description adds provenance semantics the schema lacks: `filename` must be the value the upload returned, and `name` should be that upload's returned name as the label. That clarifies real ambiguity about where these strings come from.
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 precise verb and resource – repointing an existing image layer at a different uploaded asset – and specifies the exact scope of change (id, position, size, animations, styles preserved; only the bitmap changes). It also names the sibling route (remove_layer + add_image_layer) it is meant to replace, so the agent can distinguish it without opening the 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?
Explicitly gives when-to-use ('swap a layer's image WITHOUT losing its keyframes') and why-not the alternative ('would mint a new id and drop the animations'), plus the prerequisite that the asset must already be uploaded. The agent has a decision rule, not an inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_keyframes_batchSet keyframes batchADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the write as destructive/read-only false. The description adds non-obvious behavior: the operation is atomic — 'any invalid entry rejects the whole batch' — and overwrites existing keyframes. This goes beyond what annotations or schema state.
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, front-loaded sentences: purpose, mechanics, atomicity, and usage. Every sentence earns its place; the examples are concrete and not 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 batch write tool with a full schema, existing output schema, and destructive annotations, the description covers selection, invocation shape, atomic failure behavior, and when to prefer it. 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?
Schema coverage is 100%, so the schema already documents projectId and keyframes entry fields. The description adds only a cross-reference to add_keyframe and the array shape; it doesn't add new semantic detail beyond the schema. 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?
Description opens with a specific verb and scope: 'Add or overwrite MANY keyframes across MANY layers in ONE call.' It is clearly a batch variant and names add_keyframe as the functional single-call equivalent, so an agent can distinguish it from single-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?
Explicitly instructs to use this tool 'whenever you'd call add_keyframe more than a couple of times' and gives concrete use cases. This is an actionable routing rule rather than an implied one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_blockSet layer blockADestructiveInspect
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 set_embed_start.
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond that: keyframes are sampled relative to the block start, so moving/trimming re-anchors the intro; the layer is drawn only inside the window; and frames are interpreted in the parent timeline. It does not discuss persistence or auth, keeping it just under a 5.
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 semantics are front-loaded in the first sentence, and each subsequent sentence adds usable information (the iMovie-clip analogy, parent-timeline frames, the set_embed_start pointer). It is slightly longer than necessary and the analogy could be trimmed, but there is little true waste.
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 an output schema present, return values need no explanation. The description covers window semantics, keyframe re-anchoring, frame coordinate space, the leaf/group applicability, and the related-tool pointer, leaving nothing an agent needs in order 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 description coverage is 100%, so start, duration, elementId, and projectId are already fully documented (including 0-indexed/30fps and the ≥1 constraint). The description reinforces the parent-timeline framing of start/duration but adds no new per-parameter syntax or constraints, 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 gives a specific verb and resource ('Set (or replace) a layer's timeline BLOCK') and precisely defines the object as the [start, start+duration) window. It is immediately distinguishable from siblings like move_layer or set_duration, and it names set_embed_start as the tool for the adjacent-but-different 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?
It provides clear context for when to reach for this tool (to make a layer 'start' at a point rather than span the whole composition) and explicitly routes the embedded-reel case to set_embed_start. It stops short of stating exclusions against other timing tools such as set_duration or fade_layer, so it is not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_fillSet layer fillADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already indicating destructiveness, the description adds substantial behavioral context: clearing removes fill color keyframes, null is rejected on the backdrop, shapes require a Fill, animated fills are refused because the track wins, and the geometry of group fills is defined by box_width/box_height centered on the pivot. This meaningfully exceeds annotation-only knowledge.
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 clause earns its place. The core action is front-loaded, followed by necessary edge-case behavior, paint semantics, and refusal conditions. Despite its length, the structure is logical and there is no filler or repetition of schematic 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?
Given the complex layer-type variations, the animation-refusal rule, and the schema already documenting fill structures, the description covers all decision-relevant behavior an agent needs. It also points to describe_video for finding the backdrop element id. With an output schema present, no additional return-value explanation is required.
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 schema coverage is 100%, the description adds important nuance beyond the schema: null's keyframe-removal behavior, the 'background.canvas' synonym, backdrop-specific rejection of null, and the meaning of clear_animation true vs omitted/false. These details are not inferable from parameter names 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 direct verb and resource: 'Set a layer's fill.' It then elaborates precise semantics per layer type (shapes vs image/video/text/group vs backdrop), which makes the tool's role unmistakable and distinguishes it from related fill/animation tools like add_color_keyframe. This is far more than a tautology.
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 the call is refused ('REFUSED on a layer whose fill is ANIMATED') and prescribes the alternative: 'Change it at a frame with add_color_keyframe, or pass clear_animation:true.' It also clarifies when null is or is not acceptable per layer type, giving agents clear decision rules for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_textSet layer textADestructiveInspect
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. The result carries text_box, fits and a warning when the text runs past the canvas or the safe area (see add_text_layer).
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, so the mutation profile is already covered; the description adds genuinely new context: the result carries text_box/fits plus a warning when text overruns the canvas or safe area, and styling options such as font-weight synthesis and autofit modes are disclosed. The claim 'Only elementId is required' conflicts with the schema (projectId is also required), a small inaccuracy that keeps this below 5.
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?
Core purpose and the add_text_layer exclusion are correctly front-loaded, but the long styling run-down duplicates schema descriptions almost verbatim, so several sentences do not earn their place on a tool that already carries 100% parameter coverage.
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?
Covers the mutation semantics, non-goals, sibling routing, matte workflow, and the warning behavior of the return payload even though an output schema exists. The only gap is the understated required-parameter list, which could mislead an agent into omitting projectId.
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 parameters are already documented; the description mostly restates them (text_color #rrggbb, font_weight 100-900, letter_spacing px may be negative) rather than adding meaning. Baseline 3 is appropriate here.
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?
Opens with a specific verb+resource ('Edit an existing text layer (text.<id>)') and enumerates the patched fields. It explicitly distinguishes itself from add_text_layer (creation) and set_matte_source (masking), so an agent can route correctly without opening a 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?
Gives the partial-update rule ('pass only the fields you want to change'), an explicit exclusion ('Does NOT create layers and does NOT touch image layers'), and a named alternative ('use add_text_layer to make a new one'), plus a pointer to set_matte_source for the masking case. This is explicit when/when-not/alternatives coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_transitionSet layer transitionADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses edge-relative storage that survives trim/slide/retime, the fact that layers created with a block already carry a short fade, that kind "cut" clears the edge, and that lengths are a request that may be squeezed at render time. These are important behavioral traits that annotations do not and cannot express.
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 information-dense, and the core action is front-loaded. Every sentence conveys a distinct behavioral or usage fact. It is slightly repetitive around the phrase 'hard cut', but overall the length is justified by the tool's nuanced state handling.
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 complexityness: it handles 7 parameters, pre-existing state, edge cases, default behaviors, rendering-time adaptation, and interactions with sibling tools. The description covers all of this and no crucial calling context is missing. The output schema also covers return-value expectations, so the description does not need to explain those.
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 meaning that is not in the schema: the length is a request and may be squeezed proportionally, values remain intact after squeezing, kind "cut" clears the edge, and default curve behavior decelerates entries and accelerates exits. This is substantial value beyond the structured 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 starts 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 also names the closest siblings (fade_layer, apply_preset) and distinguishes this tool's edge-relative behavior from their absolute-keyframe behavior, so an agent can clearly tell it apart.
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 'Prefer this over fade_layer / apply_preset whenever the intent is enters and leaves nicely' and explains why the alternatives strand keyframes. It also gives concrete pre-use guidance: check inspect_layers before adding a transition, layers with no blocks are inert, and video clips default to a hard cut. This is clear when-to-use and when-not-to-use guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layer_visibleSet layer visibleADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this mutates state. The description adds valuable behavioral context: it writes a keyframe at frame 0, meaning it affects the animation timeline and is not just a transient UI state. It also implies the layer's opacity is permanently set to 1 or 0 at frame 0, which could affect subsequent keyframes. This goes beyond the 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?
One sentence, front-loaded with the action and mechanism. Every word earns its place. The key behavioral detail (single keyframe at frame 0) is included without bloat.
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 an output schema (not shown) and only 3 simple parameters. The description explains the core behavior and the key side effect (keyframe at frame 0). It doesn't mention whether this overwrites existing opacity keyframes or how it interacts with animated opacity, but for a simple boolean toggle, the description is largely complete. The destructiveHint annotation covers the mutation warning.
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 33% (only projectId is described). The description adds meaning for the 'visible' parameter (1 or 0) but doesn't explain elementId beyond its name. However, elementId is a common pattern across sibling tools and its meaning is inferable. The description partially compensates for the schema gap but doesn't fully document all 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 states a specific verb ('Show or hide'), a resource ('a layer'), and the mechanism ('writing a single opacity keyframe (1 or 0) at frame 0'). This clearly distinguishes it from sibling tools like remove_layer, fade_layer, and set_layer_transition, which have different purposes.
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: instantly toggling layer visibility without animation. It doesn't explicitly name alternatives like fade_layer for animated visibility, but the mechanism ('instantly', 'single keyframe') makes the contrast clear. It lacks explicit when-not-to-use guidance, but the context is sufficient for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_loopSet loopADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a read-write, destructive operation, and the description adds meaningful mechanics: it builds one pass per value, assigns each value to `field` of `elementId`, and notes that an empty array clears the loop state so the composition plays once. This goes beyond the annotations by explaining what the mutation actually does.
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 carry the definition, mechanics, an illustrative example, and the clearing behavior with zero redundancy. The most decision-relevant fact—what a loop pass means—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 4-parameter, 3-required mutation with an output schema, the description fully explains the loop model, how values map to passes, how to clear the loop, and which layer field is affected. No critical operational detail 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 parameters are already documented with types and examples. The description reinforces the relationship between `values`, `field`, and `elementId` but does not add materially new semantics 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?
The description opens with a specific verb-resource pair, 'Set the project's loop section,' and immediately defines the behavior: the whole composition repeats once per value while one field of one layer varies. This clearly separates it from sibling tools like set_track_loop, which would target only a track rather than the entire 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?
It gives a concrete use case ('a caption text layer cycling through several strings') and explicitly explains how to clear the loop with an empty values array. It does not explicitly name alternatives or list when not to use it, but the project-level scope and example make the intended context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_matte_sourceSet matte sourceADestructiveInspect
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.). The source is CONSUMED: it stops painting as a layer of its own, so do NOT hide it or set its opacity to 0 (an invisible stencil empties the mask and the host vanishes). It has no time window of its own: it follows the host's, and attaching drops its block and edge transitions (source_window_dropped in the result). Its position, scale, rotation and keyframes shape the mask. 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by disclosing that the source is consumed, that hiding/opacity-0 will empty the mask, that the source follows the host's time window, and that attaching drops block/edge transitions. This is exactly the kind of behavioral context an agent needs to avoid destructive mistakes.
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 nontrivial guidance: purpose, host/source compatibility, consumption warning, masking behavior, and clearing. It front-loads the core definition before diving into constraints and edge cases.
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 complexity of the tool and the presence of an output schema, the description covers all needed operational details: valid inputs, restrictions, side effects, transform behavior, time-window handling, and the clear path. No critical gap remains 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%, yet the description still adds substantial parameter-level meaning: elementId's host type rules, matte_source_id's consumption behavior and null-to-clear, matte_inverted's leaf-only support and reset behavior, plus transform inheritance. This far exceeds 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?
Description uses a specific verb ('Set (or clear)') and resource ('track matte'), and explains the host/matte relationship with concrete examples. It fully distinguishes this operation from the many sibling set_* tools by naming its object (matte source) and its effect.
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 extensive context on when and how to use: valid host types (leaf vs group), valid source types, the requirement that group hosts use shapes, and the caution that the source is consumed. It doesn't explicitly name alternative tools, but the constraints are clear enough that an agent can apply it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pivotSet pivotADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose mutability (readOnlyHint false, destructiveHint true), so the description's added value is the normalization behavior and the explicit 'Static (not animated)' note. It could also mention that calling this overwrites the existing pivot, but the destructive annotation plus 'Set' make that reasonably 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 three focused sentences with no filler. It front-loads the core purpose, then gives behavioral detail, and ends with a clear alternative for groups. 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?
For a three-parameter tool with a fully documented schema and an output schema, the description covers scope, behavior, and alternatives. An agent has everything needed to decide when to invoke it and what it will do.
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 elementId, anchor, and projectId thoroughly. The description reinforces the anchor concept and adds the normalized-to-bbox behavior, but it does not add significant parameter-level details 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 verb and resource: it sets the rotation/scale pivot anchor for leaf layers (image, video, shape, text). It also distinguishes itself from move_layer by explicitly covering groups, making it easy for an agent to select the right 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 gives clear context for when to use this tool: for leaf layers, not groups, and for static (non-animated) pivot setting. It explicitly names move_layer as the alternative for groups, so an agent knows what not to use this tool for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_styleSet styleADestructiveInspect
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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint/readOnly annotations, it discloses important behavioral nuances: partial update semantics, borderAlign placement effects (inner draws inside and eats content), pass-null-to-clear patterns, and alphaMask as a multiplicative fade. This substantially exceeds what the annotations alone 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 dense but well organized: core semantics first, then a compact inventory of fields with parenthetical clarifications. A few long asides (e.g., the full alphaMask pointer) are included, but they replace schema detail and are not 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?
For a 15-parameter mutation with a rich schema and output schema, the description covers the critical behavioral surface: what counts as style, which fields are image-only, partial-update semantics, and clear/removal patterns. It does not mention blend_mode or chroma_key, but those are thoroughly described in the schema and are not hidden behaviors.
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 (80%), so the schema already documents most parameters. The description adds value by grouping parameters into style families and spelling out semantic relationships (e.g., anchorX/anchorY meaningful only under cover/contain, tintStrength with tintColor). It does not need to repeat every schema 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 opens with a specific verb and resource ('Set style fields on a layer') and immediately delimits its scope by enumerating the field families it covers (border/radius/shadow plus image-only fields). This makes it easy to distinguish from sibling tools like set_layer_fill or set_layer_text even without opening their 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?
The description gives clear usage context: partial updates are the default ('Only the fields you pass are changed; omit a field to leave it untouched'), and it flags image-only constraints early. It does not explicitly name alternative tools or list when-not-to-use conditions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_text_backgroundSet text backgroundADestructiveInspect
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. Returns text_box and fits for the padded box, with a warning when it runs past the canvas or the safe area.
| 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. On a "hug" layer it is what sizes the box around the label; on a fixed-size layer ("wrap", "fit", "shrink") lines wrap inside the padded area, so padding narrows where they break. 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=false, so the mutation/risk profile is covered. The description adds real context beyond that: partial-update semantics ('pass only the fields you want to change'), the removal path via fill null, and the return contract (text_box and fits, with a warning when the box runs past the canvas or safe area).
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?
Front-loaded with the core action before the button-building rationale, and every sentence does work. It is dense and a bit long, with the THIS IS HOW YOU BUILD A BUTTON passage reading as persuasive rather than strictly necessary, but nothing is pure 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?
An output schema exists, so the brief mention of text_box/fits is a bonus rather than a burden. For an 8-parameter mutation it covers the meaningful behaviors, the alternative tool, and the exception case; the only mild gap is that the animated-fill refusal path is documented in the schema rather than surfaced in the description.
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 carries conceptual meaning the schema does not: it explains that padding is what sizes a 'hug' box around the label while on fixed-size layers padding narrows where lines break, and that fill null clears whereas omitted leaves the current fill. This is additive semantics, not a restatement of field 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?
States a specific verb and resource (add/update the rounded background box behind a TEXT layer), names the identifier format (text.<id>), and enumerates the concrete fields it touches (fill, padding, corner radius, stroke). It explicitly distinguishes itself from the sibling set_layer_fill by declaring its scope is text layers only.
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 routes the agent: use set_layer_fill for shapes/images/video, use set_layer_text(text_autofit:"hug") only for older 'wrap' layers, and pass fill null to remove the box. It even carves out a when-not case (curved text, where an arc-shaped chip genuinely needs a shape instead), which is unusually precise guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_track_loopSet track loopADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a destructive, read-write operation, so the description's job is to add nuance. It does this well by explaining what each mode does and by disclosing the no-effect condition for short tracks. This gives an agent a realistic model of the tool's behavior beyond the raw mutation flag.
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 first defines the operation, the second explains all four mode options, and the third gives an important limitation. It is front-loaded with the primary action and remains compact despite covering a fair amount of behavior.
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 an output schema and four parameters, the description plus input schema covers the required calling context well: projectId and elementId are in the schema, mode semantics are in the description, and the keyframe-count caveat addresses a real edge case. It loses a point only for not distinguishing itself from the sibling set_loop 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 only 50%, with 'mode' and 'property' lacking descriptions. The description compensates strongly for 'mode' by explaining each enum value's behavior, turning raw strings into actionable semantics. It offers less for 'property' and the ID parameters, though those are adequately covered by the schema or 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 and resource: 'Set the extrapolation mode for one property's animation track.' This clearly distinguishes it from broader tools like set_loop by narrowing scope to a single property's track. The enumeration of modes further clarifies exactly 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 gives useful context, such as the default mode being 'hold' and the caveat that it 'has no effect on tracks with fewer than 2 keyframes.' However, it never explicitly addresses when to use this tool versus the similarly named sibling set_loop, nor does it mention any explicit exclusions or alternatives beyond the keyframe count.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_video_clipSet video clipADestructiveInspect
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 be uploaded (the editor's Add video); pass the filename the upload returned, and its name as the label. Use this to swap a video layer's source WITHOUT losing its keyframes.
| Name | Required | Description | Default |
|---|---|---|---|
| clip | Yes | The uploaded clip's id: the `filename` its upload returned. | |
| name | No | Optional label people see for the layer: pass the upload's returned `name`. Omit to keep the current label; null or an empty string clears 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description adds nuance the annotation cannot: the layer's id, position, size, animations, styles and trim window are preserved, and only the source mp4 is replaced. It also flags the upload prerequisite. Useful context beyond the safety hints, though nothing on failure modes 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?
Three front-loaded sentences with no filler, but the closing clause ('WITHOUT losing its keyframes') re-states the preservation point already made in the first sentence, a mild 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?
With an output schema present and annotations covering the safety profile, the description only needs to cover prerequisites and mutation semantics, which it does. Minor gaps around invalid filenames or error behavior keep it from 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 the schema already documents all four parameters, including that `clip` is the upload's returned filename and `name` is the label. The description restates that mapping but adds no new syntax or edge-case detail, so baseline 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?
Specific verb+resource: 'Repoint an existing video layer at a different uploaded clip', with scope spelled out (only the source mp4 changes). It is clearly distinguishable from add_video_layer (creation) and set_image_filename (image variant) without opening either 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?
States when to use it ('swap a video layer's source WITHOUT losing its keyframes') and a prerequisite ('The clip must already be uploaded'). It does not name alternative siblings such as add_video_layer or set_video_layer_trim, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_video_layer_mutedSet video layer mutedADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds meaningful context: it explains the pipeline behavior (audio demuxing) and explicitly states the effect on preview and export, which goes beyond the annotations. No contradiction with 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 three sentences, front-loading the core action and then providing pipeline context. It is concise enough while adding valuable background. Each sentence contributes to understanding the tool's behavior, with no 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 simple setter with three required parameters and a destructive annotation, the description covers the purpose, the pipeline reason, and the effect on preview/export. An output schema exists (not shown but noted), so return values are covered. Nothing critical is missing for an agent to call this 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% for all three parameters, so the schema already documents each parameter's meaning. The description does not add significant parameter-specific semantics beyond what the schema states, so the 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 clearly states the verb (mute/unmute) and the resource (video layer's baked audio), and specifies the effect (silenced in both preview and export). It does not explicitly contrast with sibling tools, but the purpose is unambiguous and specific enough to distinguish it from other setters like set_video_layer_visible 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?
The description provides clear context on when this tool is relevant: it explains the audio-split pipeline step that sets muted=true and instructs to pass muted:false to restore audio. It does not mention alternative tools or exclusions, but the context is sufficient for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_video_layer_trimSet video layer trimADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the agent knows this is a mutation. The description adds valuable transparency by stating 'Only the fields you pass are changed,' which clarifies the partial-update behavior. It also explains that source_out_frame can be null to play to natural end. However, it doesn't discuss reversibility or permission requirements, but these are not essential given the annotation coverage. The partial-update disclosure is a meaningful addition 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?
The description is compact—two sentences that front-load the core action and then provide the workflow. Every sentence earns its place: the first defines the operation and parameters, the second gives the use case and a concrete recipe. There is no 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 that the schema covers all parameters and an output schema exists, the description need not explain return values. The workflow hint (duplicate the layer) is a useful completeness addition that covers a common edge case. It doesn't address potential errors (e.g., invalid frame ranges), but for a patch operation with clear field semantics, this is adequately complete. A perfect 5 might include a note about validation, but the description already stands above typical 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 description coverage is 100%, so all parameters are already documented in the schema. The description re-states each parameter with slight elaboration (e.g., 'frame in source to start' vs. schema's 'Frame in the source mp4 where playback begins'), but the added value is minimal. It doesn't introduce any semantic that isn't already in the schema, so it meets the baseline of 3 but doesn't exceed 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?
The description opens with a specific verb and resource: 'Patch a video layer's trim window,' and then enumerates the three fields that make up the trim. It also states the intended use case ('clip out a segment of a source mp4'), which clearly differentiates it from sibling tools like set_video_clip or set_duration. The 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?
The description explicitly tells the agent when to use this tool ('Use this to clip out a segment of a source mp4') and even provides a step-by-step recipe: 'duplicate the layer first... then set disjoint source windows.' This goes beyond mere context and offers actionable guidance for correct invocation, making it superior to simply saying 'use for trimming.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shift_groupShift groupADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses important behavioral traits: start is absolute and idempotent, descendants keep spacing, the move clamps at frame 0, welded caption lines are intentionally left behind, and embedded morpha bands move as a unit. These details materially help an agent predict side effects without running the 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 dense but every sentence carries operational meaning, and the core purpose is front-loaded in the first clause. It uses clear formatting with emphatic terms and structured caveats, and while longer than average, the length is justified by the tool's non-obvious behavior.
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 mutating tool with three required parameters, the description covers semantics, scope, edge cases, failure modes, and alternatives. It also references the output schema's existence indirectly by not needing to describe return values, and it leaves an agent with no material unknowns about how the operation behaves.
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 explains start as an absolute frame and not an offset. The description adds further value by emphasizing idempotence ('calling it twice with the same value is a no-op') and clarifying that the group's window ends up at that absolute frame, which supplements the schema without redundancy.
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 the tool from related operations by naming set_group_window and set_layer_block as the clipping alternatives, so an agent can select 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 states when this tool is appropriate ('slide this whole section later') and gives concrete when-not guidance: use set_group_window for clipping a group and set_layer_block for a single layer. It also documents failure conditions when the group is empty or contains an always-present layer, giving an agent clear criteria for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shift_trackShift trackADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true)Skip; the description adds useful context that shifting preserves relative spacing, slides the whole curve, and leaves keyframe times untouched. It does not add cautions about irreversibility, but the annotations cover the destructive nature.
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 no filler: the main action is front-loaded, the key distinction (times untouched) is explicit, and the examples are compact but informative. 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 description is complete enough to invoke the tool for common cases: it clarifies scope, gives delta examples, and says times are untouched. With an output schema present, return values need no explanation; the main remaining gap is unresolved semantics for the 'curve' property and exact units for scale/width/height.
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 describes delta and projectId, but property and elementId lack descriptions. The description's examples add semantics for x, opacity, and rotation, yet elementId remains implicit and the 'curve' enum value is never explained, so parameter compensation is only partial.
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: 'Bulk-shift every keyframe's VALUE on one property of one layer by delta.' It clearly distinguishes itself from sibling tools like move_layer or shift_group by emphasizing keyframe values, not layer transforms, and explicitly notes that keyframe times are 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?
It gives concrete use cases: 'move all x by -30px', 'retiming a fade by adjusting its base opacity', and 'rotating an existing wobble by 10°'. This tells an agent when to use the tool, though it does not explicitly state when not to use it or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_projectShow projectARead-onlyInspect
Show the project in the chat as a live preview that plays and follows every edit; a multi-page project turns its pages in the preview. Call it once per project, right after creating or opening it; later edits appear in the preview without calling again. Answers { name, pages, placards, durationSeconds, editorUrl }. Its result also carries one picture per page, a Morpha placard shaped like that page (up to 12, in page order): use it wherever you show a page, and never make or fetch a picture of your own. The preview lasts 30 minutes; call again if the person comes back later. controls picks the player's controls: 'full' (the default: play, a scrub bar, the time, sound and fullscreen) or 'play' (the play button alone, for a preview that should look like a plain video). In a client that cannot render a preview, give the person the editorUrl instead.
| Name | Required | Description | Default |
|---|---|---|---|
| controls | No | Which controls the preview shows: 'full' (default) or 'play' for the play button alone. | |
| projectId | Yes | Id of the project to show. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, it discloses the 30-minute preview lifetime and refresh behavior, the fact that the result carries one picture per page up to 12 in page order with a Morpha-shaped placard, and the instruction never to fetch your own image. It also documents the side effect of the preview appearing in the chat, which annotations alone do not 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?
Front-loaded with purpose, then usage, then return payload, then constraints, so an agent can stop reading early. It is dense and runs long with several stacked clauses (return shape, picture payload, expiry, controls), so a small amount could be trimmed without loss.
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?
Covers everything needed to invoke correctly: when to call, lifecycle/expiry, alternative rendering path, and the image payload semantics that the output schema likely does not explain. Nothing an agent needs to select or invoke the tool 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 enum is already in the schema, but the description adds real meaning: 'full' is spelled out as play, scrub bar, time, sound and fullscreen, versus 'play' as the play button alone, plus the intent ('a preview that should look like a plain video'). It adds little about projectId beyond the schema's 'Id of the project to show.'
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 ('Show the project in the chat as a live preview') plus the distinguishing behavior: the preview plays and follows every edit, and multi-page projects turn pages. This clearly separates it from open_project/create_project and from render_video, which an agent can tell apart without opening a 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?
Gives explicit timing ('call it once per project, right after creating or opening it'), an explicit do-not-call-again rule ('later edits appear in the preview without calling again'), a re-call condition after the 30-minute expiry, and a stated fallback for clients that cannot render ('give the person the editorUrl instead'). This is textbook when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
split_caption_lineSplit caption lineADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the destructiveHint annotation, detailing the exact cloning behavior (style, band geometry, weld), the text-division rule (nearest word gap, single-word line handling), the weld behavior (stays welded, frame converts to source timeline), and the return value. This provides the agent with deep insight into what will happen, far beyond the annotation's simple destructive hint.
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 adds value: it states the action, the split rule, the cloning, the weld behavior, the return, and follow-up actions. It is front-loaded with the essential purpose and then details edge cases. No 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?
For a mutation tool with an output schema and a destructive hint, the description covers all essential behavioral aspects: what happens to each half, how text divides, how welds behave, what is returned, and what to do next. An agent has all the information needed to call it correctly and anticipate the result.
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 100% of parameters with descriptions, so the baseline is 3. The description does not add extra semantic detail about the parameters themselves beyond what the schema already states (e.g., atFrame must be strictly inside window). It does mention the splitFrame return, but that's not parameter semantics. No need to compensate for gaps since the schema is thorough.
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 ('Split'), a specific resource ('one caption line'), and the exact condition ('at a COMPOSITION frame strictly inside its window'). It clearly distinguishes from the sibling 'merge_caption_lines' by describing the opposite operation, and it details the outcome (right half is a clone, text division rule).
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 this tool: when you need to split a caption line at a specific frame. It also provides follow-up guidance ('Retime the halves afterwards with set_layer_block; fix the wording with set_layer_text'), which helps the agent plan subsequent actions. However, it doesn't explicitly mention when NOT to use it or alternative tools like merge_caption_lines, though the purpose is self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_clipTranscribe clipARead-onlyInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and destructiveHint annotations already establish it as a safe read operation. The description adds valuable behavior beyond that: the transcript is cached in R2, generated client-side in the editor when absent, and may return a 'not-ready' status, giving the agent a clear model of what to expect.
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: purpose, generation/caching behavior, codec independence, and return shape. The key purpose is front-loaded first, and the rest is relevant detail 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?
The description covers the important non-obvious behaviors: caching, client-side generation, codec independence, and the ready/not-ready status. An output schema exists so return-value documentation is not a gap; one minor omission is explicit guidance on what to do when status is 'not-ready', though it is inferable.
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 fully describes both parameters with 100% coverage, so the baseline of 3 applies. The description does not add new parameter-level meaning beyond what the schema already states; its extra detail is about return behavior, not 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 starts with a specific verb and resource: it returns the cached transcript of a clip's audio. It also distinguishes itself from the OCR/video pipeline by noting it runs on the audio track and works on HEVC/AV1 clips that OCR can't decode, which clearly separates it from siblings like describe_video.
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 the goal is an audio transcript rather than video/OCR analysis, especially for codecs the OCR pipeline can't handle. It does not explicitly name alternatives or state 'use this instead of X', so it stops short of full explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ungroup_layersUngroup layersADestructiveInspect
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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the destructiveHint and readOnlyHint annotations. It discloses the critical side effects: the group's animation tracks are discarded, children survive at their last positions, and children inherit none of the group's keyframes. This gives an agent an accurate mental model of what is destroyed and what survives.
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 zero filler. The first sentence states the core behavior, and the second adds the critical caveat about discarded animation tracks and non-inheritance of keyframes, separated by an em dash for clarity. 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 destructive hierarchy mutation with a full input schema and an output schema, the description covers everything an agent needs to decide and invoke correctly: the resulting structure, what is destroyed, what survives, and the positional inheritance behavior. No essential behavioral detail 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 schema already gives strong semantics for both parameters: groupId is described as a bare id without the 'group.' prefix, and projectId as an opaque v4 UUID from list_projects/create_project. The description adds no parameter-specific meaning beyond what the schema provides, 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 — 'Dissolve a group' — and explains the exact structural effect: children are spliced into the group's parent at the group's old position. This clearly distinguishes it from sibling tools like group_layers, set_group_parent, or rename_group by describing the destructive, hierarchy-changing outcome.
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 when to use the tool — when you want to remove a group while keeping its children in the hierarchy — but it never explicitly names alternatives or states when not to use it. For example, set_group_parent is an alternative that preserves the group, but it isn't mentioned. The usage context is clear but left to inference rather than explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_audio_overlayUpdate audio overlayADestructiveInspect
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. | |
| name | No | The track's label people see (pass the upload's returned `name` alongside a replacement `filename`), or null to remove it. | |
| endFrame | No | End frame, or null to clear and use the asset's natural length. | |
| filename | No | Replace the track's audio: the stored filename an upload returned. | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the partial-update behavior (only passed fields change) and the special null-clearing for endFrame, which adds value beyond the annotations (destructiveHint: true). It does not contradict annotations; it complements them with specific mutation semantics.
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 fluff: the first states the purpose and the second gives a concrete usage hint. The partial-update behavior is front-loaded, making it immediately actionable.
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 core purpose and one key behavior, but with 11 parameters and 4 lacking schema descriptions, it leaves gaps for the agent. The existence of an output schema covers return values, but the description does not help with the undocumented parameters, making it only partially complete for a tool of this complexity.
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 description adds meaning only for endFrame (null clearing), which the schema already describes. It does not clarify the four undocumented parameters (startFrame, fadeInFrames, fadeOutFrames) or otherwise compensate for the 64% schema coverage. The value added over the schema is minimal.
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 ('Patch') and a specific resource ('an existing audio overlay'), which clearly distinguishes it from siblings like add_audio_overlay and remove_audio_overlay. The partial-update semantics further clarify its role as a modifier, not a creator or destroyer.
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 for modifying an existing overlay, and explicitly notes that only passed fields are changed, which guides an agent to use it for targeted updates. However, it does not explicitly name alternatives or conditions when not to use it, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_audioUpload audioADestructiveInspect
Upload an audio track into a project from a public http(s) URL or a file attached in the chat, fetched 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 file that is already uploaded). Pass url for a public http(s) link, or file for a file the person attached in the chat (a host that supports file inputs, such as ChatGPT, fills file with a temporary download link itself; do not ask the person for a URL to something they have attached). The target is the URL you pass and nothing else: Morpha's Worker fetches it with a plain HTTP GET, following redirects, and identifies itself as "Morpha/1.0 (+https://morphareels.ai; hello@morphareels.ai)". No third-party API is involved. The worker downloads the .mp3/.m4a/.wav/.ogg/.aac, stores it in the project's asset bucket under a new id, and returns { filename, name, sizeBytes, contentType }. Then pass the returned filename (the file's id, never shown to a person) 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), with name as the track's name. A url must be a direct, publicly-fetchable http(s) link (not an auth-walled page). Buffered in Worker memory, so capped at 50 MB. A file on the person's own disk is uploaded in the editor. Reference: https://morphareels.ai/docs/tools#uploadaudiourl-file-name
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Direct, publicly-fetchable http(s) URL of the audio file (.mp3/.m4a/.wav/.ogg/.aac). Pass either this or `file`. | |
| file | No | A file the person attached in the chat (a host that supports file inputs, such as ChatGPT, fills this itself; do not type it). Pass either this or `url`. | |
| name | No | Optional display name, what people see (e.g. Theme.mp3). Defaults to the attached file's name or the URL's file name. It never decides where the file is stored. | |
| projectId | Yes | Project to add the audio to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, openWorld=true, destructive=true), yet the description adds substantial behavioral detail beyond them: server-side plain HTTP GET with redirects, a named user-agent, no third-party API, buffered in Worker memory with a 50 MB cap, and storage in the project's asset bucket under a new id. This is exactly the extra context annotations cannot carry.
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?
Front-loaded with purpose, then usage, then the fetch mechanism, then the downstream handoff, so the structure is sound. It is dense and runs long, with some mechanism detail (user-agent string, reference URL) that borders on surplus, keeping it out of the top score.
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 nested objects, four parameters, and an output schema, the description supplies everything needed: accepted formats, source options, size cap, storage behavior, and the exact next step. Return-value details are even redundantly restated despite the output schema, so nothing 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 real semantics: `url` must be a direct, publicly-fetchable link (not an auth-walled page), `file` is host-populated rather than typed, and `name` never decides storage location. These caveats are not fully captured by the schema text 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 a specific verb+resource ('Upload an audio track into a project') and immediately distinguishes itself from siblings: it is 'the ONLY way to get an audio file's bytes into a project over MCP/HTTP,' while add_audio_overlay/update_audio_overlay only reference an already-uploaded file. An agent can route correctly without opening any 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?
Explicitly specifies the two mutually exclusive paths (`url` for a public http(s) link, `file` for a chat-attached file) and warns not to ask the person for a URL to something they attached. It also states the downstream handoff (pass returned `filename` to add_audio_overlay or update_audio_overlay), so both when-to-use and what-comes-next are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imageUpload imageADestructiveInspect
Upload an image into a project from a public http(s) URL or a file attached in the chat, fetched server-side. Pass url for a public http(s) link, or file for a file the person attached in the chat (a host that supports file inputs, such as ChatGPT, fills file with a temporary download link itself; do not ask the person for a URL to something they have attached). The target is the URL you pass and nothing else: Morpha's Worker fetches it with a plain HTTP GET, following redirects, and identifies itself as "Morpha/1.0 (+https://morphareels.ai; hello@morphareels.ai)". No third-party API is involved. The worker downloads the .png/.jpg/.jpeg/.gif/.webp/.svg, stores it in the project's asset bucket under a new id, and returns { filename, name, sizeBytes, contentType, width, height }: pass the returned filename (the file's id, never shown to a person) to add_image_layer, and name is what people see; width and height are the picture's own pixel size (null when its header did not say), so size the layer from them or pass add_image_layer one side and let it keep the aspect. This tool does not search for images: pass a direct image file URL, such as one the person has given you, and respect the licence its source states. A 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 MB. A file on the person's own disk is uploaded in the editor. Reference: https://morphareels.ai/docs/tools#uploadimageurl-file-name
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Direct, publicly-fetchable http(s) URL of the image file (.png/.jpg/.jpeg/.gif/.webp/.svg). Pass either this or `file`. | |
| file | No | A file the person attached in the chat (a host that supports file inputs, such as ChatGPT, fills this itself; do not type it). Pass either this or `url`. | |
| name | No | Optional display name, what people see (e.g. Logo.png). Defaults to the attached file's name or the URL's file name. It never decides where the file is stored. | |
| projectId | Yes | Project to add the image to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the call succeeded. |
| data | No | The payload, shaped by the tool. |
| note | No | What to do next when not ready. |
| error | No | Why it failed. |
| status | No | For cache-backed readers: whether the answer was ready. |
| editorUrl | No | Opens this project in the editor. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only readOnly/openWorld/destructive hints; the description adds substantial behavior the annotations cannot express: server-side fetch semantics (plain HTTP GET, follows redirects, a named User-Agent), 'No third-party API is involved', storage into the project's asset bucket under a new id, a 16 MB cap imposed by Worker-memory buffering, and explicit SVG rejection rules (script tags, event handlers, foreignObject, javascript: URLs, external references).
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 verb, resource and source options are front-loaded in the first sentence, and most of the length is load-bearing (limits, SVG rules, return routing). It loses a point for a single run-on paragraph and some restatement, e.g. the 'direct, publicly-fetchable http(s)' requirement appears in both the first and second half, and the trailing docs URL adds little 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?
Despite an output schema existing, the description still helps by naming the returned fields and telling the agent to pass `filename` (not `name`) into add_image_layer and to use `width`/`height` for sizing. Combined with the size cap, accepted formats and SVG rejection conditions, an agent has everything needed to invoke this correctly and handle the common failure modes.
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 3 is the baseline, but the description meaningfully enriches semantics beyond the schema: `file` is host-populated and must not be typed by the agent, `url` must be a direct publicly-fetchable link rather than an auth-walled page, and `name` is display-only and 'never decides where the file is stored.' That clarification of intent goes past the field-level text, though it does not fully annotate every field.
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 with explicit source scope ('Upload an image into a project from a public http(s) URL or a file attached in the chat, fetched server-side'), and later sentences actively distinguish it from siblings by naming add_image_layer as the consumer of the returned filename and stating 'This tool does not search for images.' An agent can separate it from add_image_layer and upload_audio without opening any 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?
It gives explicit conditional routing: 'Pass `url` for a public http(s) link, or `file` for a file the person attached in the chat,' plus the anti-pattern 'do not ask the person for a URL to something they have attached.' It also states what the tool is not for ('does not search for images') and where an out-of-scope case belongs ('A file on the person's own disk is uploaded in the editor').
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.
2 tool updates
- Added
list_trash - Added
restore_project
1 tool update
- Removed
create_upload_link
1 tool update
- Changed
add_image_layer3 fields changed- changed
Input schema / properties / height / descriptionPrevious value: -"Height in px (must be > 0)."New value: +"Height in px (> 0). Omit it to derive it from `width` and the image's aspect; the usual call passes `width` alone." - changed
Input schema / properties / width / descriptionPrevious value: -"Width in px (must be > 0)."New value: +"Width in px (> 0). Omit it to derive it from `height` and the image's aspect." - changed
Input schema / requiredPrevious value: -[ - "filename", - "x", - "y", - "width", - "height", - "projectId" -]New value: +[ + "filename", + "x", + "y", + "projectId" +]
2 tool updates
- Changed
upload_audio4 fields changed- added
Input schema / properties / fileAdded value: +{ + "description": "A file the person attached in the chat (a host that supports file inputs, such as ChatGPT, fills this itself; do not type it). Pass either this or `url`.", + "properties": { + "download_url": { + "description": "Temporary URL the host serves the file at.", + "type": "string" + }, + "file_id": { + "description": "The host's id for the file.", + "type": "string" + }, + "file_name": { + "description": "The file's own name, when the host knows it.", + "type": "string" + }, + "mime_type": { + "description": "The file's media type, when the host knows it.", + "type": "string" + } + }, + "required": [ + "download_url", + "file_id" + ], + "type": "object" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Optional display name, what people see (e.g. Theme.mp3). Defaults to the URL's file name. It never decides where the file is stored."New value: +"Optional display name, what people see (e.g. Theme.mp3). Defaults to the attached file's name or the URL's file name. It never decides where the file is stored." - changed
Input schema / properties / url / descriptionPrevious value: -"Direct, publicly-fetchable http(s) URL of the audio file (.mp3/.m4a/.wav/.ogg/.aac)."New value: +"Direct, publicly-fetchable http(s) URL of the audio file (.mp3/.m4a/.wav/.ogg/.aac). Pass either this or `file`." - changed
Input schema / requiredPrevious value: -[ - "projectId", - "url" -]New value: +[ + "projectId" +]
- Changed
upload_image4 fields changed- added
Input schema / properties / fileAdded value: +{ + "description": "A file the person attached in the chat (a host that supports file inputs, such as ChatGPT, fills this itself; do not type it). Pass either this or `url`.", + "properties": { + "download_url": { + "description": "Temporary URL the host serves the file at.", + "type": "string" + }, + "file_id": { + "description": "The host's id for the file.", + "type": "string" + }, + "file_name": { + "description": "The file's own name, when the host knows it.", + "type": "string" + }, + "mime_type": { + "description": "The file's media type, when the host knows it.", + "type": "string" + } + }, + "required": [ + "download_url", + "file_id" + ], + "type": "object" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Optional display name, what people see (e.g. Logo.png). Defaults to the URL's file name. It never decides where the file is stored."New value: +"Optional display name, what people see (e.g. Logo.png). Defaults to the attached file's name or the URL's file name. It never decides where the file is stored." - changed
Input schema / properties / url / descriptionPrevious value: -"Direct, publicly-fetchable http(s) URL of the image file (.png/.jpg/.jpeg/.gif/.webp/.svg)."New value: +"Direct, publicly-fetchable http(s) URL of the image file (.png/.jpg/.jpeg/.gif/.webp/.svg). Pass either this or `file`." - changed
Input schema / requiredPrevious value: -[ - "projectId", - "url" -]New value: +[ + "projectId" +]
1 tool update
- Changed
show_project1 field changed- added
Input schema / properties / controlsAdded value: +{ + "description": "Which controls the preview shows: 'full' (default) or 'play' for the play button alone.", + "enum": [ + "full", + "play" + ], + "type": "string" +}
1 tool update
- Added
show_project
4 tool updates
- Removed
add_morpha_layer - Added
embed_project - Removed
move_band - Added
set_embed_start
1 tool update
- Changed
render_video1 field changed- changed
Input schema / properties / scale / descriptionPrevious value: -"Optional output scale: 2 (the default) renders at twice the canvas, roughly 4K for a portrait project; 1 renders at the canvas's own size for a faster, cheaper file. Nothing else is accepted."New value: +"Optional output scale: 2 (the default) renders at twice the canvas, roughly 4K for a portrait project; 1 renders at the canvas's own size for a faster file that uses less allowance. Nothing else is accepted."
Related MCP Connectors
Edit video by talking to your AI — search footage, cut timelines, apply effects, add captions.
A video editor in your browser that your AI drives: cuts, captions, multicam, motion titles, export.
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.
Related MCP Servers
AlicenseAqualityBmaintenanceEnables 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.10318 npmMIT- FlicenseNot gradedqualityAmaintenanceEnables users to turn raw video clips into finished, beat-synced montages through natural-language chat, with automated shot selection, music matching, subtitles, transitions, and picture-in-picture. It returns reviewable timelines and contact sheets before rendering on approval.-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to autonomously edit raw video footage into publish-ready videos with millisecond-accurate cuts, Whisper transcription, karaoke captions, motion graphics, and high-CTR thumbnails.10 npm6MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to generate, edit and render finished, ready-to-post videos from a plain-language prompt, including script, visuals, voiceover, captions and music for TikTok, Reels and YouTube. Also supports remaking reference videos, importing your own media, and reviewing or adjusting existing videos before rendering.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.