Skip to main content
Glama

Server Details

AI editor to build, animate & export layered short-form video projects via one tool catalog.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.6/5.0

Scored across 98 tools

Disambiguation3/5

Most tools have clearly distinct domains, but several near-duplicates create real selection risk: add_keyframe/add_keyframes/set_keyframes_batch, duplicate_project vs create_project(fromProjectId), add_shape's curve/arrow kinds vs add_curve, and the timeline-window quartet set_layer_block/set_group_window/shift_group/move_band. The descriptions do resolve the distinctions, so it's usable but not clean.

Naming Consistency3/5

The surface broadly follows snake_case verb_noun, but the verb vocabulary is inconsistent: delete_project/delete_page/delete_version vs remove_layer/remove_keyframe/remove_audio_overlay/remove_embed_origin; update_audio_overlay vs the many set_* tools; and add_* vs create_* for similar creation operations. There are also noun-phrase outliers like clip_processing_status, safe_zones, and render_status. Readable and mostly predictable, but not consistent.

Tool Count1/5

98 tools is far beyond the 25+ threshold and even the 50+ extreme-mismatch calibration. No agent-facing server surface needs this many operations to remain coherent; even a full video editor would be better split into focused servers by concern.

Completeness4/5

The surface is remarkably comprehensive for a video-editing domain: project/pages/versions CRUD, layer add/edit/delete/group/order, keyframe and track-loop animation, audio/captions/transcription, uploads/fonts, collections, workspaces, embed allowlists, and render pipeline. Minor gaps exist (no remove_custom_font, no workspace deletion/membership, no server-side video upload), but agents can accomplish the core workflows without dead ends.

Available Tools

98 tools
add_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, create_upload_link, or the editor); 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
gainNoLinear gain 0..2. Default 1.
nameNoOptional label people see on the track: pass the upload's returned `name`.
endFrameNoOptional end frame; omit to play the asset's full natural length from startFrame.
filenameYesThe stored audio filename an upload returned.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
startFrameYesFrame at which the overlay starts (0-indexed, 30 fps).
fadeInFramesNoLinear fade-in length in frames. Default 0.
fadeOutFramesNoLinear fade-out length in frames. Default 0.
sourceLayerIdNoOptional 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the mutation intent is known. The description adds valuable behavioral context: the overlay plays in the editor preview and is mixed into the MP4 export, and frames are computed at 30 fps with round(s * 30). It does not contradict any annotation.

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

Conciseness5/5

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

Four tightly packed sentences cover formats, prerequisites, parameter mapping, frame conversion, and export/preview behavior without redundancy. The most important action and constraint are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the input schema covers all parameters at 100%, the description is nearly complete for a 9-parameter mutation. It explains asset prerequisites, timing model, and rendering impact, though it could have briefly noted that modifying an existing overlay belongs to update_audio_overlay.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful parameter nuance: filename comes from an upload response, name is used as the track label, and seconds should be converted with frames = round(s * 30). This goes beyond the schema's field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add an audio overlay') and immediately distinguishes the operation with supported formats and frame-aligned scheduling. This clearly differentiates it from siblings like update_audio_overlay and remove_audio_overlay.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear prerequisite context: the asset must already be uploaded via upload_audio, create_upload_link, or the editor. It tells the agent to pass the upload's returned filename and name as the track label, but it does not explicitly contrast this with update/remove alternatives.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoCaption band centre x. Default canvas centre.
yNoCaption band centre y. Default lower third (~80% of height).
modeNo"line-sync" (default): one timed layer per line. "static": one layer with all lines.
linesYesCaption lines in order. Each: { text, startFrame, endFrame } — frames are 0-indexed at 30fps.
styleNoCaption look preset. Default "classic".
widthNoBand width. Default ~86% of canvas width.
heightNoBand height. Default ~16% of canvas height.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
clip_element_idNoOptional "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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-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.

Usage Guidelines4/5

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 keyframeA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameYesFrame number, 0-indexed. 30 fps so frame 30 = 1 second.
valueYesEither '#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.
easingNoInterpolation to the next keyframe. Default linear.
propertyYesCurrently only 'fill' is supported.
elementIdYesElement id (shapes/image/video/group prefixed). The pinned is_background image_layer is the canvas backdrop; 'background.canvas' is also accepted as a synonym.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
x1YesStart x (canvas px).
x2YesEnd x (canvas px) — the arrowhead end.
y1YesStart y (canvas px).
y2YesEnd y (canvas px).
bendNoPerpendicular bow of the curve in px. 0 = straight.
colorNoStroke colour as #rrggbb.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
arrow_headNo
stroke_widthNoLine thickness in px.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
originYesHostname or URL to allow, e.g. "example.com" or "https://example.com". Normalized to a bare lowercased hostname.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementIdYesThe item's element id (from list_collection) — any leaf or group.<id>.
projectIdYesDestination project the item is copied INTO.
sourceProjectIdYesThe item's home project id (from list_collection).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 asset must already be uploaded (the editor's drag-drop, upload_image, create_upload_link, or POST /api/upload-asset/ with the raw bytes and an X-Upload-Name header). Every upload returns { filename, name }: pass filename (the stored file's id) here, and name as the layer's label. To duplicate an existing layer, reuse its filename — the editor auto-assigns a fresh id.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesCentre x in 1080-wide base coords.
yYesCentre y in 1920-tall base coords.
nameNoOptional 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.
blockNoOPTIONAL 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`.
widthYesWidth in px (must be > 0).
heightYesHeight in px (must be > 0).
filenameYesThe stored filename an upload returned (an id such as 3f2a9c1e-….png, or an older project's own name).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A5/5.0
Behavior5/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, so the description adds value by detailing the mutation: it adds a layer. It explains the behavioral difference between omitting the block parameter (persistent overlay) and passing it (bounded clip), and notes keyframe sampling relative to start. 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.

Conciseness5/5

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

The description is detailed but every sentence adds value. It front-loads the core action, then provides necessary upload context and behavioral options. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, nested block object, upload prerequisite), the description covers all essential context: how to obtain the asset, how to map upload returns to parameters, and the behavioral choice of persistent vs. bounded layer. An output schema exists, so return values need not be in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description goes beyond schema by linking `filename` to the upload's returned id and `name` to the label, and explaining the block parameter's default behavior and its impact on keyframes. This adds meaningful context not present in the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Add') and resource ('image layer'), clearly distinguishing it from sibling tools like add_video_layer and add_text_layer. It also explains the required precondition (uploaded asset), which sharpens the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use this tool: after an asset is uploaded, and lists the available upload methods (drag-drop, upload_image, create_upload_link, or API endpoint). It also explains how to duplicate an existing layer by reusing its filename, giving concrete usage scenarios. No confusion with other add tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_keyframeAdd keyframeA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameYesFrame number, 0-indexed. 30 fps so frame 30 = 1 second.
valueYesTrack value at this frame.
easingNoInterpolation to the next keyframe. Default linear.
propertyYes
elementIdYesLayer id (video.<id>, image.<id>, shapes.<id>, or group.<id>).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A3.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 keyframesA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopNoOptional extrapolation mode applied to this track in the same call. Default 'hold'.
propertyYes
elementIdYesLayer id (video.<id>, image.<id>, shapes.<id>, text.<id>, or group.<id>).
keyframesYesKeyframes for this track (one or more).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-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.

Usage Guidelines5/5

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_morpha_layerAdd morpha layerAInspect

Embed another of the user's projects ("a morpha") inside this one as a version-pinned band. The source's layers are inlined into the host as a collapsible group, re-keyed to fresh ids, pinned to one immutable version of the source. Pass the source project's id as source_morpha_id (and optionally a version label); the server resolves and inlines the pinned version. Editing the band's inner layers only affects THIS video — the change is local and never propagates back to the source. To pin the band to a different saved version, re-pin it from the editor's Inspector. describe_video marks an embedded band with morpha:true + source_morpha_id so you can tell it apart from a plain group.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoOptional version label of the source to pin (e.g. "v3"). Omit to pin the source's latest saved version.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
source_morpha_idYesThe id of the project to embed. Must not be this project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=false and destructiveHint=false, so the description aligns with a mutating but non-destructive operation. It adds valuable behavior: re-keying to fresh ids, pinning to an immutable version, and crucially that edits are local and never propagate to the source. This exceeds what annotations provide.

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

Conciseness4/5

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

The description is a single paragraph of four sentences, front-loaded with the core purpose. It is concise enough and each sentence adds value (purpose, mechanics, local editing, identification). No waste, though it could be slightly tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main behavior, the mutation effect, version pinning, and how to identify the result. It does not mention error conditions or prerequisites, but the presence of an output schema reduces the need to explain return values. Given the tool's complexity, this is quite complete, though it could add a note about when not to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are fully described in the schema. The description restates the id passing and version optionality without adding new syntax or format details. It does reinforce the constraint 'must not be this project' but that is already in the schema, so the description adds minimal extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (embed) with a clear resource (another project, 'a morpha') and a specific outcome (version-pinned band). It also distinguishes the result from a plain group via describe_video markers, so it stands apart from sibling tools like add_embed_origin.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context on when to use the tool (embedding a version-pinned project) and explains local editing behavior. It does not explicitly name alternatives or exclusions, but the mention of re-pinning via the Inspector and describe_video for identification gives useful operational guidance. A small gap is not saying 'use this instead of add_embed_origin'.

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. For several versions of one video (hooks, languages, a sheet's rows), make pages of one project with add_page and duplicate_index. Exporting gives one video per page, and pages have no limit. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional name for the new page.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
duplicate_indexNoOptional. 0-based index of an existing page to deep-copy instead of appending a blank one.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so the description is not required to state mutation. It adds useful behavioral details: no limit on page count, the new page becomes active, its index is returned, and deep-copy mints a fresh id. These go beyond the annotations and help the agent predict 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.

Conciseness4/5

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

The description is somewhat long but well-structured: it starts with the core action, then explains conditional behavior, limitations, return value, and a concrete use case with follow-up steps. Each sentence provides necessary information; the front-loading of the primary purpose makes it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description does not need to detail return values, though it mentions the index. It covers the two operational modes, the absence of page limits, and provides guidance on how to use the created pages. It could have mentioned prerequisites like project existence, but the phrase 'works on any project' covers that implicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds value by explaining the conditional behavior of duplicate_index (deep-copy with new id) and that without it a blank page is appended. It also mentions the return value (index), which is not in the schema, though the output schema exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource ('Append a page to the project') and distinguishes the two modes (blank append vs. deep-copy via duplicate_index). It also clarifies the effect on the project ('turning a single-page video into a multi-page one'), which differentiates it from sibling tools like delete_page or select_page.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides a use case ('For several versions of one video... make pages of one project with add_page and duplicate_index') and gives follow-up guidance for editing and exporting the copies. It implies when to use this tool and what to do afterward, though it does not name alternative tools for page addition (since none exist).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_shapeAdd shapeCInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
kindYes
blockNoOPTIONAL 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`.
colorNoFill colour as #rrggbb.
widthNo
heightNo
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already indicate non-read-only and non-destructive, and the description adds default positioning behavior plus the native-shape caveat. It does not disclose mutation consequences, reversibility, or return format, but the annotations carry the safety profile, so a mid score 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.

Conciseness2/5

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

The description is bloated by a full enum list that duplicates the input schema, consuming most of the text. The genuinely useful guidance—native vector shapes, don't substitute an image, default centering—is buried at the end, so it is not lean or front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with a nested block object and no visible output schema, the description omits coordinate units, width/height semantics, and return value behavior. It is not complete enough for an agent to call it correctly without opening the schema and guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 38%; the description compensates by mentioning x/y/w/h default behavior, but it does not explain coordinate units, origin, or width/height semantics. It also repeats the entire kind enum already present in the schema, adding no new meaning for those parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Add a shape layer" is a specific verb+resource and the note that these are native vector shapes (never substitute an image layer) differentiates it from add_image_layer. However, it doesn't explicitly name the sibling tools like add_text_layer or add_video_layer, so it's clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for vector primitives and warns against using an image layer instead, which is a when-to-use signal. It also states default centering when x/y/w/h are omitted. But it never names alternative tools or gives explicit when-not-to-use conditions, so guidance is partial.

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 keyframeA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rateYesPlayback rate at this frame (1 = real-time, in [0.1, 8]).
frameYesProject-timeline frame number.
elementIdYesvideo.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.).

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoCentre x in canvas px. Defaults to canvas centre.
yNoCentre y in canvas px. Defaults to canvas centre.
textNoThe text to render. Newlines are honoured as hard line breaks.
blockNoOPTIONAL 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`.
curveNoCurve 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).
widthNoBox width in px (> 0). Default 900.
heightNoBox height in px (> 0). Default 320.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
text_sizeNoFont size in px. Omit to derive from existing text layers (median) or the canvas height.
font_styleNoItalic toggle. Default normal.
text_alignNoHorizontal alignment of each line. Default center.
text_colorNoText fill colour as #rrggbb. Defaults to white.
decorationsNoPer-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_familyNoGoogle Fonts family name, e.g. "Anton". Defaults to "Hanken Grotesk".
font_weightNoFont weight 100..900 (400 regular, 700 bold, 800 black). Default 400.
line_heightNoLine height as a multiple of font size (1.2 = 120%).
text_shadowNoDrop shadow { offsetX, offsetY, blur, color }; color is any CSS colour (rgba allowed). null clears it.
text_valignNoVertical 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_colorNoOutline colour as #rrggbb. Defaults to white when a width is set.
stroke_widthNoOutline width in px (0 = no outline).
text_autofitNoHow 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_spacingNoTracking between glyphs in px; may be negative. Default 0.
text_transformNoCase transform applied before layout. Default none.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior5/5

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

With only readOnlyHint=false and destructiveHint=false in annotations, the description carries the full burden and delivers extensively. It discloses creation semantics, default values, the autofit modes' precise behavior (including the guarantee that 'hug' prevents re-wrapping between preview and export), curve direction conventions, and the return value. It even explains the legacy 'shrink' mode. Nothing is left opaque.

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

Conciseness4/5

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

The description is long but every sentence earns its place given the 23 parameters and complex behaviors. It front-loads the core purpose and then covers defaults, styling, autofit modes, and return value in a logical order. It is dense but not redundant; minor verbosity in the autofit explanation is justified by its importance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 23 parameters, nested objects, an output schema, and rich sibling interactions, the description is comprehensive. It covers defaults, behavioral nuances, return value, and critical caveats (e.g., curve only works on single lines). An agent can confidently invoke this tool without needing to consult other documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter already has an explanation in the schema. The description adds some nuance (e.g., explaining the rationale for hug mode and pairing with set_text_background), but it largely repeats the schema's parameter details. It does not significantly compensate beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair ('Create a new text layer') and immediately qualifies it as a 'first-class leaf that animates, groups, and z-orders exactly like an image or shape,' which clearly separates it from siblings like add_caption_track or set_layer_text. It also enumerates the full styling surface, so an agent knows exactly what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool does and hints at usage contexts (e.g., 'what an agent-placed watermark / lower-third almost always wants' in the block parameter), but it never explicitly contrasts it with alternatives or says when not to use it. There is no 'use add_caption_track instead' type guidance, so the when-vs-other-tools decision 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_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementIdYesThe element id to add — any leaf (text/image/video/shapes.<id>) or a group.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 (the morphareels-sdk's client.addVideo, or the 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesCentre x in 1080-wide base coords.
yYesCentre y in 1920-tall base coords.
clipYesThe stored clip filename an upload returned (an id such as 3f2a9c1e-….mp4, or an older project's own name).
nameNoOptional label people see in the Inspector and Timeline: pass the upload's returned `name`.
widthYesWidth in px (must be > 0).
heightYesHeight in px (must be > 0).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false (mutating) and destructiveHint=false. The description adds meaningful context beyond this: the upload prerequisite, the filename/name mapping, and that duplication auto-assigns a fresh id. This extra detail about side effects (fresh id) is valuable, so a 4 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.

Conciseness5/5

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

Three sentences, front-loaded with the core purpose, followed by prerequisite, parameter mapping, and a special case. No redundancy or wasted words – every sentence contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the only non-obvious aspects (upload mapping, duplication) while the schema handles x/y/width/height/projectId. An output schema exists, so return format needs no explanation. Nothing missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by linking clip to the upload's filename and name to the upload's label, and explains the duplication reuse case. This goes beyond the schema descriptions, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Add a video layer' – a specific verb and resource that clearly distinguishes it from sibling add_* tools (add_image_layer, add_text_layer, etc.). It further clarifies scope by explaining the upload prerequisite and how to map upload results to parameters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: the clip must be uploaded first, and it explains the duplication workflow (reuse clip filename). It does not explicitly contrast with alternative add_* tools, but the purpose is unambiguous enough that an agent can infer when to use it. Lacks explicit 'when not to use' guidance, so a 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_presetApply presetC
Destructive
Inspect

Apply a canned animation preset to a layer.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetYes
elementIdYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
startFrameNoFrame to anchor on. Default 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 staggerA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetYes
staggerNoFrames between successive elements. Default 1.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
elementIdsYesLayers to animate, ordered as the cascade should fire (first id gets startFrame; each next gets +stagger frames).
startFrameNoBase frame for the first element. Default 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-only
Inspect

Report whether a clip — or every video clip in the project, if clip is omitted — has been through the browser-side video-processing pipeline: proxy build, audio split, transcription, OCR (text regions). Processing never runs on the server. The preview proxy is mandatory: every processing run builds it (client.addVideo / client.processClip / client.processProject in the morphareels-sdk npm client, which drive local Chrome), and the Morpha editor builds any missing proxy for every page's clip when the project is opened. The other steps run through the same npm client or in the editor. Returns { ok: true, data: { clips: [{ clip, processed, steps: { 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) or the SDK's audio_split step runs; 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipNoOptional clip filename (video.<id>.clip). Omit to report every video clip in the project.
projectIdYesProject the clip(s) belong to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool read-only and non-destructive, and the description adds substantial context: client-side execution, mandatory preview proxy, editor behavior, state semantics including 'cancelled' persistence, and audio_split not gating `processed`. There is 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.

Conciseness5/5

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

The description is long but front-loaded with the core purpose and scope. Every subsequent sentence earns its place by explaining states, client/editor execution, audio_split caveats, and the tool's use case. There is no filler or redundant repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex enough to need the detailed state model, and the description covers it fully: output shape, allowed step values, cancellation behavior, audio_split semantics, and the relationship to transcribe_clip/detect_text_regions. The output schema exists and is complemented, not replaced, by the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 `projectId` and `clip`. The description reinforces the omission behavior of `clip` and adds pipeline context, but it does not add new parameter syntax or format details beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Report whether a clip — or every video clip in the project, if `clip` is omitted — has been through the browser-side video-processing pipeline.' It enumerates the pipeline steps and explicitly names sibling tools (transcribe_clip, detect_text_regions), making its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Use it to know whether transcribe_clip / detect_text_regions will return data, and to surface an unprocessed state to the user.' It also clarifies processing never runs on the server and explains audio_split behavior, preventing incorrect assumptions about when to call this tool.

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 — you never choose or name it; refer to the project by its name. By default this mints a fresh BLANK project (empty canvas, no layers) — creation is independent from cloning. Pass fromProjectId ONLY when you want to clone: the new project then copies that project's JSON, uploaded assets, and uploaded clips, and — like duplicate_project — FOLLOWS THE SOURCE'S workspace by default (cloning a team project stays in that team; a blank project is personal). Pass workspaceId (from list_workspaces) to place it in a specific workspace instead — requires an edit-capable role there — or null to force it into the caller's personal space. If the clone source lives in a workspace you can only view, the call FAILS rather than silently making a personal copy — pass workspaceId:null for a personal copy. The user's editor session won't auto-refresh — they'll need to reload to see the new project in the picker.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoRecommended 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.
workspaceIdNoWhere 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.
fromProjectIdNoOptional id of an existing project to CLONE (copies its JSON + uploaded assets + clips). Omit to create a fresh blank project.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe project that was created, blank or cloned.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.4/5.0
Behavior4/5

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

The annotations only indicate that the tool is not read-only, not open-world, and not destructive, which is minimal. The description goes beyond this by detailing the cloning behavior (copies JSON, assets, clips), workspace inheritance and fallback rules, failure conditions (view-only source), and the lack of auto-refresh in the editor. This is substantial behavioral context beyond the annotations, though it does not specify error codes or side effects on the source project (which is 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.

Conciseness4/5

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

The description is detailed but remains focused and front-loaded: it leads with the core purpose and returns value, then explains cloning and workspace placement. It is longer than a typical definition due to necessary complexity, but every sentence serves a purpose (e.g., the warning about view-only source). Minor redundancy exists with the schema descriptions but is acceptable for the added decisional guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity—three parameters with conditional behavior, workspace inheritance, failure modes, and editor refresh behavior—the description covers all necessary decision points. The output schema exists, so the return value is structurally documented. The description is complete enough for an agent to invoke the tool correctly across all scenarios (blank, clone, workspace assignment, personal copy).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 nuance by clarifying the interaction between workspaceId and fromProjectId, and the fallback behavior, which is valuable. However, since the schema already provides detailed descriptions for each parameter, the added semantic value is incremental, justifying a baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('create a new project'), identifies the resource, and explains that it returns a server-minted UUID. It clearly differentiates between creating a blank project and cloning, and names the sibling tool duplicate_project to disambiguate. This is explicit and distinguishes it from other project-related tools like duplicate_project and open_project.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs when to pass fromProjectId (to clone) versus omitting it (blank project), how to use workspaceId to control placement, and warns that cloning a source in a view-only workspace will fail unless workspaceId:null is passed. It contrasts with duplicate_project and provides clear decision logic, leaving no ambiguity for the agent.

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. Refer to it by name when talking to the user, never the id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable workspace name, shown verbatim in the workspace switcher.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that the caller becomes owner, that email-based accounts are required (keyless identities fail), and that duplicate names cause a conflict error. These are critical behavioral traits an agent must know, and they don't contradict the readOnlyHint/destructiveHint flags.

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

Conciseness5/5

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

Four sentences, each carrying a distinct piece of information: purpose and return shape, usage context, ownership and prerequisites, conflict behavior, and a naming tip. No filler or repetition; information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation tool, the description covers the return shape, caller permissions, failure mode, and post-creation workflow. Combined with the output schema and annotations, an agent has everything needed to decide, invoke, and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already fully documents 'name' (100% coverage), so baseline is 3. The description adds practical context — 'Refer to it by `name` when talking to the user, never the id' — and implies the name is the key for the duplicate conflict. This extra guidance justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Create a new workspace (a shared team space) owned by the caller' — a specific verb and resource with a clear definition. It then contrasts with create_project and move_project_to_workspace, making the tool's role unmistakable among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('when the user wants a new place to group projects') and names the follow-up tools (move_project_to_workspace, create_project) that work with the new workspace. No ambiguity about when this tool is the right choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cut_rangeCut rangeA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endFrameYesEnd frame of the window to remove (0-indexed, EXCLUSIVE). Must be > startFrame; clamped to the composition length.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
startFrameYesFirst frame of the window to remove (0-indexed, inclusive).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 pageA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
indexYes0-based index of the page to remove.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 projectA
Destructive
Inspect

Permanently delete a project: its JSON, shortlist, versions, uploaded assets, and uploaded clips. Requires edit access — the owner, a workspace editor/admin/owner, or a direct-share editor; anyone else gets the opaque not-found. Deleting the last remaining project is allowed. The user's editor session won't auto-refresh — if they were viewing the deleted project they'll need to reload.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true, but the description goes further by specifying exactly what gets destroyed, the permission model, the fact that deletion is permanent, and the lack of session auto-refresh. This is substantial added context beyond the annotation flags.

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

Conciseness4/5

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

The description is three sentences, each carrying distinct information: the scope of deletion, permission requirements, and an edge case plus session behavior. It is front-loaded with the main effect, and no sentence is wasted, though it is slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive action, the description covers all necessary context: what is destroyed, who can perform it, whether deletion is permanent, the edge case of the last project, and user session behavior. An output schema exists to explain return values, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents the only parameter (projectId) with a description. The tool description adds no extra parameter-specific information, but the schema coverage is 100%, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the exact action (permanently delete) and the resource (project), and enumerates the sub-resources destroyed (JSON, shortlist, versions, uploaded assets, clips). This distinguishes it from sibling tools like delete_page or delete_version, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the prerequisite of edit access and lists who qualifies (owner, workspace editor/admin/owner, or direct-share editor), plus the opaque not-found for others. It also notes the edge case that deleting the last remaining project is allowed, providing clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_versionDelete versionA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject whose version to delete.
versionIdYesVersion to delete. UUID `id` or `v<N>` shorthand.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 videoA
Read-only
Inspect

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), 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.6/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds significant behavioral context: it explains the platform_safe_area concept, the z-ordered tree, the pages block, and explicitly states that keyframe values and styles are unbounded and not included. It also notes that on multi-page projects, content tools target the active page. This adds value beyond the annotations and helps the agent understand the tool's exact scope and limitations.

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

Conciseness4/5

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

The description is detailed but well-structured. It front-loads the core purpose ('Structural OVERVIEW') and then provides a logical breakdown of what it includes, what it excludes, and how it relates to other tools. While it is longer than the average description, every sentence contributes value—the platform_safe_area explanation, the z-order tree, the pages block, and the guidance to use inspect_layers. No fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the presence of an output schema, the description is comprehensive. It covers what the tool returns (structural overview with specific fields), what it does not return (keyframes and styles), and how to interact with multi-page projects. It also provides a clear workflow ('Start here, then call inspect_layers'). The agent has all the information needed to decide when and how to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one parameter, projectId, with a 100% description coverage. The schema already describes it as 'Opaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.' The description does not add additional semantics for this parameter, which is fine given the high schema coverage. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Structural OVERVIEW of the composition (the table of contents)' and enumerates what it includes (canvas size, duration, platform_safe_area, backdrop summary, z-ordered layer tree). It also explicitly differentiates from sibling tools by noting it does NOT include keyframe values or styles, and it points to inspect_layers for detailed layer info. This is a specific verb+resource with clear scope and differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: 'Start here, then call inspect_layers([elementId, …]) for full detail on the specific layers you'll change.' It also explains how to manage pages (select_page, add_page, delete_page, reorder_pages) and clarifies that content tools target the active page. This is a clear when-to-use vs alternatives with concrete next steps.

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 regionsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipNoVideo clip filename (the same value as `video.<id>.clip`). Pass this OR `image`.
imageNoImage layer filename (the same value as `image.<id>.filename`). Pass this OR `clip`.
projectIdYesProject the clip/image belongs to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dxNoPer-step x offset in px.
dyNoPer-step y offset in px.
countYesNumber of copies to create.
d_scaleNoPer-step size multiplier (1 = no change).
elementIdYesLeaf to clone (e.g. shapes.chevron-1).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
d_rotationNoPer-step rotation in degrees.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 — never shown to the user). Defaults the copy's name to " copy" unless you pass name. WORKSPACE: the copy FOLLOWS THE SOURCE by default — a project in a workspace is copied into that SAME workspace, and a personal project stays personal. Pass workspaceId to override: a workspace id (from list_workspaces) to place the copy in a specific workspace (you need an edit-capable role there), or null to force the copy into your personal space. If the source lives in a workspace you can only VIEW, the call FAILS rather than silently making a personal copy — get an editor role there, or pass workspaceId:null. (Duplicating a project shared with you from a workspace you're NOT a member of lands in personal, since you can't be placed in that workspace.) The returned workspaceId tells you where it went. The user's editor won't auto-refresh — they reload to see the copy in the picker. For several versions of one video (hooks, languages, a sheet's rows), make pages of one project with add_page and duplicate_index. Exporting gives one video per page, and pages have no limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional name for the copy. Shown verbatim in the picker; defaults to "<source name> copy".
projectIdYesId of the existing project to duplicate (the source).
workspaceIdNoOptional 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds substantial behavioral context beyond that: fresh opaque ids, the workspace-following default, failure rather than silent fallback for view-only sources, the non-member edge case landing in personal space, the no-auto-refresh UX behavior, and the returned workspaceId identifying placement. Nothing contradicts the annotations — destructiveHint=false is consistent with creating a brand-new copy rather than destroying the source.

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

Conciseness4/5

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

The description is front-loaded with its core purpose and organized with a WORKSPACE: label plus parenthetical edge cases, which aids scanning. However, it partially duplicates the schema — the name default ('Defaults the copy's name to "<source name> copy"') and the 'FOLLOW THE SOURCE' rule are already stated in the schema's workspaceId description. At roughly 250 words it is longer than strictly necessary, though most of the extra length carries genuinely new information like failure modes and refresh behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a high-complexity tool — workspace placement policy, role requirements, failure modes, non-member edge cases, and UX refresh semantics — and the description addresses all of them, plus return-value semantics ('The returned workspaceId tells you where it went'). An output schema exists, so the return structure is covered structurally. An agent has everything needed to invoke this tool correctly under every workspace scenario described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the baseline is 3 and the schema already documents all three parameters well. The description goes further on workspaceId by adding the failure condition ('If the source lives in a workspace you can only VIEW, the call FAILS') and the non-member edge case, which are not stated in the schema. projectId and name gain little beyond the schema, so the added value is moderate but real.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource with concrete scope — 'Duplicate an existing project into a brand-new one — a full copy of its layers, animations, styles, uploaded assets, and clips.' This distinguishes it from siblings like create_project (a new blank project) and duplicate_layer (a layer, not a project), and the 'full copy' phrase makes the semantics actionable. No ambiguity about what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-not-to-use guidance: 'For several versions of one video (hooks, languages, a sheet's rows), make pages of one project with add_page and duplicate_index.' It also provides conditional usage rules for workspaceId — when to override (edit-capable role), when the call fails (view-only source), and when to pass null — so the agent can decide correctly between this tool and workspace operations. This is explicit when/when-not guidance, not merely implied context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fade_layerFade layerA
Destructive
Inspect

Fade a layer's opacity between two frames in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
toFrameYes
elementIdYes
fromFrameYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
toOpacityYes0..1.
fromOpacityYes0..1.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 contentA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 frameA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameYesProject-timeline frame to freeze at — must be strictly inside the clip.
imageYesFilename of an already-uploaded PNG of the frozen frame, in the project's assets.
elementIdYesvideo.<id> to freeze.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
holdFramesNoHow long the still holds, in frames. Defaults to 150 (5s at 30fps), the same default every added clip gets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 layersA
Destructive
Inspect

Wrap sibling elements in a new group. USE THIS whenever several layers are one thing — a butterfly assembled from wings + body + antennae, an icon built from primitives, a card + its title + badge, a lower-third — and name the group what the thing is; a multi-shape object left as loose siblings is a defect the user has to clean up, and the group's name is their only handle on it. The group composes its x/y/scale/rotation/opacity onto its descendants (so one track flies/spins/fades the whole thing) and pivots rotate/scale at its (pivotX, pivotY), seeded to the centroid of its children at create time. The group's x/y track values are translation offsets applied around the pivot — groups have no static body of their own. All listed elementIds must currently share the same parent (root, or one existing group).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional human-readable label.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
elementIdsYesElement ids of the elements to wrap. Must all share the same parent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.6/5.0
Behavior4/5

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 group composes transforms onto descendants, pivot is seeded to centroid, x/y are translation offsets around the pivot, and groups have no static body. This goes beyond the annotations and helps the agent predict 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.

Conciseness4/5

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

The description is dense but purposeful, with the core instruction front-loaded and the behavioral details following. It is longer than average, but every sentence earns its place by explaining either when to use the tool or what the group does. The only minor inefficiency is the parenthetical list of examples, which is illustrative rather than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (transform composition, pivot behavior, parent constraints) and the presence of an output schema, the description covers all the essential behavioral and usage information an agent needs. It explains the group's transform model, the pivot seeding, the parent precondition, and the naming rationale. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters. The description adds meaning by explaining the group's transform model (x/y offsets around pivot, pivot seeded to centroid), which clarifies the effect of the 'name' and 'elementIds' parameters beyond their raw schema descriptions. It doesn't add syntax details, but the schema already covers those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Wrap sibling elements in a new group') and immediately distinguishes the tool from siblings like ungroup_layers, rename_group, set_group_parent, and set_group_box. It also gives concrete examples of what constitutes a groupable thing, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'USE THIS whenever several layers are one thing' and explains why loose siblings are a defect, giving the agent a clear decision rule. It also states a precondition ('All listed elementIds must currently share the same parent'), which is essential for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_layersInspect layersA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
elementIdsYesElement ids to inspect (image.<id>, video.<id>, text.<id>, shapes.<id>, group.<id>). Read them from describe_video's tree.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 collectionA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines4/5

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 fontsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoCase-insensitive substring filter on family name. Omit to list everything.
limitNoMax entries to return (default 50, max 1000).
sourceNoRestrict to one source. Omit to span every source. "custom" returns only the project's uploaded faces.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 projectsA
Read-only
Inspect

List projects as { id, name, editorUrl } entries. The id is what every other tool's projectId argument takes. name is the human-readable label shown in the editor's project picker ("Untitled" when no name has been set — ids are opaque and never shown to the user, so always refer to a project by its name). editorUrl is a tappable link that opens that project in the editor — offer it to the user (by name) when they want to look at one. By default lists the user's OWN personal projects (those not in any workspace). Pass workspaceId (from list_workspaces) to instead list the projects that live in that workspace — including teammates' — each with the owner's ownerEmail. Call this when the user asks "what projects do I have?" or hasn't named a project but you need to operate on one.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdNoOptional 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe caller's projects.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description does not contradict this. It adds valuable context: the default scope (personal projects), the meaning of id vs. name (ids opaque, names human-readable), and the editorUrl usage. It also explains the membership requirement for workspace listing, going 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.

Conciseness4/5

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

The description is comprehensive but not bloated. It is logically structured: output fields first, then default behavior, then workspace parameter, then usage cues. Every sentence adds information without redundancy, though it is a bit longer than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with an output schema, the description covers everything needed to call it correctly: the output format, the default behavior, the optional parameter, and when to invoke it. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (workspaceId has a description), so the baseline is 3. The description adds value by explaining where to get the value (from list_workspaces), what it does (lists workspace projects including teammates'), and that it returns ownerEmail. This goes beyond the schema's brief description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), resource ('projects'), and the exact output shape ('{ id, name, editorUrl }'), which distinguishes it from siblings like list_workspaces and list_versions. It also explains the semantics of each field, making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly gives the trigger conditions ('Call this when the user asks "what projects do I have?" or hasn't named a project but you need to operate on one') and explains the alternative behavior when workspaceId is provided, pointing to list_workspaces as the source. This is clear guidance on when and how to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_versionsList versionsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject whose versions to list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 workspacesA
Read-only
Inspect

List the workspaces (shared team spaces) the account belongs to, as { id, name, role, memberCount } entries. role is the caller's role in that workspace (owner / admin / editor / viewer) — only owner/admin/editor can add projects. Use the id as the workspaceId argument to create_project, move_project_to_workspace, and list_projects; refer to the workspace by its name when talking to the user (never paste the id). Returns an empty list when the account has no email (workspace membership is email-based, so a keyless/dev identity sees none). Call this to discover a workspace before placing a project into it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context: role semantics and permissions, the empty-list behavior for keyless/dev identities, and the instruction to use id internally while using name for user-facing communication. These go well beyond the 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.

Conciseness5/5

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

Every sentence earns its place: output shape, role meaning, downstream usage, edge-case behavior, and a clear call-to-action. The information is front-loaded and compact without being padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only lookup tool with an output schema and clear annotations, the description is fully complete. It covers what is returned, what the values mean, when to call it, and how to use the results with related tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema has no properties, so there is nothing for the description to clarify. A baseline of 4 is appropriate here because there are no parameter gaps to compensate for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and a well-defined resource ('workspaces (shared team spaces) the account belongs to'), and immediately distinguishes it from sibling tools like create_workspace and list_projects. The output shape is given up front, leaving no ambiguity about what the tool returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent when to call this tool ('Call this to discover a workspace before placing a project into it'), how to use its result ('Use the id as the workspaceId argument to create_project, move_project_to_workspace, and list_projects'), and what to display to the user (name, never id). The no-email edge case also removes a likely failure mode.

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 linesA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
elementIdsYesTwo or more caption lines, each "text.<id>".

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_bandMove bandA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
startYesHost-timeline frame where the band begins (0-indexed, 30 fps).
bandIdYesThe embedded band's group id (group.<id> or the bare <id>).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds rich behavioral context beyond the annotations: the band's inner reel plays relative to the time origin, intro animations fire when the band appears, the current window length is preserved, and a band with no window spans from start to composition end. This goes well beyond the readOnlyHint/destructiveHint flags and gives the agent a clear mental model of the mutation's effects.

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

Conciseness5/5

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

The description is front-loaded with the action, then adds only high-value behavior details and parameter provenance. Every sentence earns its place, and there is no repetition of the input schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter, 100%-schema-covered tool with an output schema and destructive annotations, the description is complete. It explains purpose, behavioral effects, defaults, and how to obtain the band id, leaving no critical gap for an agent deciding to call this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds extra value by explaining that bandId must come from describe_video and identify a group with morpha:true, and by linking start to the animation behavior. This is meaningful but not extensive, so a 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Place an embedded morpha band on the host timeline' and clearly defines the operation as setting its TIME ORIGIN. It also explains the effect this has on the band's intro animations, which distinguishes it from generic move or placement tools like move_layer or shift_group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use it: it is 'the fix for the embedded intro doesn't animate' case, and it tells the agent to pass a band group id from describe_video with morpha:true. It does not explicitly name excluded alternatives or say when not to use it, so it falls slightly 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.

move_layerMove layerA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoCentre 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.
yNoCentre y in the element's OWN frame — canvas coords (1920 tall) at root, the group's space inside a group. See `x`.
scaleNoUniform scale multiplier about the layer's pivot. 1 = natural size. Every layer kind carries it.
widthNoWidth in px (must be > 0).
heightNoHeight in px (must be > 0).
opacityNoLayer opacity, 0..1 (values outside are allowed and clamp at paint time). Composes with any ancestor group's opacity.
rotationNoRotation in degrees, clockwise.
elementIdYesvideo.<id>, image.<id>, shapes.<id>, or group.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
clear_animationNoOnly 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 workspaceA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesId of the project to move.
workspaceIdYesTarget workspace id (from list_workspaces), or null to move the project back to the caller's personal space.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 projectA
Read-only
Inspect

Get a tappable link that opens a project directly in the editor (the editor loads exactly this project from the URL). Returns { name, editorUrl }. Use this whenever the user wants to view their work — after you make a change, or when they say "show me" / "open it" — then give them the editorUrl and invite them to tap it. Refer to the project by its name in your reply; the link is the tap target.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesId of the project to open.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe project, as a person would refer to it.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: the editor loads exactly this project from the URL, the tool returns { name, editorUrl }, and the link is intended as a tap target for the user.

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

Conciseness4/5

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

The description is a few sentences long with no filler, and it front-loads the core behavior before usage guidance. It could be trimmed slightly, but each sentence contributes either behavioral clarity, return-value information, or usage direction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one documented parameter, an existing output schema, and annotations covering non-destructiveness, the description fully covers what an agent needs: what the tool does, what it returns, and how to present the result to the user. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the only parameter, projectId, is already documented as 'Id of the project to open.' The description adds no additional parameter semantics, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it gets a tappable link that opens a project directly in the editor. It also names the exact output shape ({ name, editorUrl }), which makes the tool's function unmistakable and distinguishes it from project-creation or listing siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear, concrete when-to-use guidance: after making a change or when the user says 'show me' / 'open it'. It does not explicitly name alternatives or exclusions, but for this tool the natural alternatives (list_projects, render_video) are clearly not relevant, so 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.

reid_projectRe-id projectA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
newIdNoOptional new id — must be a v4 UUID. Omit to mint a fresh UUID automatically.
projectIdYesCurrent id of the project to re-key.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines4/5

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 overlayA
Destructive
Inspect

Delete an audio overlay by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesOverlay id (e.g. audio_1).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 keyframeA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameYes
propertyYes
elementIdYesElement id. The canvas backdrop is the pinned is_background image_layer; 'background.canvas' is accepted as a synonym.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 originA
Destructive
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
originYesHostname or URL to remove. Normalized the same way as add_embed_origin before matching.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 collectionA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementIdYesThe element id to remove from the Collection.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 keyframeA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameYes
propertyYes
elementIdYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 layerA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementIdYesvideo.<id>, image.<id>, text.<id>, or shapes.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines5/5

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 keyframeA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
frameYesProject-timeline frame number.
elementIdYesvideo.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 groupA
Destructive
Inspect

Rename a group. Pure cosmetic — labels appear in the Inspector and describe_video output.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
groupIdYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already signal mutation via destructiveHint=true and readOnlyHint=false, so the description does not need to restate those. It adds valuable context beyond annotations by specifying that the change is cosmetic: only labels in the Inspector and describe_video output are affected. This helps an agent predict the blast radius of the rename. The 'pure cosmetic' phrasing does not contradict destructiveHint, since renaming still mutates the project state.

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

Conciseness5/5

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

Two short sentences with no filler. The core action is stated first, then a compact clarification of side effects. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter rename operation with an output schema present, the description is nearly complete: it states the action, the affected surface, and the side-effect scope. The only meaningful gap is the lack of explicit parameter semantics for name and groupId, but the tool name and required-field naming make correct invocation highly predictable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (projectId is documented; name and groupId are not). The description does not compensate for this: it never explains that 'name' is the new display label or that 'groupId' identifies the target group. While the tool name makes some of this obvious, the description itself adds no parameter-level meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Rename') and resource ('a group'), immediately identifying the operation. 'Pure cosmetic' further clarifies the scope of the rename, distinguishing it from functional mutations. The resource word 'group' cleanly separates it from sibling rename_* tools like rename_layer, rename_project, and rename_version.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: whenever a group's display label needs changing. It does not explicitly contrast with rename_layer, rename_project, or rename_version, nor does it state when not to use this tool. The clarification that labels appear in the Inspector and describe_video output gives some practical context, but the exclusion/alternative guidance 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.

rename_layerRename layerA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew label. Empty string clears it (callers fall back to the filename stem).
elementIdYesvideo.<id>, image.<id>, shapes.<id>, or text.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds valuable context: the side effect on the auto-derived embed attribute and the clearing behavior with empty strings. This goes beyond what annotations provide, so a 4 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.

Conciseness5/5

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

Two sentences with no wasted words. The main purpose is front-loaded, and the group alternative is clearly stated. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple rename operation with three parameters, an output schema, and comprehensive annotations, the description covers purpose, usage, alternatives, and side effects. Nothing essential 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds extra meaning beyond the schema by explaining the embed attribute relationship and the clearing behavior, which enriches understanding of the 'name' parameter. This justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (set the human-readable name) and the resource (video/image/shape/text layer), and explicitly distinguishes from sibling rename_group by directing groups to a different tool. This is a specific verb+resource with sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use this tool (to set layer names) and explicitly excludes groups by saying 'For groups use rename_group.' It also explains the effect on the embed attribute and the empty-string clearing behavior, giving clear context for 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.

rename_projectRename projectA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew human-readable label. Empty string clears the name and reverts to the id fallback.
projectIdYesProject to rename.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark this as destructive and non-read-only; the description adds meaningful behavior beyond that: passing an empty string clears the name and falls back to the id, and the operation is explicitly limited to the picker label. 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.

Conciseness5/5

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

Two short sentences deliver the core operation, the edge case, and the scope boundary without any filler. Important information is front-loaded and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation, the description plus annotations and complete schema coverage fully cover purpose, edge case, and side-effect boundary. An output schema exists, so return-value documentation is not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters already have descriptions. The empty-string clearing behavior is repeated in both the schema and the description, so the description adds no new parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Describes a specific verb ('Update') and resource ('project's human-readable name'), and clarifies where the name is shown ('the editor's project picker'). The final sentence distinguishes it from broader mutations by stating it doesn't touch layers, animations, or styles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly scopes when this tool applies: it only changes the picker label, not any other project content, which implicitly tells the agent to use other tools for layer/style changes. It does not explicitly name alternative sibling tools, but the boundaries are clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rename_versionRename versionA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew human-readable label. Must be a non-empty string.
projectIdYesProject whose version to rename.
versionIdYesVersion to rename. UUID `id` or `v<N>` shorthand.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark the tool as destructive (destructiveHint=true) and readOnlyHint=false. The description adds useful behavior beyond that: only the display name changes, the `v<N>` identifier is unaffected, and empty/whitespace-only names are rejected. These details help the agent predict side effects accurately.

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

Conciseness5/5

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

Three short sentences, each adding distinct value: what is renamed, what remains unchanged, and accepted inputs/validation. The most important distinction is front-loaded, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 3-parameter rename operation with a full schema and an output schema, the description covers semantics, validation, and side-effect boundaries. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents all parameters including the UUID/v<N> shorthand and non-empty requirement. The description adds small extra meaning ('what the user sees in the picker', whitespace rejection) but mostly restates what the schema provides. This matches the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Rename') and resource ('a saved version's human-readable label'), and immediately distinguishes it from the partner-facing `v<N>` identifier. This clearly differentiates it from sibling tools like delete_version, restore_version, and save_version, so an agent knows exactly what operation this performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it is for changing the display label seen in the picker, not the identifier. It does not explicitly name alternatives like restore_version or delete_version, but the purpose and scope are unambiguous enough that an agent can infer when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rename_workspaceRename workspaceA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew human-readable name.
workspaceIdYesId of the workspace to rename (from list_workspaces).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations by specifying the precise scope of the mutation: 'Touches only the label — membership, projects and roles are unchanged.' It also discloses the permission model and that editor/viewer roles are refused, which is meaningful behavioral context the annotations alone do not provide.

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

Conciseness5/5

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

The description is three sentences with no redundant wording. It is front-loaded with the core purpose, then states the permission prerequisite, ID source, and scope of change. Every sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter rename operation, the description is complete: it explains the operation, prerequisites, ID source, and exactly what the mutation does not affect. The presence of an output schema covers return-value expectations, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage for the two parameters is 100%, and the description adds extra meaning by explaining that the name parameter sets the label and that the workspace ID should come from list_workspaces. This reinforces the schema descriptions and clarifies that no other workspace properties are affected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Rename an existing workspace') and the resource it acts on. It distinguishes the tool from siblings like rename_project or rename_version by clarifying that only the workspace's label changes while 'membership, projects and roles are unchanged'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong context for when to use the tool: it requires owner/admin rolehare, informs that editor/viewer is refused, and tells the agent to source the workspace ID from list_workspaces. It doesn't explicitly name alternatives or when-not-to-use scenarios, but the role requirement and ID sourcing gives clear operational guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_statusRender statusA
Read-only
Inspect

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, chargedCents } } 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). chargedCents is what the render cost the subscription. A render that failed answers ok:false with a plain reason and is never charged. Only the account that started a render can read it.

ParametersJSON Schema
NameRequiredDescriptionDefault
renderIdYesThe renderId render_video returned.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark this read-only and non-destructive, and the description adds substantial behavioral context beyond them: the polling contract ('not-ready' vs 'ready'), the 7-day expiry and deletion behavior of downloadUrl, the billing semantics of chargedCents, the never-charged failure path, and the ownership restriction. This is exactly the kind of runtime behavior an agent needs to use the tool correctly.

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

Conciseness4/5

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

The description is dense (roughly 100 words) but every sentence carries information: purpose, polling behavior, both response shapes, downloadUrl semantics with recipient and expiry, cost disclosure, failure behavior, and access control. It front-loads the purpose and is ordered logically from call to final state. A couple of sentences are run-on but no filler exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter polling tool, the description covers everything an agent needs: what triggers a call, what to do on pending, what ready and failed responses look like, how to handle the download link, expiry timing, billing, and access control. The output schema also exists and the description already mirrors its key structure, so no return-value documentation gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with renderId documented as 'The renderId render_video returned.' The description reinforces that the value must come from render_video and adds the ownership constraint ('Only the account that started a render can read it'), which clarifies which renderId values are valid. This slightly exceeds the baseline for fully-covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Check a server render started by render_video, and get its download link.' It names the originating sibling tool, which immediately distinguishes it from the other status-style sibling (clip_processing_status) since this one is tied specifically to render_video's output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: it is for renders started by render_video, should be polled ('wait and call again' while not-ready), and is restricted to the account that started the render. It does not explicitly name alternatives or exclusions (e.g., clip_processing_status), but the render_video reference makes the intended use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_videoRender videoA
Destructive
Inspect

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. THIS COSTS THE ACCOUNT MONEY and needs a subscription: the render is charged to the subscription's credits at Morpha's measured compute cost, so a longer composition and a larger scale both cost more. Two free routes exist and are usually better — give the person the editorUrl every project result carries and they choose Share, then Download (Render MP4 on a phone) in the editor, free and with no watermark; or a script runs the morphareels-sdk npm client's client.renderVideo(projectId) on macOS or Windows. Renders at 2x the canvas by default, the same as the editor and the npm client; pass scale: 1 for the canvas's own size, which is faster and cheaper. The cost is reserved against the subscription's credits before the render starts, so a render is refused up front when the credit to pay for it is not there rather than discovered afterwards; you are then billed the real measured cost, never more than the amount reserved. Refused for a composition longer than 30 minutes, when the remaining credit 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

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOptional 0-based page index for a multi-page project. Omit for the project's active page; render one page per call.
scaleNoOptional 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.
projectIdYesProject to render.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the annotations by disclosing that the render costs subscription credits, is reserved up front, is refused under specific conditions, deletes the rendered file after 7 days, downloads fonts, and defaults to 2x scale. This is exactly the behavioral context an agent needs for a paid, 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.

Conciseness5/5

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

The description is long but front-loaded with the core action and return contract before diving into cost, alternatives, failure modes, and retention. Every sentence carries operational consequence for a high-stakes paid operation, so the length is justified and the structure is logical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity, the output schema, and the annotations, the description is complete: it explains return shape, next steps, cost, credit reservation, refusal conditions, deletion policy, font fetching, and free alternatives. An agent has everything needed to decide whether and how to call this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, page, and scale. The description adds valuable semantic context about scale — default 2x, scale 1 being faster/cheaper — and cost implications, which goes beyond the schema. It does not add much about page, but the schema already handles that well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Render the project to an MP4 on Morpha's servers.' It also differentiates itself from siblings by naming the follow-up render_status and contrasting the paid API with free download routes, so an agent can tell exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance: it is for an agent without a browser, and it names two free alternatives that are 'usually better.' It also prescribes the polling follow-up with render_status and lists refusal conditions, leaving little 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 layerA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
newIndexYes0-based index among siblings of the same parent.
elementIdYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines4/5

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 pagesA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_indexYes0-based destination index for the page.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
from_indexYes0-based index of the page to move.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines3/5

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_versionRestore versionA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject to restore into.
versionIdYesVersion to restore. UUID `id` or `v<N>` shorthand (partner-facing bookmark number).
page_indexNoOptional. 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines4/5

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 zonesA
Read-only
Inspect

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 } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipYesClip filename (video.<id>.clip).
projectIdYes
bandHeightNoVertical granularity in source pixels (default 32).
minConfidenceNoOCR confidence floor (0–100) for considering a text region (default 70).
occupancyThresholdNoFraction of frames that must contain text in a band to mark it occupied (default 0.10).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+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.

Usage Guidelines4/5

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 versionA
Destructive
Inspect

Save a version of the current project state. ALWAYS call this once after each meaningful set of changes you make on the user's behalf — the user flicks between versions to compare or roll back, so an unsaved edit is one they can't easily revisit. Use a short descriptive name (e.g. "add slide-in animation"); the user sees this verbatim in the picker. One version per logical change-set, not one per individual tool call.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoShort label describing what this set of changes accomplished. Defaults to a timestamp if omitted, but a description is much more useful to the user.
projectIdYesProject to save a version of (filename stem).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already signal destructiveHint=true and readOnlyHint=false. The description adds context by explaining why saving is critical (user rollback/comparison) and that the name appears verbatim in the user's picker. This goes beyond the structured fields 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.

Conciseness5/5

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

The description is three sentences, each serving a distinct purpose: state the action, give the mandatory usage rule with rationale, and specify naming guidance. It is front-loaded with the core purpose and every sentence earns its place. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 destructive intent, the description covers everything needed to call the tool correctly: when to call, how to name, and why it matters. No essential information is missing for an agent to use it appropriately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds practical guidance for the `name` parameter—suggesting short descriptive labels and an example—and clarifies the user-facing impact. This enriches the schema's description and helps the agent generate better parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Save a version of the current project state.' This clearly distinguishes it from sibling version tools like list_versions, delete_version, and restore_version. The purpose is unambiguous and immediately actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: 'ALWAYS call this once after each meaningful set of changes' and gives the reasoning. It also provides a clear exclusion: 'One version per logical change-set, not one per individual tool call.' This gives an agent concrete decision rules for when to invoke it versus other operations.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexYes0-based index of the page to make active.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 sizeA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYesCanvas width in px (positive integer).
heightYesCanvas height in px (positive integer).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 speedA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
speedYesConstant playback rate (1 = source speed, 0.5 = half, 2 = double), in [0.1, 8].
elementIdYesvideo.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 fontA
Destructive
Inspect

Register a typeface Morpha does NOT ship, so text layers can use it by family name via font_family (exactly like a built-in family). Families already in the built-in catalogs (anything list_fonts returns from google/bunny/fontshare/fontsource/velvetyne) are REJECTED — they need no registration; just set font_family to them directly. src is EITHER a full URL (https://…) OR a font file already uploaded to the project's asset bucket (create_upload_link, or POST /api/upload-asset/ with raw bytes + an X-Upload-Name header; .woff2/.woff/.ttf/.otf): 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

ParametersJSON Schema
NameRequiredDescriptionDefault
srcYesA full font URL (https://…/font.woff2) OR an uploaded asset filename in the project's bucket.
styleNoOptional face style. Defaults to normal.
familyYesFamily name text layers will reference via font_family, e.g. "Mylius Modern".
weightNoOptional specific weight (1-1000) this src provides. Omit for the 400/normal baseline.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes well beyond: it explains that it does NOT verify uploaded filenames, dedupes by family+weight+style, replaces matching faces, does not fetch URLs at call time (deferred to renderer/browser), and requires permissive CORS for URLs. This is rich behavioral disclosure that the annotations alone couldn't provide.

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

Conciseness4/5

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

The description is dense but well-organized, front-loading the core purpose and rejection rule, then flowing through src options, behavioral caveats, and usage steps. It's longer than a typical description but every sentence adds essential information; the reference link at the end is a bonus. It could be tightened slightly but the length is justified by the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a tool with this complexity. Covers what it registers, how to use it afterward, the src format variants, upload specifics, CORS caveat, dedupe behavior, and a documentation reference. The output schema exists (likely returns the registered family info) so return values need not be described. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so parameters are already documented. The description adds crucial semantics beyond the schema: for src it explains the two valid forms (full URL or uploaded asset filename) and the exact format of the upload endpoint; it clarifies weight/style defaults and the dedupe key. It doesn't repeat the schema but adds contextual meaning to each parameter's role in the registration process.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: registering a typeface not shipped by Morpha so text layers can reference it via font_family. It names the resource (custom font family), the action (register), and distinguishes it from the sibling list_fonts and the direct approach of using a built-in family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (fonts not in built-in catalogs) and when not to (built-in families are rejected and should just be set directly). It also provides the workflow: register then set font_family via add_text_layer/set_layer_text. Provides alternative upload path and why it's robust.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_durationSet durationA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
secondsYesComposition length in seconds (1-second floor, no ceiling). 30 fps; durationInFrames = ceil(seconds*30).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 originsA
Destructive
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
originsYesFull desired allowlist. Each entry may be a bare hostname or a URL; it is normalized to a bare lowercased hostname. Empty array disables embedding.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_group_boxSet group boxA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
box_widthYesBackdrop width in px (non-negative).
elementIdYesgroup.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
box_heightYesBackdrop height in px (non-negative).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines3/5

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 parentA
Destructive
Inspect

Move an element into a group (or out to root). Refuses to place a group inside its own descendants.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNo0-based insert position among the new parent's children. Defaults to end.
elementIdYesFull element id: video.<id>, image.<id>, shapes.<id>, or group.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
parentGroupIdYesBare group id of the new parent, or null to move to root.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 windowA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
startYesFirst frame the group is drawn on, in its parent timeline (0-indexed, 30 fps).
durationYesHow many frames the group stays drawn for (≥ 1). Grown automatically if it would hide the group's own keyframes.
elementIdYesThe group's id (group.<id> or the bare <id>).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 filenameA
Destructive
Inspect

Repoint an existing image layer at a different uploaded asset — keeps the layer's id, position, size, animations, and styles; only the bitmap changes. The asset must already exist at users//assets// (the editor's drag-drop, upload_image, create_upload_link, or POST /api/upload-asset/ with the raw bytes and an X-Upload-Name header); 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional 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.
filenameYesThe uploaded file's id: the `filename` its upload returned.
elementIdYesImage layer id, image.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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

The annotations provide destructiveHint=true but no details; the description adds valuable behavioral context by specifying that only the bitmap changes while id, position, size, animations, and styles are preserved. It also discloses the prerequisite that the asset must already exist in a specific location, which helps the agent understand the operation's constraints beyond the 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.

Conciseness5/5

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

The description is dense but efficient: three sentences cover the effect, the asset prerequisite, and when to choose this over alternatives. The main purpose is front-loaded, every clause adds information, and there is no filler or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 4 parameters, a 100%-covered schema, an output schema, and annotations, the description provides all necessary operational context: what is preserved, what changes, how the asset must have been uploaded, and the exact filename value to pass. Nothing an agent needs to safely invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds a little cross-tool context by telling the agent to pass the `filename` the upload returned and use its `name` as the label, but most of the parameter semantics are already present in the input schema. This matches the baseline for high schema coverage with minor added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Repoint an existing image layer at a different uploaded asset.' It immediately clarifies scope and names what is preserved and what changes, distinguishing it from alternatives like remove_layer + add_image_layer without requiring the agent to inspect sibling schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Use this to swap a layer's image WITHOUT losing its keyframes' and contrasts it with the alternative that would mint a new id and drop animations. It also gives concrete prerequisites (asset must exist at a specific path, pass the returned filename) so an agent knows exactly what must be true before calling.

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 batchA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyframesYesOne or more keyframe entries to apply.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 blockA
Destructive
Inspect

Set (or replace) a layer's timeline BLOCK — the [start, start+duration) window it exists for. The layer is drawn ONLY inside that window, and its animation keyframes are sampled RELATIVE to the block start, so moving or trimming the block re-anchors its intro instead of leaving it behind. This is how a layer 'starts' at a point like an iMovie clip rather than being present for the whole composition. Works on any leaf or group. Frames are in the layer's parent timeline (composition frames at root; band-local inside an embedded morpha band). To place a whole embedded reel, use move_band.

ParametersJSON Schema
NameRequiredDescriptionDefault
startYesFirst frame the layer appears (0-indexed, 30 fps), in its parent timeline.
durationYesHow many frames the layer lasts (≥ 1). Hidden outside [start, start+duration).
elementIdYesElement id of the layer (image.<id>, video.<id>, text.<id>, shapes.<id>, or group.<id>).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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: the layer is drawn ONLY inside the window, keyframes are sampled RELATIVE to the block start, and moving/trimming re-anchors the intro. It also clarifies frame coordinate context (parent timeline, band-local inside embedded morpha band). It doesn't explicitly state that replacing an existing block destroys the old one, but the 'replace' wording plus destructiveHint covers that.

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

Conciseness5/5

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

The description is compact and front-loaded: the core definition and window semantics come first, followed by the keyframe re-anchoring behavior, then the use-case analogy, then frame coordinate context, and finally the sibling alternative. Every sentence earns its place and no filler exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a mutation tool with a full schema and output schema. It covers what the block is, how it behaves, what coordinate system frames use, and which sibling to use instead for embedded reels. The destructive nature is already in annotations, and the output schema handles return values, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds meaning by explaining the semantic relationship between start and duration (the [start, start+duration) window) and the relative keyframe sampling, which goes beyond the schema's individual parameter descriptions. However, it doesn't add new per-parameter details beyond what the schema provides, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Set (or replace)'), a precise resource ('a layer's timeline BLOCK'), and defines the block as '[start, start+duration) window'. It distinguishes this from simply adding a layer and from move_band, so 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool: to make a layer 'start' at a point like an iMovie clip rather than being present for the whole composition. It also names the alternative for placing a whole embedded reel ('use move_band'), giving clear routing guidance.

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 fillA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fillYesEither '#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.
elementIdYesshapes.<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.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
clear_animationNoOnly 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 textA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoThe text to render. Newlines are honoured as hard line breaks.
curveNoCurve 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).
elementIdYesText layer id, text.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
text_sizeNoFont size in px.
font_styleNoItalic toggle. Default normal.
text_alignNoHorizontal alignment of each line. Default center.
text_colorNoText fill colour as #rrggbb.
decorationsNoPer-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_familyNoGoogle Fonts family name, e.g. "Anton".
font_weightNoFont weight 100..900 (400 regular, 700 bold, 800 black). Default 400; the canvas synthesizes weights a static font doesn't ship.
line_heightNoLine height as a multiple of font size (1.2 = 120%).
text_shadowNoDrop shadow { offsetX, offsetY, blur, color }; color is any CSS colour (rgba allowed). null clears it.
text_valignNoVertical 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_colorNoOutline colour as #rrggbb. Defaults to white when a width is set.
stroke_widthNoOutline width in px (0 = no outline).
text_autofitNoHow 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_spacingNoTracking between glyphs in px; may be negative. Default 0.
text_transformNoCase transform applied before layout. Default none.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses detailed behavioral traits beyond annotations: it patches only specified fields, requires only elementId, explains curve behavior (single-line only, restores on curve:0), autofit mode nuances, and decoration re-indexing. It aligns with destructiveHint=true by indicating it modifies existing layers, adding rich context without contradiction.

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

Conciseness4/5

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

The description is lengthy (approximately 400 words) but well-structured: it starts with core purpose, then details parameters, and covers special behaviors. Each sentence adds value for a complex tool with 19 parameters. It is not overly concise, but the length is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 19 parameters and complex behaviors, the description covers every parameter, explains edge cases (e.g., curve applies to single line, decorations not rendered on curved text), and directs to related tools. It is comprehensive and leaves little to inference, making it complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Though the schema covers all 19 parameters, the description adds significant semantic meaning: it defines font_family as Google Fonts, explains text_autofit modes with examples, clarifies curve sign conventions, and notes multi-line handling. This goes beyond schema descriptions, providing practical guidance for correct parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Edit an existing text layer (text.<id>)' and enumerates the exact fields it patches (text content, font, size, colour, type styling). It explicitly distinguishes itself from add_text_layer for creation and clarifies it does not touch image layers, making its purpose unambiguous and distinct from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance: 'Does NOT create layers and does NOT touch image layers; use add_text_layer to make a new one.' It also directs to set_matte_source for masking, and explains that only elementId is required, giving clear when-to-use and when-not-to-use context.

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 transitionA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
edgeYesWhich edge to set. "in" is the start of the layer's window, "out" the end.
kindYesThe 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.
curveNoOptional easing override (linear, easeIn, easeOut, easeInOut, outQuart, outExpo, outBack, inBack, inOutBack). Defaults suit the kind: entries decelerate in, exits accelerate away.
framesNoRamp length in frames (30 fps). Default 6. Ignored for kind "cut".
directionNoFor kind "slide" only. On the IN edge this is where the layer comes FROM; on the OUT edge, where it goes TO. Default "left".
elementIdYesElement id of the layer (image.<id>, video.<id>, text.<id>, shapes.<id>, or group.<id>).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 visibleA
Destructive
Inspect

Show or hide a layer instantly by writing a single opacity keyframe (1 or 0) at frame 0.

ParametersJSON Schema
NameRequiredDescriptionDefault
visibleYes
elementIdYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 loopA
Destructive
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNoThe layer field each pass overrides — e.g. "text", "text_color", "filename". Defaults to "text".
valuesYesOne value per loop pass. Empty array clears the loop.
elementIdYesTarget layer — text.<id>, image.<id>, shapes.<id>, or video.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-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.

Usage Guidelines4/5

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 sourceA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementIdYesHost being masked: image/video/shapes/text.<id>, or group.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
matte_invertedNoOptional. 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_idYesElement id of the layer whose alpha drives the mask, or null to clear.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 pivotA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
anchorYesWhich 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).
elementIdYesimage.<id>, video.<id>, shapes.<id>, or text.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 styleA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fitNoFit mode (image + video layers). Default: stretch for image layers, cover for video layers.
anchorXNoObject-position X (0..1). 0=left, 1=right, 0.5=centre. Only meaningful with fit=cover|contain.
anchorYNoObject-position Y (0..1). 0=top, 1=bottom, 0.5=centre. Only meaningful with fit=cover|contain.
alphaMaskNoLinear 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.
boxShadowNoCSS box-shadow string, e.g. "0 4px 12px rgba(0,0,0,0.5)". Pass an empty string "" or null to REMOVE the shadow.
elementIdYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
tintColorNo#rrggbb tint colour painted source-atop over the image (image layers only).
blend_modeNoPhotoshop-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_keyNoGreen-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.
borderAlignNoWhere 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.
borderColorNo#rrggbb.
borderWidthNo
borderRadiusNo
tintStrengthNoTint blend strength 0..1. 0=no tint, 1=image silhouette filled with tintColor. Default 0 (no tint).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines4/5

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 backgroundA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fillNoBox 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.
paddingNoUniform 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.
elementIdYestext.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
strokeColorNoBox outline colour as #rrggbb.
strokeWidthNoBox outline width in px. 0 / omitted ⇒ no outline.
cornerRadiusNoCorner radius of the box in px. 0 ⇒ square corners.
clear_animationNoOnly 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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already mark the tool as destructive/mutating, and the description adds meaningful behavioral context: it is a partial update ('Pass only the fields you want to change'), fill null removes the box, and the box is deliberately not painted on curved text. This goes beyond the 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.

Conciseness4/5

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

The description is longer than average, but most of the length carries high-value usage guidance: the button-building pattern, the curved-text exception, and the alternative tool. It is front-loaded with the core operation before diving into context, though the capitalized 'THIS IS HOW YOU BUILD A BUTTON' section is somewhat verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the input schema covers all parameters, the description provides everything an agent needs to invoke this correctly: scope, update semantics, removal behavior, the button use case, and when to route to a different tool. No critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds extra semantic value by explaining how padding shrink-wraps the box on 'hug' layers and narrows line-wrap on 'wrap'/'fit'/'shrink' layers. It also clarifies that only provided fields are changed, which is not fully captured in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Add or update the rounded background box behind a TEXT layer (text.<id>) in one call'. It also distinguishes itself from the sibling set_layer_fill by explicitly scoping to text layers and stating 'for shapes/images/video use set_layer_fill'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance, including the autofit 'hug' behavior for new layers, when set_layer_text(text_autofit:'hug') is needed for older 'wrap' layers, and the curved-text exception where a shape behind the text is required. It also names the alternative tool for non-text layers.

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 loopA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes
propertyYes
elementIdYesLayer id (video/image/shape/group).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 clipA
Destructive
Inspect

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, or the morphareels-sdk's client.addVideo); 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipYesThe uploaded clip's id: the `filename` its upload returned.
nameNoOptional 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.
elementIdYesVideo layer id, video.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.6/5.0
Behavior4/5

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

The annotations already mark destructiveHint=true, and the description adds valuable context by specifying exactly what changes ('only the source mp4 changes') and what is preserved (id, position, size, animations, styles, trim window). It also notes the clip must be uploaded, implying a failure condition. However, it does not mention potential error outcomes or permission requirements, which would have strengthened transparency further.

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

Conciseness5/5

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

The description is three sentences, with the main purpose and scoping constraint front-loaded. It efficiently conveys the action, the preservation guarantee, the prerequisite, and the key parameter guidance. Every sentence adds essential information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 4 parameters and an output schema, the description covers the core behavior, the precondition, and the parameter semantics. It does not explicitly mention error handling or side effects beyond the layer change, but the output schema likely covers return values. Given the complexity, this is sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all parameters are described in the schema. The description adds meaning by explaining that 'clip' is the upload's filename and 'name' is the label (optional, can be null/empty to clear). It also clarifies that elementId is the video layer id (video.<id>). This context helps the agent understand the provenance and format of the parameters beyond the schema's bare descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'repoint' with the specific resource 'existing video layer' and the target 'different uploaded clip'. It distinguishes from siblings by emphasizing it keeps the layer's id, position, size, animations, styles, and trim window while only changing the source mp4. This differentiates it from add_video_layer, set_video_layer_trim, and similar tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the use case: 'Use this to swap a video layer's source WITHOUT losing its keyframes.' It also provides prerequisites (the clip must already be uploaded) and references how to obtain the required parameters (via upload's filename and name). This gives clear guidance on when to invoke this tool and what conditions must be met.

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 mutedA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
mutedYestrue silences the layer's baked audio; false restores it.
elementIdYesVideo layer id, video.<id>.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 trimA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementIdYesvideo.<id> of the layer to trim.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
source_in_frameNoFrame in the source mp4 where playback begins (0-indexed, 30 fps).
source_out_frameNoFrame in the source mp4 where playback stops, or null to clear and play to the source's natural end.
timeline_start_frameNoProject-timeline frame where this slice begins playing.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines5/5

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 groupA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
startYesABSOLUTE frame the group's window should start at after the move (0-indexed, 30 fps) — not an offset.
elementIdYesThe group's id (group.<id> or the bare <id>).
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines5/5

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 trackA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
deltaYesAdded to every keyframe's value on this track. Negative shifts the curve down/left.
propertyYes
elementIdYes
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

split_caption_lineSplit caption lineA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
atFrameYesComposition frame to split at — must be strictly inside the line's on-timeline window (see describe_video / inspect_layers for windows).
elementIdYesThe caption line to split, "text.<id>".
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 clipA
Read-only
Inspect

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? } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
clipYesClip filename (video.<id>.clip).
projectIdYesProject the clip belongs to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 layersA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdYesBare group id (no 'group.' prefix), e.g. "header" for group.header.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb 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.

Usage Guidelines3/5

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 overlayA
Destructive
Inspect

Patch an existing audio overlay. Only the fields you pass are changed. Pass endFrame:null to clear it (revert to natural-length playback).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
gainNoLinear gain 0..2.
nameNoThe track's label people see (pass the upload's returned `name` alongside a replacement `filename`), or null to remove it.
endFrameNoEnd frame, or null to clear and use the asset's natural length.
filenameNoReplace the track's audio: the stored filename an upload returned.
projectIdYesOpaque project id (a v4 UUID, from list_projects/create_project). Selects which existing project this call mutates.
startFrameNo
fadeInFramesNo
fadeOutFramesNo
sourceLayerIdNoWeld 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.
denoiseStrengthNoClean-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

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 audioA
Destructive
Inspect

Upload an audio track into a project by fetching a public http(s) URL server-side — the ONLY way to get an audio file's bytes into a project over MCP/HTTP (add_audio_overlay / update_audio_overlay only reference a file that is already uploaded). 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. The url must be a direct, publicly-fetchable http(s) link (not an auth-walled page). Buffered in Worker memory, so capped at 50 MB. For a file on the caller's own disk, use create_upload_link instead. Reference: https://morphareels.ai/docs/tools#uploadaudiourl-name

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesDirect, publicly-fetchable http(s) URL of the audio file (.mp3/.m4a/.wav/.ogg/.aac).
nameNoOptional display name, what people see (e.g. Theme.mp3). Defaults to the URL's file name. It never decides where the file is stored.
projectIdYesProject to add the audio to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A5/5.0
Behavior5/5

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

Despite annotations providing readOnlyHint=false and destructiveHint=true, the description goes far beyond them: it details the HTTP GET fetch, redirect following, User-Agent identification, absence of third-party APIs, buffering in Worker memory with a 50 MB cap, storage in the asset bucket under a new id, and the exact return object. This is rich behavioral context 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.

Conciseness5/5

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

The description is long but every sentence earns its place: it opens with the core purpose, then details the fetch mechanics, return value, and downstream usage, followed by constraints and alternatives. It is front-loaded with the primary action and avoids filler. The structure is logical and scannable despite its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 rich annotations, the description is thoroughly complete: it explains the return format, how to use the returned filename with add/update overlay tools, the 50 MB limit, the requirement for public URLs, the user-agent, and even provides a documentation reference. 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description adds substantial meaning: url is constrained to direct, publicly-fetchable http(s) links with allowed formats; name is clarified as optional, defaults to the URL's file name, and 'never decides where the file is stored'; projectId is straightforward. The description enhances the schema by explaining the role of the returned filename and how it flows into overlay tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('upload'), resource ('audio track into a project'), and method ('fetching a public http(s) URL server-side'). It explicitly distinguishes itself from sibling tools by noting it is the ONLY way to get audio bytes into a project over MCP/HTTP, and clarifies that add_audio_overlay/update_audio_overlay only reference already-uploaded files. This leaves no ambiguity about the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: it is the only way to upload audio via URL, and contrasts with create_upload_link for local files. It also explains the workflow: after upload, pass the returned filename to add_audio_overlay or update_audio_overlay. The 'ONLY way' and 'For a file on the caller's own disk, use create_upload_link instead' give clear when-to-use and when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_imageUpload imageA
Destructive
Inspect

Upload an image into a project by fetching a public http(s) URL server-side. 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 }: pass the returned filename (the file's id, never shown to a person) to add_image_layer, and name is what people see. 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. The url must be a direct, publicly-fetchable http(s) link (not an auth-walled page). SVGs are rejected if they carry a , an inline event handler, a , a javascript: URL, or an external resource reference — supply a static, self-contained SVG. Buffered in Worker memory, so capped at 16 MB. For a file on the caller's own disk, use create_upload_link instead. Reference: https://morphareels.ai/docs/tools#uploadimageurl-name

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesDirect, publicly-fetchable http(s) URL of the image file (.png/.jpg/.jpeg/.gif/.webp/.svg).
nameNoOptional display name, what people see (e.g. Logo.png). Defaults to the URL's file name. It never decides where the file is stored.
projectIdYesProject to add the image to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesWhether the call succeeded.
dataNoThe payload, shaped by the tool.
noteNoWhat to do next when not ready.
errorNoWhy it failed.
statusNoFor cache-backed readers: whether the answer was ready.
editorUrlNoOpens this project in the editor.

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses the server-side fetch mechanism, User-Agent, redirect handling, no third-party API, storage under a new id, SVG sanitization rules, and the 16 MB memory cap. Annotations only provide the generic safety flags, so this rich behavioral detail is the description's own contribution and is not contradicted by any annotation.

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

Conciseness4/5

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

Longer than necessary, but front-loads the core operation and each sentence carries operational detail (allowed formats, rejection rules, cap, alternative). The only mild redundancy is repeating that the URL must be public, which appears in both schema and prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that fetches arbitrary URLs, the description accounts for what can go wrong (auth-walled URLs, SVG threats, size cap), what happens after upload (returned filename for add_image_layer), and the alternative for local files. With an output schema also present, 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds substantive meaning beyond each property: url must be direct/public and supports only specific formats; name is display-only, defaults to the URL filename, and never determines storage; projectId is the target project. It also clarifies the returned filename vs name mapping.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description immediately states the verb and resource: 'Upload an image into a project by fetching a public http(s) URL server-side.' It also explicitly contrasts with related tools by adding 'This tool does not search for images' and naming create_upload_link, so an agent can distinguish it from upload_audio and search-like 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use conditions: pass a direct, publicly-fetchable image URL, and 'For a file on the caller's own disk, use create_upload_link instead.' It also states when not to use it (not for auth-walled pages or search) and notes to respect source licence, which is far beyond a generic list.

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.

  1. 9 tool updates
    • Changedadd_audio_overlay2 fields changed
      • changedInput schema / properties / filename / description
        Previous value: -"Audio asset filename in the project's assets bucket."New value: +"The stored audio filename an upload returned."
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional label people see on the track: pass the upload's returned `name`.",
        +  "type": "string"
        +}
    • Changedadd_image_layer2 fields changed
      • changedInput schema / properties / filename / description
        Previous value: -"Asset filename in the project's assets bucket, e.g. star.png."New value: +"The stored filename an upload returned (an id such as 3f2a9c1e-….png, or an older project's own name)."
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "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.",
        +  "type": "string"
        +}
    • Changedadd_video_layer2 fields changed
      • changedInput schema / properties / clip / description
        Previous value: -"Clip filename in the project's clips bucket, e.g. demo.mp4."New value: +"The stored clip filename an upload returned (an id such as 3f2a9c1e-….mp4, or an older project's own name)."
      • changedInput schema / properties / name / description
        Previous value: -"Optional friendly label shown in the Inspector + Timeline."New value: +"Optional label people see in the Inspector and Timeline: pass the upload's returned `name`."
    • Changedcreate_upload_link7 fields changed
      • removedInput schema / properties / filename
        Removed value: -{
        -  "description": "The file's own name with its extension (e.g. hero.jpg). Stored lowercased with unsafe characters replaced; the result's `filename` is the stored name.",
        -  "type": "string"
        -}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "The file's own name or path on disk, with its extension (e.g. hero.jpg). `command` uploads that path, people see its last segment, and the file is stored under a new id.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "filename"
        -]New value: +[
        +  "projectId",
        +  "name"
        +]
      • changedOutput schema / properties / data / properties / filename / description
        Previous value: -"The stored name: what add_image_layer, add_audio_overlay and set_custom_font take."New value: +"The file's id: what add_image_layer, add_audio_overlay and set_custom_font take. Never shown to a person."
      • addedOutput schema / properties / data / properties / name
        Added value: +{
        +  "description": "The file's display name, what people see: the last segment of the name you passed.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / data / properties / renamedFrom
        Removed value: -{
        -  "description": "Present when sanitising changed the name you passed: what you passed.",
        -  "type": "string"
        -}
      • changedOutput schema / properties / data / required
        Previous value: -[
        -  "uploadUrl",
        -  "filename",
        -  "contentType",
        -  "maxBytes",
        -  "expiresAt",
        -  "command"
        -]New value: +[
        +  "uploadUrl",
        +  "filename",
        +  "name",
        +  "contentType",
        +  "maxBytes",
        +  "expiresAt",
        +  "command"
        +]
    • Changedset_image_filename2 fields changed
      • changedInput schema / properties / filename / description
        Previous value: -"Asset filename in the project's assets bucket, e.g. drake.png."New value: +"The uploaded file's id: the `filename` its upload returned."
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "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.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedset_video_clip2 fields changed
      • changedInput schema / properties / clip / description
        Previous value: -"Clip filename in the project's clips bucket, e.g. mickey-tiktok.mp4."New value: +"The uploaded clip's id: the `filename` its upload returned."
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "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.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedupdate_audio_overlay2 fields changed
      • addedInput schema / properties / filename / description
        Added value: +"Replace the track's audio: the stored filename an upload returned."
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "The track's label people see (pass the upload's returned `name` alongside a replacement `filename`), or null to remove it.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedupload_audio2 fields changed
      • removedInput schema / properties / filename
        Removed value: -{
        -  "description": "Optional stored filename (.mp3/.m4a/.wav/.ogg/.aac). Defaults to the basename of the URL path; sanitised to lowercase a-z0-9._-.",
        -  "type": "string"
        -}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "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.",
        +  "type": "string"
        +}
    • Changedupload_image2 fields changed
      • removedInput schema / properties / filename
        Removed value: -{
        -  "description": "Optional stored filename (.png/.jpg/.jpeg/.gif/.webp/.svg). Defaults to the basename of the URL path; sanitised to lowercase a-z0-9._-.",
        -  "type": "string"
        -}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "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.",
        +  "type": "string"
        +}
  2. 99 tool updates
    • Changedadd_audio_overlay2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "filename",
        -  "startFrame",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "filename",
        +  "startFrame",
        +  "projectId"
        +]
    • Changedadd_caption_track2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "lines",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "lines",
        +  "projectId"
        +]
    • Changedadd_color_keyframe2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "property",
        -  "frame",
        -  "value",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "property",
        +  "frame",
        +  "value",
        +  "projectId"
        +]
    • Changedadd_curve2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "x1",
        -  "y1",
        -  "x2",
        -  "y2",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "x1",
        +  "y1",
        +  "x2",
        +  "y2",
        +  "projectId"
        +]
    • Changedadd_embed_origin2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "origin",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "origin",
        +  "projectId"
        +]
    • Changedadd_from_collection2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "sourceProjectId",
        -  "elementId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "sourceProjectId",
        +  "elementId"
        +]
    • Changedadd_image_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "filename",
        -  "x",
        -  "y",
        -  "width",
        -  "height",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "filename",
        +  "x",
        +  "y",
        +  "width",
        +  "height",
        +  "projectId"
        +]
    • Changedadd_keyframe2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "property",
        -  "frame",
        -  "value",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "property",
        +  "frame",
        +  "value",
        +  "projectId"
        +]
    • Changedadd_keyframes2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "property",
        -  "keyframes",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "property",
        +  "keyframes",
        +  "projectId"
        +]
    • Changedadd_morpha_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "source_morpha_id",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "source_morpha_id",
        +  "projectId"
        +]
    • Changedadd_page2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedadd_shape2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "kind",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "kind",
        +  "projectId"
        +]
    • Changedadd_speed_keyframe2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "frame",
        -  "rate",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "frame",
        +  "rate",
        +  "projectId"
        +]
    • Changedadd_text_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedadd_to_collection2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedadd_video_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "clip",
        -  "x",
        -  "y",
        -  "width",
        -  "height",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "clip",
        +  "x",
        +  "y",
        +  "width",
        +  "height",
        +  "projectId"
        +]
    • Changedapply_preset2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "preset",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "preset",
        +  "projectId"
        +]
    • Changedapply_preset_stagger2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementIds",
        -  "preset",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementIds",
        +  "preset",
        +  "projectId"
        +]
    • Changedclip_processing_status2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Removedcreate_anonymous_account
    • Changedcreate_project2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "anonymousToken"
        -]
    • Changedcreate_upload_link2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "filename",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "filename"
        +]
    • Changedcreate_workspace2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "anonymousToken"
        -]New value: +[
        +  "name"
        +]
    • Changedcut_range2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "startFrame",
        -  "endFrame",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "startFrame",
        +  "endFrame",
        +  "projectId"
        +]
    • Changeddelete_page2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "index",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "index",
        +  "projectId"
        +]
    • Changeddelete_project2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changeddelete_version2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "versionId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "versionId"
        +]
    • Changeddescribe_video2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changeddetect_text_regions2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedduplicate_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "count",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "count",
        +  "projectId"
        +]
    • Changedduplicate_project2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedfade_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "fromFrame",
        -  "toFrame",
        -  "fromOpacity",
        -  "toOpacity",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "fromFrame",
        +  "toFrame",
        +  "fromOpacity",
        +  "toOpacity",
        +  "projectId"
        +]
    • Changedfit_duration_to_content2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedfreeze_frame2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "frame",
        -  "image",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "frame",
        +  "image",
        +  "projectId"
        +]
    • Changedgroup_layers2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementIds",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementIds",
        +  "projectId"
        +]
    • Changedinspect_layers2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementIds",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementIds",
        +  "projectId"
        +]
    • Changedlist_collection2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "anonymousToken"
        -]New value: +[]
    • Changedlist_fonts2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedlist_projects2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "anonymousToken"
        -]New value: +[]
    • Changedlist_versions2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedlist_workspaces2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "anonymousToken"
        -]New value: +[]
    • Changedmerge_caption_lines2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementIds",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementIds",
        +  "projectId"
        +]
    • Changedmove_band2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "bandId",
        -  "start",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "bandId",
        +  "start",
        +  "projectId"
        +]
    • Changedmove_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedmove_project_to_workspace2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "workspaceId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "workspaceId"
        +]
    • Changedopen_project2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedreid_project2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedremove_audio_overlay2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "id",
        +  "projectId"
        +]
    • Changedremove_color_keyframe2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "property",
        -  "frame",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "property",
        +  "frame",
        +  "projectId"
        +]
    • Changedremove_embed_origin2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "origin",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "origin",
        +  "projectId"
        +]
    • Changedremove_from_collection2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedremove_keyframe2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "property",
        -  "frame",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "property",
        +  "frame",
        +  "projectId"
        +]
    • Changedremove_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedremove_speed_keyframe2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "frame",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "frame",
        +  "projectId"
        +]
    • Changedrename_group2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "groupId",
        -  "name",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "groupId",
        +  "name",
        +  "projectId"
        +]
    • Changedrename_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "name",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "name",
        +  "projectId"
        +]
    • Changedrename_project2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "name",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "name"
        +]
    • Changedrename_version2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "versionId",
        -  "name",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "versionId",
        +  "name"
        +]
    • Changedrename_workspace2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "workspaceId",
        -  "name",
        -  "anonymousToken"
        -]New value: +[
        +  "workspaceId",
        +  "name"
        +]
    • Changedrender_status2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "renderId",
        -  "anonymousToken"
        -]New value: +[
        +  "renderId"
        +]
    • Changedrender_video2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedreorder_layer2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "newIndex",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "newIndex",
        +  "projectId"
        +]
    • Changedreorder_pages2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "from_index",
        -  "to_index",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "from_index",
        +  "to_index",
        +  "projectId"
        +]
    • Changedrestore_version2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "versionId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "versionId"
        +]
    • Changedsafe_zones2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "clip",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "clip"
        +]
    • Changedsave_version2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId"
        +]
    • Changedselect_page2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "index",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "index",
        +  "projectId"
        +]
    • Changedset_canvas_size2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "width",
        -  "height",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "width",
        +  "height",
        +  "projectId"
        +]
    • Changedset_clip_speed2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "speed",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "speed",
        +  "projectId"
        +]
    • Changedset_custom_font2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "family",
        -  "src",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "family",
        +  "src",
        +  "projectId"
        +]
    • Changedset_duration2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "seconds",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "seconds",
        +  "projectId"
        +]
    • Changedset_embed_origins2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "origins",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "origins",
        +  "projectId"
        +]
    • Changedset_group_box2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "box_width",
        -  "box_height",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "box_width",
        +  "box_height",
        +  "projectId"
        +]
    • Changedset_group_parent2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "parentGroupId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "parentGroupId",
        +  "projectId"
        +]
    • Changedset_group_window2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "start",
        -  "duration",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "start",
        +  "duration",
        +  "projectId"
        +]
    • Changedset_image_filename2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "filename",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "filename",
        +  "projectId"
        +]
    • Changedset_keyframes_batch2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "keyframes",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "keyframes",
        +  "projectId"
        +]
    • Changedset_layer_block2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "start",
        -  "duration",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "start",
        +  "duration",
        +  "projectId"
        +]
    • Changedset_layer_fill2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "fill",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "fill",
        +  "projectId"
        +]
    • Changedset_layer_text2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedset_layer_transition2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "edge",
        -  "kind",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "edge",
        +  "kind",
        +  "projectId"
        +]
    • Changedset_layer_visible2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "visible",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "visible",
        +  "projectId"
        +]
    • Changedset_loop2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "values",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "values",
        +  "projectId"
        +]
    • Changedset_matte_source2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "matte_source_id",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "matte_source_id",
        +  "projectId"
        +]
    • Changedset_pivot2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "anchor",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "anchor",
        +  "projectId"
        +]
    • Changedset_style2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedset_text_background2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedset_track_loop2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "property",
        -  "mode",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "property",
        +  "mode",
        +  "projectId"
        +]
    • Changedset_video_clip2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "clip",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "clip",
        +  "projectId"
        +]
    • Changedset_video_layer_muted2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "muted",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "muted",
        +  "projectId"
        +]
    • Changedset_video_layer_trim2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "projectId"
        +]
    • Changedshift_group2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "start",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "start",
        +  "projectId"
        +]
    • Changedshift_track2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "property",
        -  "delta",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "property",
        +  "delta",
        +  "projectId"
        +]
    • Changedsplit_caption_line2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "elementId",
        -  "atFrame",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "elementId",
        +  "atFrame",
        +  "projectId"
        +]
    • Changedtranscribe_clip2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "clip",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "clip"
        +]
    • Changedungroup_layers2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "groupId",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "groupId",
        +  "projectId"
        +]
    • Changedupdate_audio_overlay2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "id",
        -  "projectId",
        -  "anonymousToken"
        -]New value: +[
        +  "id",
        +  "projectId"
        +]
    • Changedupload_audio2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "url",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "url"
        +]
    • Changedupload_image2 fields changed
      • removedInput schema / properties / anonymousToken
        Removed value: -{
        -  "description": "The token create_anonymous_account returned. This connection has no Morpha key, so every call carries it.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "url",
        -  "anonymousToken"
        -]New value: +[
        +  "projectId",
        +  "url"
        +]

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources