Kalpana Designer
Server Details
Make ad creatives, social media posts and banners from a brief. Editable designs you can reuse.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 43 tools
Most tools have clearly distinct purposes, and the descriptions explicitly cross-reference alternatives (e.g. animate vs edit_keyframes vs clear_animation; render_design vs render_contact_sheet vs render_timeline). Some adjacency remains among motion/effect tools such as animate, kinetic_type, make_carousel, camera, and set_choreography, but each targets a specific workflow rather than duplicating another.
The set is predominantly consistent snake_case with verb_noun naming (create_layers, update_layers, delete_layers, render_design, set_timeline). Minor deviations like camera, undo, duplicate, and shape_path are readable and domain-specific rather than chaotic.
At 43 tools, the surface is well beyond the typical agent-friendly range and includes many specialized generators and utilities (make_particles, make_cursor, make_list, shape_path, calculate, stagger_times). The platform is broad, but the sheer number increases selection burden and exceeds the rubric's 25+ threshold for 'too many'.
The surface covers core design creation, layer CRUD, structure editing, templates/pages, images, fonts, shaders, animation, rendering, and utility computations quite comprehensively. Some gaps remain around batch filling/export workflows and template deletion, but these are either adjacent concerns or can be partially worked around.
Available Tools
43 toolsanimateAnimate layersAInspect
Add motion to layers: presets (fade_in, slide_in_up, pop_in, spring_in, bounce_in, tilt_in, blur_in, wipe_in_right, draw_on, pulse, float, spin, shake, drift, count_up, count_down, orbit, ring_spin, peel and the outs) placed at a start time, raw keyframes per property (with springs), word or letter text reveals (typewriter, scramble), shape morphs between a vector layer's shapes, and stagger to cascade a motion over a layer's children. Motion adds to what a layer has unless replace is set; the timeline grows to fit. Returns the timeline. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it to add or replace motion; to tune one keyframe use edit_keyframes, to remove motion clear_animation, and check the result with render_contact_sheet. A template with motion can still fill batches as images. Each image shows one moment of the motion. The default moment is the last frame. An outro or a loop can make the last frame a bad image. Find the moment where all the content shows (render_contact_sheet, render_timeline), ask the user if you are not sure, and set that second with set_timeline still_time.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| animations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-readonly, non-destructive mutation, but the description adds key mutation semantics: motion is additive unless replace is set, the timeline grows to fit, a new revision is saved, undo reverts it, and a refused part leaves nothing changed. It also flags the still-frame caveat for image batches, which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core capabilities and routing guidance are front-loaded, and every major sentence has a purpose. The final still-frame guidance is useful but could be tighter and partly repeats render_contact_sheet as a verification step. Overall it remains efficient for a complex animation tool, but not maximally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex animation tool with no output schema, the description covers the return value, mutation semantics, verification workflow, and alternatives. It also addresses a subtle downstream failure mode, the default last-frame image, and tells the agent how to resolve it. Nothing an agent needs in order to call animate correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, so the description should compensate somewhat; it does by grouping the complex animations input into presets, raw keyframes, text reveals, shape morphs, and stagger, and by explaining replace behavior. It leaves page_id and intent to the schema, which is acceptable because their schema descriptions are already clear. It adds useful conceptual mapping beyond parameter names, though not exhaustive detail for every nested field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource, 'Add motion to layers', and enumerates the concrete motion types: presets, keyframes, text reveals, shape morphs, and stagger. It also names sibling tools for adjacent tasks, so an agent can distinguish animate from edit_keyframes and clear_animation without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use animate to add or replace motion, edit_keyframes to tune one keyframe, clear_animation to remove motion, and render_contact_sheet to check results. It also advises checking the still frame and using set_timeline still_time when a template's default frame would be a poor image.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculateCalculateARead-onlyIdempotentInspect
Evaluate arithmetic exactly instead of estimating: + - * / % ^, parentheses, pi, trigonometry in radians (rad() and deg() convert), sqrt, abs, min, max, round, floor, ceil, clamp, lerp, pow, hypot, atan2, ln, log10, exp. Give one expression (returns result), named expressions that can use earlier names (returns each by name), or an expression over a series of a variable (returns values as [x, y] pairs, up to 2000 steps). Answers are rounded to 6 decimal places, and a malformed expression is refused with the reason. Free, read-only, no design needed. Use it for sizes, positions and angles, and for colour contrast with the formula in design_guide; for positions of many items use place_items, for start times stagger_times.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | No | Optional: a few words on why. | |
| series | No | Evaluate `expression` over a range of one variable instead. | |
| variables | No | Values for names used in the expressions. | |
| expression | No | One expression, e.g. "1080 / 3 - 24" or "sin(rad(30)) * r". | |
| expressions | No | Several named expressions at once; later ones may use earlier names. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe read-only profile, but the description adds important behaviour: results are rounded to 6 decimal places, malformed expressions are refused with a reason, series evaluations cap at 2000 steps, and the tool is free and requires no design. These are meaningful operational details beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core purpose. The long function list is useful for a calculator, though the prose could be slightly more structured; almost every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a five-parameter tool with nested objects, no output schema, and rich annotations, the description covers invocation modes, return shapes, limits, error behaviour, and usage context. It gives an agent everything needed to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful mode semantics: one expression returns result, named expressions can reference earlier names, and series evaluation returns values as [x, y] pairs. It does not need to repeat every schema detail, but it helpfully clarifies the three invocation patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Evaluate arithmetic exactly instead of estimating,' then lists supported operators and functions. It clearly distinguishes this tool from estimation and from sibling helpers like place_items and stagger_times.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases (sizes, positions, angles, colour contrast) and names alternatives for related tasks: design_guide for contrast formulas, place_items for many item positions, and stagger_times for start times. This is enough for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cameraMove a camera through the designAInspect
Film a design with a camera: push in on a detail, pan across, roll, tilt in 3D, pull back. stops give each moment's time, zoom (1 = whole design), the focus point at the centre of the shot, and rotation or tilt. The layers move into a design-sized Camera frame at the back (their own positions do not change); kinetic type and transitions stay above the shot. Calling it again replaces the move. Returns the camera_id, the layers filmed and the timeline. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for one continuous move over the whole design; for slides joined by transitions use set_choreography flow, and to move a single layer animate.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | The top-level layers the camera films (default every top-level layer except transitions, which stay fixed to the screen). | |
| stops | Yes | Where the camera is over time: pushes, pans to a detail, rolls. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that layers are re-parented into a design-sized Camera frame without changing their own positions, that kinetic type and transitions stay above the shot, that re-calling replaces the move, and that a refused part leaves nothing changed (atomic). It also states the call creates a new revision that undo reverts, which the destructiveHint=false alone would not reveal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then behavior, then the return value and routing alternatives. Dense but every sentence carries distinct information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description names what is returned (camera_id, filmed layers, timeline), covers atomicity, revision/undo semantics, and replacement on repeat calls. An agent can invoke this correctly without further information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines t, zoom, focus, easing, tilt, rotation and ids. The description restates them in prose ('stops give each moment's time, zoom (1 = whole design), the focus point…') with only marginally different wording, so it adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb (film) and resource (a design with a camera) plus the concrete operations: push in, pan, roll, tilt, pull back. It names the sibling tools it is not (set_choreography, animate), so an agent can separate it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given: use this for one continuous move over the whole design; use set_choreography flow for slides joined by transitions; use animate to move a single layer. Both alternatives and the selecting condition are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_layoutCheck a design's layoutARead-onlyIdempotentInspect
Find layout problems in a design after layout: text over other text, layers cut off by a clipping frame or running off the canvas, text too small for the size the design is seen at, and text with too little contrast on what is behind it. Returns every issue at once, each naming its layers with a severity (error, or info that is often on purpose), and ok when there are none. Read-only. Run it before finishing a design (edits already report the issues they cause), and confirm an issue with render_design before changing anything; to size text before placing it use measure_text. craft: true adds opt-in craft checks; ignore, allow_bleed and display_width quiet what is intended.
| Name | Required | Description | Default |
|---|---|---|---|
| craft | No | Run every craft check (all "info", never blocking): orphan, near_touch, raw_hex, empty_frame, chrome_drift, sliver, empty_band. | |
| checks | No | Craft checks to run, by name (see `craft`). | |
| ignore | No | Pairs of layer ids whose overlap is on purpose (a stamp over a headline): not reported. | |
| intent | No | Optional: a few words on why. | |
| margin | No | Content margin in px (one number, or [left, top, right, bottom]): report layers whose painted extent (strokes included) crosses it. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| allow_bleed | No | Layers (and their children) that bleed past the page or their clipping frame on purpose: not reported. | |
| display_width | No | How wide the design is seen on screen, px. Sets the smallest readable text and what counts as large text. Default: 400 for 1080-wide square or portrait social posts, 1280 for 1920x1080, else the page width. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description still adds value by describing return behavior (all issues at once, each with layer names and an error/info severity, or `ok` when clean) and that info-severity items are often intentional. Not a full 5 only because the severity semantics could be slightly more precise.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the problem classes, then return shape, then workflow guidance. Dense but each clause carries information; the long opening sentence is slightly packed but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully explains the return contract (all issues, per-layer attribution, severity, `ok` sentinel), and covers workflow, alternatives, and opt-in checks. Complete for an 8-parameter read-only inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3; the description adds a meaningful synthesis of the quieting options ("`ignore`, `allow_bleed` and `display_width` quiet what is intended") and ties `craft` to opt-in checks, helping an agent understand the parameters' relationship rather than just their individual definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ("Find layout problems in a design") followed by a concrete enumeration of the problem classes it detects (overlapping text, clipped layers, too-small text, low contrast). Clearly distinguishable from siblings like measure_text and render_design, which are named as different steps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to run ("before finishing a design"), notes edits already self-report issues, and routes to alternatives: use render_design to confirm an issue, use measure_text to size text before placing it. Covers both when and when-not with named siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_animationRemove motionAInspect
Remove motion from a design: every layer's (no node_ids) or the given layers', all their properties or only tracks (shape also removes a shape morph's outlines). Layers keep their static look and position. Returns the layers cleared. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it to start a layer's motion over before animate; to change one keyframe use edit_keyframes, to replace one property's motion animate with tracks, and to change the length set_timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| tracks | No | Only these properties (all motion of the layers when omitted). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| node_ids | No | The layers to clear. Leave it out to clear every layer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: layers keep their static look and position, the call returns the cleared layers, it is saved as a new revision that undo reverts, and the operation is atomic ('if any part is refused, nothing changes'). The non-destructive framing is consistent with destructiveHint=false while adding real information about side effects and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Lead sentence front-loads purpose and scope; alternative routing is packed into the final sentence. Dense and mostly efficient, though the nested parentheticals make the opening clause take a second read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating the return value. With annotations, atomicity, undo/revision behavior, and sibling routing all covered, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine semantics: omitting `node_ids` clears every layer, omitting `tracks` clears all motion, and the special `shape` value also removes a shape morph's outlines. Only `intent` and the exact track-name vocabulary are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Remove motion from a design') and immediately qualifies scope: all layers or named `node_ids`, all properties or only `tracks`. This is clearly distinguishable from the siblings that also touch motion (animate, edit_keyframes, set_timeline).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Ends with explicit routing: reset a layer's motion before animate, use edit_keyframes to change one keyframe, use animate with tracks to replace one property's motion, and set_timeline to change length. Each alternative is named together with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_designCreate a designAInspect
Start a new design: a blank page of the given size (1080x1080 post, 1080x1350 portrait post, 1080x1920 story, 1920x1080 slide or banner) with a background, white when omitted. Without template_id it starts a new template; with one it becomes that template's next page, sharing its inputs by layer name. Returns page_id, template_id and the size. Use it to start from nothing; to build on an existing design use search_templates, and to copy a page (a carousel slide, another size) use duplicate. Then build the content in one create_layers call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A name for the design ("Untitled" when omitted). | |
| width | Yes | Width in px (1 to 8192). | |
| height | Yes | Height in px (1 to 8192). | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| background | No | The canvas fill: a colour such as "#FFFFFF", a gradient, or "none" for transparent. White when omitted. | |
| template_id | No | Add the design as the next page of this template (a template_id from an earlier create_design) instead of starting a new template. Pages of one template share its inputs by layer name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write (readOnlyHint=false) and non-destructive profile, and the description adds the key side effect not visible elsewhere: omitting template_id starts a brand-new template, while supplying one appends a page that inherits inputs by layer name. It also discloses the return shape (page_id, template_id, size). Minor gap: no mention of limits or errors on bad sizes beyond the schema range.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense passage that is front-loaded with purpose, then sizes, then template semantics, then return values, then routing. Every clause carries information, though the run-on sentence structure makes it slightly harder to scan than a short bulleted layout would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description states what is returned, covers the template-vs-new-template branch fully, and tells the agent what to do next. An agent can call this correctly without consulting anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value by mapping width/height to concrete output formats (1080x1080, 1080x1350, 1080x1920, 1920x1080) and by stating the background default ('white when omitted'). It does not add meaning for the required 'intent' parameter, which the schema already explains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Start a new design') and immediately pins down scope with named size presets. It explicitly contrasts itself with the two siblings an agent would confuse it with (search_templates for existing designs, duplicate for copying a page).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('start from nothing'), names the two alternatives and the conditions that select them ('build on an existing design', 'copy a page - a carousel slide, another size'), and states the follow-up step ('build the content in one create_layers call'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_layersCreate layersAInspect
Add layers to a design in one call: frames, groups, text, rectangles, ellipses, lines, images (a workspace image key or an https URL) and vectors (SVG path data), nested with children. Frames with a flow arrange their children in a row or column, so build text stacks and button rows as flows instead of placing each line by hand. parent_id adds inside a frame, index sets the paint position, and replace swaps the layer with the same id in place. Returns the new layer ids and the layout_issues this call caused (overflow, overlap, text off the page). Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for new layers; change existing ones with update_layers, bring in SVG artwork with import_svg, and copy whole pages with duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Position among the parent's children (front-most last); end when omitted. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| layers | No | ||
| page_id | Yes | The page to work on, as returned by create_design. | |
| preview | No | Also return a preview picture of the result. Use it only when you need to see the design (the finished build, visual fixes); leave it off for empty frames and structural steps. | |
| replace | No | A layer in `layers` whose `id` exists replaces that layer and its children in place, keeping the id. | |
| parent_id | No | Frame or group to add into; the scene when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give the safety profile (destructive=false, openWorld=true), and the description adds substantive behavior beyond that: returns new layer ids plus layout_issues, saved as a new revision that undo reverts, and atomicity ('if any part is refused, nothing changes').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and layer types, then usage patterns, then semantics, then alternatives. Dense but nearly every clause earns its place; the flow-building tip and layout_issues note are practical. Slightly long single paragraph but well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex creation tool with a large schema, no output schema, and open-world annotations, the description covers return values (layer ids, layout_issues), atomic failure, undo/versioning, and sibling routing – everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so params are largely documented. Description still adds value by explaining `parent_id` (adds inside a frame), `index` (paint position), `replace` (swaps layer with same id in place), and the `children`/`flow` relationship in prose. Slightly reinforces rather than exceeding the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Add layers to a design in one call') and enumerates the layer types supported plus nesting via `children`. Clearly distinguishes itself from update_layers, import_svg, and duplicate by naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes: 'Use it for new layers; change existing ones with update_layers, bring in SVG artwork with import_svg, and copy whole pages with duplicate.' Also gives positive patterns (build text stacks as flows). Nothing left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_layersDelete layersADestructiveInspect
Delete layers from a design, with everything inside them and their motion. Returns the deleted layer ids (and any skipped with skip_missing). If one id is not on the design the call is refused and nothing is deleted. Saved as a new revision: undo brings the layers back, but only until the next change is undone past. Use it to remove layers the design no longer needs; to hide one for now set visible: false with update_layers, and to remove a whole page use delete_page.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | The layers to delete (ids from get_design); everything inside them goes too. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| skip_missing | No | Skip ids that are no longer on the design instead of refusing the call; the result lists them in `skipped`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: it returns deleted layer ids and skipped ids, refuses the call atomically if any id is missing unless skip_missing is set, and saves as a new revision with limited undo semantics. These details let an agent understand destructive impact, failure modes, and reversibility even though destructiveHint is already true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is dense but well organized: purpose first, then return and failure behavior, then revision/undo implications, then alternatives. Every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, it supplies the missing context an agent needs: return values, atomic refusal behavior, skip_missing handling, revision/undo scope, and sibling alternatives. Nothing important appears missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful semantics about transactionality: one missing id refuses the whole call and nothing is deleted, and skip_missing changes that behavior by routing missing ids into skipped. It also reinforces that ids refer to layers from get_design and that nested contents are deleted with them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: delete layers from a design, including their contents and motion. It also distinguishes this from update_layers (hide) and delete_page (whole page), so an agent can choose it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: to remove layers the design no longer needs. It also names concrete alternatives for adjacent needs, including visible: false with update_layers for hiding and delete_page for page removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_pagesDelete pagesADestructiveIdempotentInspect
Delete one or more pages of a template, with their layers and motion. Every page is checked before any is deleted: an unknown id, or a call that would delete every page of a template (a template keeps at least one), refuses the whole call and nothing is deleted. Deleted pages cannot be brought back, not even with undo; confirm with the user first. Returns the deleted page_ids and their template_ids. Use it to remove sizes or variants the user no longer wants; to remove layers inside a page use delete_layers.
| Name | Required | Description | Default |
|---|---|---|---|
| page_ids | Yes | The pages, from list_pages or create_design. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive and idempotent annotations, the description discloses atomic validation behavior: unknown ids or attempts to delete all pages cause the whole call to be refused. It also states irreversibility, that undo cannot recover deleted pages, and what identifiers are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the operation and scope, followed by critical safety constraints and routing to an alternative. Every sentence adds useful information for a destructive tool without unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description covers the essential context: what is deleted, atomic failure behavior, irreversibility, confirmation requirements, return identifiers, and the relevant alternative tool. Nothing needed to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, including the page_ids array constraints and source guidance from list_pages or create_design. The description reinforces the one-or-more semantics and validation behavior around page_ids but does not add format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: deleting one or more template pages along with their layers and motion. It clearly distinguishes the operation from delete_layers, which handles layers inside a page, so an agent can select the correct sibling without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for removing sizes or variants the user no longer wants, and directs layer removal to delete_layers. It also adds the important prerequisite to confirm with the user first because deletion is irreversible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_guideDesign guideARead-onlyIdempotentInspect
Return the designer's guide as text (a few thousand words): how designs, pages, layers and templates fit together, the build-check-fix loop, placing layers with layout flows, exact numbers, motion, and going from a design to a batch of images. Read-only and free. Read it once before the first design in a conversation and follow it over your own defaults; it is the source of truth for these tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered; the description's 'Read-only and free' largely restates that. What it genuinely adds is the output size expectation ('a few thousand words'), which matters for context budgeting, and its precedence over built-in defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the first front-loads what is returned and its contents, the second front-loads the behavioral instruction. The topic list is dense but every clause maps to a distinct subject area an agent might need to know exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema and annotations covering safety, the remaining unknowns are output shape and size — both stated ('as text', 'a few thousand words'). Nothing an agent needs in order to decide to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly signals it is a parameterless retrieval call rather than hinting at hidden arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb and resource ('Return the designer's guide as text') followed by an enumeration of the exact topics covered: designs/pages/layers/templates, the build-check-fix loop, layout flows, numbers, motion, and batching. The closing clause marks it as the authoritative reference for the sibling design tools, so an agent can place it relative to create_design, place_items, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit timing rule: 'Read it once before the first design in a conversation', which also implies the negative case (don't re-read repeatedly). It further resolves conflicts by instructing the agent to follow the guide over its own defaults when they disagree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicateCopy pagesAInspect
Copy pages into the same or a new template. Each copy keeps its layers, layer ids, names, motion and input descriptions, and never replaces a page or a template. Returns the template_id and each copy's page_id and name. With template_id, the copies are added to that template (it can be the pages' own template). Without template_id, a new template is made and the first copy is its first page. To copy a whole template, give all its pages from list_pages. With width and height, each copy gets that page size, and the flows and constraints place its layers again: render the copy and adjust it for the new size. Use it for the slides of a carousel (then restyle them together with update_layers page_ids) and for other sizes of a finished design; to add an empty page use create_design with template_id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The new template's name (default: the source template's name with "copy"). | |
| width | No | Page width of each copy in px, with height. | |
| height | No | Page height of each copy in px, with width. | |
| page_ids | Yes | The pages to copy, in order (their page_ids from list_pages or create_design). | |
| template_id | No | Add the copies to this template. Leave it out to make a new template. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false), the description discloses what is preserved (layers, layer ids, names, motion, input descriptions), a key safety guarantee ("never replaces a page or a template"), and the return payload (template_id, each copy's page_id and name). It also warns that width/height re-place flows and constraints so the copy must be rendered and adjusted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and preservation guarantees are front-loaded, and each subsequent sentence covers a distinct branch or use case. It is slightly long, with the return-value sentence placed before the template_id/width branches, but no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description supplies the return values itself. With 5 parameters, one required, and a conditional mutation with layout side effects, the description covers naming defaults, template targeting, sizing consequences, and follow-up steps — enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds real meaning on top by explaining the consequence of omitting template_id (a new template is created and the first copy becomes its first page) and of supplying width/height (layout is re-flowed, requiring render and adjustment). It also clarifies how to use page_ids to copy an entire template via list_pages.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ("Copy pages") plus the scope choice (same or new template), and the body explains what is preserved and what is never touched. It is clearly distinguishable from siblings like create_design, update_layers, and list_pages, which are named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names explicit use cases (carousel slides, alternate sizes of a finished design) and explicit alternatives ("to add an empty page use create_design with template_id", restyle carousel slides "with update_layers page_ids"). It also explains the branching condition that selects behavior: with vs. without template_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_keyframesEdit single keyframesAInspect
Tune existing motion one keyframe at a time: add a keyframe, move one in time, change its value or easing (or hold), delete one, or shift a layer's whole motion earlier or later. Keyframes are found by track and time (read them with get_design timeline_detail); a delete that empties a track removes it. Returns what was edited. If one edit cannot apply, none do; saved as a new revision that undo reverts. Use it for small timing and value fixes; to replace a whole track use animate with tracks, and to remove motion clear_animation.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | Changes applied in order; if one cannot apply, none do. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing atomicity ('if one edit cannot apply, none do'), revision/undo semantics ('saved as a new revision that undo reverts'), and the side effect that deleting the last keyframe on a track removes the track. That side-effect disclosure matters given destructiveHint=false, and the undo guarantee justifies the non-destructive claim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense with no filler: the operation list comes first, then lookup method, then invariants, then sibling alternatives. The opening sentence is a long run-on enumeration, but every clause carries a distinct fact an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers atomicity, undo/revision, track cleanup, lookup path, and sibling alternatives for a mutation tool with 3 top-level params and deep nested schemas. The return value is only glossed as 'returns what was edited', which is thin given there is no output schema, but it's a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the KeyframeEdit oneOf already documents each op, the `at` millisecond match, `by`/`from` for shift, and value units. The description's 'keyframes are found by track and time' largely restates the schema's own wording, so it adds little parameter-level meaning beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (tune/edit) and enumerates the concrete operations: add a keyframe, move it in time, change value/easing/hold, delete, or shift a layer's whole motion. It also distinguishes itself from siblings animate and clear_animation, so an agent can tell what this tool is for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use it for small timing and value fixes; to replace a whole track use animate with tracks, and to remove motion clear_animation.' It also tells the agent to read current keyframes via get_design timeline_detail before editing, covering the prerequisite step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_structureRearrange layersAInspect
Change a design's layer tree with a list of ops, applied in order: move layers to another parent or position, duplicate, wrap siblings in a group or a flow frame, mask, combine shapes with a boolean (union, subtract, intersect, exclude), unwrap, scale with everything inside, reorder, align and distribute. Nothing is deleted here: removing layers is delete_layers. Returns the created and moved layer ids. If one op cannot apply the whole call is refused and nothing changes, unless skip_missing skips layers that are gone. Saved as a new revision that undo reverts. Use it for structure; for a layer's own properties use update_layers, and for new layers create_layers.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | ||
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| skip_missing | No | Skip ids that are not on the scene in move, delete and unwrap ops instead of failing the whole call; the result lists them in `skipped`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: operations apply in order, one failing op refuses the whole call (atomicity), skip_missing relaxes that for missing ids, and the result is saved as a new revision that undo reverts. It also states the return payload (created and moved layer ids). Slightly below 5 only because it doesn't say what is required to call it (e.g. that page_id must come from create_design, which the schema covers).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the op vocabulary, then constraints, return value, failure mode, and sibling routing. The op enumeration is long for one sentence but each item is functional; nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive-free but mutating batch tool with no output schema, it covers returns, atomic failure, skip behavior, reversibility via undo, and sibling boundaries. A minor gap is not describing ordering constraints between ops within a single call (e.g. how index interacts with later ops).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the nested StructureOp variants are richly documented, so the baseline is already high. The description still adds meaning by explaining that ops are applied in order and that skip_missing changes failure semantics for missing layers, though it leaves page_id and intent to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a design's layer tree') and then enumerates the actual operations (move, duplicate, wrap, mask, boolean, unwrap, scale, reorder, align, distribute), which is far more specific than the title 'Rearrange layers'. It also distinguishes itself from three siblings by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Nothing is deleted here: removing layers is delete_layers', 'for a layer's own properties use update_layers', 'for new layers create_layers'. The closing 'Use it for structure' summarizes when to reach for it versus the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_imagesFind imagesARead-onlyIdempotentInspect
Images in this workspace (photos, logos, product shots), newest first, or those whose file name contains search or that are in a collection, with a numbered preview sheet to see them. Without filters the reply also names the workspace's collections: when the user says where their images are ("the Diwali photos"), look in that collection. Each image comes with its image key, the key a design places it by, its asset_id, the id the same image has in batch rows, and its name and pixel size. The preview sheet is one numbered picture of the results; image bytes are not returned. Read-only. Use it to find images already in the workspace; to bring in the user's own files use upload_images. Place one with create_layers type: "image" (or image in a fill) and name the layer by role ("Product photo").
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | At most this many images (default 6). | |
| search | No | Only images whose file name contains this. | |
| collection | No | Only images in this collection (its name). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior. The description adds useful operational context: newest-first ordering, a numbered preview sheet, no image bytes returned, and the fields each result includes (image key, asset_id, name, pixel size).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, and the later sentences provide useful routing and return-value context. It is somewhat long and dense, but most of the detail earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read-only lookup tool with no output schema, the description is complete enough: it explains filtering, ordering, return shape, preview behavior, and how the tool relates to sibling tools for uploading and placing images.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines all three parameters. The description restates the search and collection filters, and adds useful collection-name context, but does not add syntax or semantics for the limit parameter beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (images in the workspace), supported filters, ordering, and preview behavior. It clearly distinguishes finding existing images from uploading files and from placing images with create_layers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (find images already in the workspace) and names the alternative for bringing in user files (upload_images). It also explains how to use collections when the user refers to where their images are, and how to place a found image with create_layers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_designRead a designARead-onlyIdempotentInspect
Read a design's layers after layout: id, type, name, box [x, y, w, h] in design px, text, colours, layout flow and each layer's etag, plus the fonts used. Read-only. Use it before changing a design, for the layer ids update_layers and edit_structure take; to see the design use render_design, and to find problems check_layout. compact shortens the reply, node_id with depth reads one branch, time gives positions at a moment of the motion, with_preview adds a small picture, and timeline: true adds what moves on each layer and when (with node_id, its keyframes).
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | ||
| depth | No | Levels of children to include (all when omitted). | |
| intent | No | Optional: a few words on why. | |
| compact | No | A shorter reply, to look rather than edit. | |
| node_id | No | Describe only this layer and what is inside it. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| timeline | No | Also return the timeline: length, still time, choreography and what moves on each layer and when; with node_id, that layer's keyframes [time, value]. | |
| with_preview | No | Also return a small picture of the scene (at `time`, default 0). | |
| timeline_detail | No | Like timeline, with keyframes as {t, value, easing, hold} to tune with edit_keyframes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured fields. The description contributes additional behavioral context beyond that: `compact` yields a shorter look-only reply, `with_preview` adds a picture, and `timeline: true` adds motion/keyframe data. It doesn't discuss response size or performance limits for large designs, which keeps it just below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It front-loads what the tool returns before usage guidance and parameter notes, so the most important information comes first. The final sentence packing five parameters is dense but each clause carries distinct information; slight length is the only deduction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description bears the burden of describing return values, and it does so thoroughly (field list plus preview/timeline variants). For a 9-parameter read tool, an agent has everything needed to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already high at 89%, so the baseline is 3. The description goes further by explaining combinations the schema states only per-parameter: `node_id` with `depth` reads one branch, `time` gives positions at a moment of the motion, and timeline with node_id returns that layer's keyframes. That relational semantics is genuine added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Read a design's layers after layout') and then enumerates the returned fields (id, type, name, box, text, colours, etag, fonts), which tells an agent exactly what this tool produces. It is clearly distinguishable from render_design (visual output), check_layout (problem finding), and update_layers/edit_structure (mutations).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Use it before changing a design, for the layer ids update_layers and edit_structure take') and names three alternatives with the conditions that select them: render_design to see the design, check_layout to find problems. This is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workspaceThe connected workspaceARead-onlyIdempotentInspect
Return the Kalpana workspace this connection designs in, chosen when the user connected: its id, name and slug, whether its organization has an active subscription (designing needs one), and allowed_image_domains, the hosts an image URL may come from (subdomains included). Read-only. Call it when you need the workspace's name for the user, when a tool says a subscription or credits are missing, or before placing an image from a URL: a URL on another host is refused, so tell the user to add the domain in Workspace Settings > Domain Whitelisting, or to upload the image with upload_images. Every other tool already works in this workspace and takes no workspace id; to design in another workspace the user reconnects and chooses it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent, and the description mostly restates "Read-only", but it adds real behavioral context: designing requires an active subscription, image URLs from non-whitelisted hosts are refused, and other tools implicitly use this same workspace. The remediation path (Workspace Settings > Domain Whitelisting) is genuinely useful failure-handling guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is one dense paragraph rather than a bulleted structure, but it is front-loaded with the return payload and then the when-to-call guidance. Nearly every sentence carries actionable information; only the bare "Read-only." clause duplicates annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description takes on the full burden and discharges it: it describes the return contents, the subscription prerequisite, the image-domain constraint and its workaround, and the workspace-switching model.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the schema baseline is 4. The description reinforces this by explaining that no workspace id is passed and that switching workspaces requires a reconnect rather than a parameter, which preempts a likely agent mistake.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return the Kalpana workspace this connection designs in") and enumerates the returned fields (id, name, slug, subscription status, allowed_image_domains), which makes it immediately distinguishable from siblings like get_design or list_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three explicit trigger conditions (need the workspace name, a tool reports missing subscription/credits, before placing an image from a URL) plus explicit alternatives: upload_images for images on unlisted hosts, reconnecting to switch workspaces, and the note that no other tool takes a workspace id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_svgImport an SVGAInspect
Add an SVG (icon, logo, illustration) as editable vector layers inside one new group, from its markup in svg: paths, rectangles, circles, lines and polygons with their fills, strokes, linear and radial gradients and transforms. Each becomes a group named from its id, data-name or inkscape:label, and each shape keeps its name, so update_layers select and animate can find them. Text, images, masks, clips, filters and are skipped and listed in skipped: add text with create_layers and photos as image layers. Returns the group and every layer made. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for artwork drawn elsewhere; for exact geometric shapes use shape_path.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge in px relative to the parent (centred when omitted). | |
| y | No | Top edge in px relative to the parent (centred when omitted). | |
| svg | No | The SVG markup. | |
| name | No | Name of the group the shapes go into ("SVG" by default). | |
| width | No | Width in px to scale to, keeping the aspect ratio. Default: the SVG's own width, shrunk to fit inside the parent when larger. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| parent_id | No | Frame or group to add into; the scene when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false) and the description adds genuinely useful context: it is saved as a new revision that undo reverts, and it is atomic (if any part is refused, nothing changes), plus what gets skipped and returned in `skipped`. That is meaningful behavioral disclosure beyond the annotations. However, it does not cover permissions/auth requirements or rate limits, so it is solid but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core action and grouped logically (what is imported, what is skipped, return/rollback, alternatives). It is dense but every sentence carries information; the only mild cost is the long single paragraph that compresses several concepts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and 8 parameters, the description covers import behavior, element handling, naming, skip list, return value ("the group and every layer made"), atomicity, and sibling selection. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so individual parameter documentation is already handled. The description adds semantics beyond the schema by explaining how `svg` markup is interpreted — each <g> becomes a group named from its id, data-name or inkscape:label — which tells the agent how to structure input for downstream select and animate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — add an SVG as editable vector layers inside one new group — and enumerates what gets imported (paths, rectangles, circles, gradients, transforms). It also names the sibling it is not (shape_path) for exact geometric shapes, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes usage: "Use it for artwork drawn elsewhere; for exact geometric shapes use shape_path," and redirects text and photos to create_layers and image layers. That gives when-to-use, when-not-to-use, and named alternatives in one pass.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kinetic_typeSet a phrase as kinetic typeAInspect
Add a phrase as kinetic type: words laid out one by one by the real text engine (wrapping at width, words sharing a baseline), with emphasis on chosen words (colour, style, size, tilt, a highlight pill) and motion that gives each word its own path: fly, drop, scatter, pop, wave, glitch, zoom, starting at start with stagger between words; exit_at sends them out. Seeded, so it varies by phrase but repeats exactly. Adds one new group each call and returns its group_id and the block's box and lines. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for animated headlines; for a plain typewriter or word reveal on an existing text layer use animate text_reveal.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Left edge of the block in the parent, px. | |
| y | Yes | Top edge of the block in the parent, px. | |
| name | No | The group's name (default: the text). | |
| seed | No | Varies the scatter and timing; the same seed and text repeat exactly. | |
| text | Yes | The phrase; it is split into words at spaces. | |
| align | No | Line alignment inside `width`: "left" (default), "center" or "right". | left |
| color | No | Hex colour of the words (default #111111). | #111111 |
| start | No | Seconds. | |
| width | Yes | Widest the block may be, px; words wrap onto new lines past it. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| motion | No | How the words arrive (default fly). | |
| exit_at | No | Leave at this second (words fly back out in reverse). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| stagger | No | Seconds between words (default 0.08). | |
| duration | No | Seconds each word takes (default 0.7). | |
| emphasis | No | Words to stand out, each with its own colour, style, size, tilt or highlight pill. | |
| font_size | Yes | Size of every word that is not emphasised, px. | |
| parent_id | No | ||
| strike_at | No | Strike the whole phrase through at this second: a line draws across the words left to right (a "stop doing this" list item). | |
| font_style | No | A style of that family, e.g. "Bold". | |
| font_family | No | A family from list_fonts (default: the library's default sans). | |
| line_height | No | Line height: a multiple of the size (default 1.15), or px when above 4. | |
| strike_color | No | The strike line's colour (default the text colour). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavior: it adds one new group per call, returns its group_id plus the block's box and lines, is saved as a new revision that undo reverts, and is atomic ('if any part is refused, nothing changes'). It also explains seeded determinism and optional exit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, starting with the core action and layout behavior before moving to emphasis and motion. It is appropriately sized for a 23-parameter tool, though it repeats some enum details already present in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the absence of an output schema, the description still covers return values ('returns its group_id and the block's box and lines'), side effects ('Adds one new group each call'), undo behavior, and atomic failure. This is enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 96%, so the input schema already documents nearly all parameters in detail, including seed behavior, motion enum meanings, and emphasis fields. The description reinforces some parameter semantics such as width wrapping, start/stagger timing, exit_at, and emphasis styling, but adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Add a phrase as kinetic type,' and immediately explains the layout engine and word-level motion. It clearly distinguishes this from the sibling alternative 'animate text_reveal' for plain typewriter or word reveal effects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: 'Use it for animated headlines,' and names the alternative for a different case: 'for a plain typewriter or word reveal on an existing text layer use animate text_reveal.' This provides both positive and exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fontsList fontsARead-onlyIdempotentInspect
List the font families a design can use: Kalpana's global library plus the workspace's uploads. A design and its batches load fonts from Kalpana, so a font_family outside this list is refused. Without family it returns every family name; with family it returns that family's styles (style name, weight, italic) when the name matches exactly, else the families whose name contains it, ignoring case. Read-only. Call it before setting font_family or font_style on text, to use a family and style that exist.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | At most this many families (default 200). | |
| family | No | Only families whose name contains this (case-insensitive), e.g. "inter". Each family's styles are listed when 20 or fewer match. | |
| intent | No | Optional: a few words on why. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description's 'Read-only' line is redundant; however it adds real behavioral context an annotation cannot convey: downstream validation rejects families not in this list, and `family` switches the tool from returning family names to returning per-family styles. Pagination/rate behavior is left implicit, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is listed, then the match semantics, then the call trigger — a sensible order with no filler. The 'Read-only.' sentence duplicates the annotation and costs a small amount of space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description still spells out both return shapes: bare family names, or style name/weight/italic entries. Combined with the default-200 limit in the schema, an agent has enough to call and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description earns more by explaining the outcome of `family` (exact match yields that family's styles; otherwise substring matches). One wrinkle: it frames style expansion around exact name match while the schema says styles are listed when 20 or fewer families match, a small inconsistency in the same parameter's behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus scope: 'List the font families a design can use: Kalpana's global library plus the workspace's uploads.' No sibling returns font data, and the global-library-plus-uploads scope makes the boundary unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit call condition ('Call it before setting font_family or font_style on text') and an explicit consequence for skipping it ('a font_family outside this list is refused'). That is when-to-use plus why, with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesList a template's pagesARead-onlyIdempotentInspect
List the pages of a template: each page is a design of its own (a post, a story and a banner of one campaign, say). Returns the template's id, name and description, and each page's page_id, name, size and whether it is animated. Read-only. Use it after search_templates to get the page_id that get_design and the other design tools take; to copy pages use duplicate, and to add an empty page create_design with template_id.
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | The template, from search_templates or create_design. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by listing the returned template and page fields and explaining how pages relate to designs, though it does not discuss errors or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and return shape, then gives concrete workflow guidance and alternatives. Every sentence contributes useful information without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool, the description covers purpose, return values, workflow position, and alternatives to sibling tools. With no output schema, it appropriately explains what is returned, and annotations already cover safety and idempotency.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single template_id parameter is already documented as coming from search_templates or create_design. The description refers to the same sources but does not add format or validation detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List the pages of a template') and immediately clarifies that a page is an individual design within a template. It also distinguishes the tool from siblings by naming get_design, duplicate, and create_design for related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this after search_templates to obtain page_id values needed by get_design and other design tools. It also routes adjacent needs elsewhere: duplicate for copying pages and create_design with template_id for adding an empty page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_shadersList shader fillsARead-onlyIdempotentInspect
List the shader fills a layer can use: procedural dot grids and halftone, grain and mesh gradients, god rays, noise, waves, dithering and more. Without name: every shader with its setting names and preset names. With name: that shader's settings with their defaults, its presets, and whether it needs an image. Read-only. Call it without name to choose a shader, then with name for the one you picked; plain colours, gradients and images need neither. Then set the fill with create_layers or update_layers as {shader, preset, params, speed} (speed: 0 keeps it still).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | One shader's settings with defaults, presets and options. | |
| intent | No | Optional: a few words on why. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description reinforces 'Read-only' while adding substantial context: what each mode returns, that defaults and presets are included, whether an image is required, and how `speed: 0` affects the fill. No annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized: it front-loads the core purpose, then explains modes, safety, workflow, and fill application in sequence. Every sentence contributes actionable information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description compensates by explaining exactly what is returned in each mode. It also covers the end-to-end workflow and mutation path, leaving no significant gap for an agent to call and use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter documentation is already strong. The description adds meaningful semantics beyond the schema by explaining the effect of omitting `name` versus providing it, and by describing what the `name` response contains. The optional `intent` parameter is not elaborated, which keeps this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the shader fills') and immediately clarifies the scope with examples of shader types. The two-mode behavior (without `name` vs with `name`) makes it easy to distinguish from sibling list tools like `list_fonts` or `list_workspaces`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call without `name` to choose a shader, then with `name` for the selected one, and notes that plain colours, gradients, and images need neither. It also points to `create_layers` and `update_layers` for applying the result, covering when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_carouselBuild a 3D card carousel animationAInspect
Add an animated 3D card track inside one design: cards (image, title, subtitle) on a track that steps to the next card every step seconds; the centred card sits flat and its neighbours swing back in 3D (tilt), smaller and shaded. Adds one new group and returns its group_id, track_id and card_ids. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for a product or template showcase in motion; for an Instagram carousel post make one page per slide with duplicate instead.
| Name | Required | Description | Default |
|---|---|---|---|
| y | Yes | Top of the cards. | |
| gap | No | Space between a neighbour's near edge and the centre card's edge; negative tucks it behind (default -2% of the card width, like a hinged panel). | |
| name | No | The group's name (default "Carousel"). | |
| step | No | Seconds each card stays centred before the next (default 0.5). | |
| tilt | No | Degrees the neighbours swing back about their hinge (default 58). | |
| color | No | Title colour (default near-black). | |
| enter | No | Slide the whole carousel up into place just before `start` (default true). | |
| items | Yes | The cards, in order; the first is centred at `start`. | |
| start | No | Seconds: when the first card is centred. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| radius | No | Corner radius of the card (default 6% of its width). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| art_fill | No | Fill of the art panel behind each image (default #F4F4F4). | |
| center_x | Yes | Centre of the focused card, px in the parent. | |
| card_fill | No | Card fill (default white). | |
| parent_id | No | ||
| card_width | No | Card width, px (default 720). | |
| side_scale | No | Neighbours' size relative to the centre card (default 1). | |
| side_shade | No | How much the neighbours fade toward the card colour, 0-1 (default 0.12). | |
| card_height | No | Card height, px (default 940). | |
| font_family | No | A family from list_fonts for the titles and subtitles. | |
| move_duration | No | Seconds the move between cards takes (default 0.35, at most `step`). | |
| subtitle_color | No | Subtitle colour (default #8A8A8A). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it says the tool adds one new group, returns group_id, track_id and card_ids, saves as a new revision that undo reverts, and is atomic if any part is refused. These are exactly the mutation, return, and safety details an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and remains compact for a complex tool. The sentences each carry useful information: behavior, return values, revision/atomicity, and the alternative-use note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 23 parameters, no output schema, and the need to understand mutation behavior, the description is complete enough: it explains what is created, what is returned, undo behavior, atomicity, and when to use a different approach. The remaining parameter details are covered by the high-coverage schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 96%, so the schema already documents nearly every parameter thoroughly. The description gives a useful conceptual gloss on `step` and `tilt`, but it does not add much parameter-level meaning beyond what the schema provides, making the baseline score appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it adds an animated 3D card track inside one design. It names the cards' fields, the stepping behavior, and the 3D effect, so an agent can distinguish this from general animation or layer-creation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the intended use (product or template showcase in motion) and names an alternative for a similar but different need: an Instagram carousel post should use one page per slide with duplicate instead. This gives clear when-to-use and when-to-use-another-tool guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_chartMake a chart from dataAInspect
Draw a chart from numbers as editable layers in a design: line, area, bar, horizontal bar, stacked bar, scatter, donut, pie, sparkline, progress ring, gauge or radar. Every point, bar, tick and label is computed exactly; pick a style, a palette and a font_size, and place it with x, y, width and height. Adds one new group each call and returns its chart_id and facts (ranges, labels dropped for lack of room). Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for any chart instead of drawing bars or lines with shape_path or by hand; to change a chart, delete its group with edit_structure and draw it again.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Where the chart sits in its parent, and its size, px. | |
| y | Yes | ||
| max | No | Progress ring, gauge and radar: the full-scale value (default 100, or radar's largest value). | |
| axes | No | Axis labels, x and y together (default: per style; off for sparklines and rings). `x_labels` and `y_labels` set each side on its own. | |
| dots | No | A dot on each point (default: per style). | |
| grid | No | ||
| kind | No | ||
| name | No | The chart layer's name (default "Chart"). | |
| sizes | No | Scatter: a size per point, making it a bubble chart. | |
| style | No | How it is drawn (default clean). Vary it with the design. | |
| ticks | No | Grid lines (default 4). With both y_min and y_max the lines are exactly (y_max - y_min) / ticks apart. 0 = no grid lines, no y tick labels and no left margin. | |
| width | Yes | ||
| y_max | No | ||
| y_min | No | Fix the value range (default: from 0, or the data's minimum when it is below 0, up to a round number above the maximum). | |
| corner | No | Bar corner radius px (default per style; half the width = pill). | |
| height | Yes | ||
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| labels | No | A label per value along the x axis (per bar, segment or spoke). | |
| legend | No | A key of series names above the plot (default: when 2+ series); on donuts and pies, of the `labels` (default: when given). | |
| prefix | No | ||
| series | Yes | ||
| smooth | No | Curve lines through the points (default: per style). | |
| suffix | No | ||
| page_id | Yes | The page to work on, as returned by create_design. | |
| palette | No | Series colours in order, as hex. Default: a built-in palette. | |
| step_at | No | Step chart: where the level changes between two points. `start` (default) holds a value until the next point, `end` jumps at the first point of each pair, `middle` changes halfway. | |
| decimals | No | Decimal places in value labels (default: 0 for whole data, else 1), or "auto" to print as many as the data and fixed range need. | |
| x_labels | No | The category labels under the plot (default: as `axes`). | |
| x_values | No | Scatter: the x of each point (default 0, 1, 2...). | |
| y_labels | No | The value tick labels left of the plot (default: as `axes`). | |
| bar_width | No | Bar thickness as a share of its slot, 0.1 to 1 (default per style). | |
| font_size | No | Size of every chart label, px (default: the height / 22, at least 24 px, so it reads when the chart is shown small; below about 20 px the result warns). | |
| parent_id | No | Put the chart inside this layer (the scene when omitted). | |
| thickness | No | Ring thickness, px (donut, progress ring, gauge). | |
| grid_color | No | Hex. | |
| line_width | No | ||
| text_color | No | Hex. | |
| annotations | No | Points worth pointing out. | |
| font_family | No | ||
| value_labels | No | Label the last point / the top of each bar / the ring's value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states it adds one new group per call, returns chart_id and facts (ranges, dropped labels), is saved as a new revision that undo reverts, and is atomic — "if any part is refused, nothing changes." That is the exact mutability/rollback context an agent needs for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the capability, then the behavioral contract, then the routing advice. The enumeration of thirteen chart kinds partly duplicates the ChartKind enum, which is minor waste, but nothing is padded or vague.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 40-param mutation tool with no output schema, the description covers what is returned (chart_id, facts), undo/revision semantics, atomicity and the edit path. Remaining gaps are the styling parameters the schema handles, not conceptual omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 40 parameters and 73% schema coverage, the schema already documents most fields. The description only echoes parameters that are already documented (style, palette, font_size, x/y/width/height) rather than illuminating the undocumented remainder (prefix, suffix, line_width, grid, font_family, bare y_max/grid). Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource: "Draw a chart from numbers as editable layers in a design," with the supported chart kinds enumerated. It distinguishes itself from siblings by name (shape_path for hand-drawn bars/lines, edit_structure for modifying).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: "Use it for any chart instead of drawing bars or lines with shape_path or by hand," plus the modification path "to change a chart, delete its group with edit_structure and draw it again." Both the when and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_cursorAdd a cursor that moves and clicksAInspect
Add an animated pointer to a design: an arrow, a named pill or a touch dot that glides through stops ({x, y, t, click}) with eased moves; each click presses it and spreads a ripple. Adds one new group on top of every layer each call and returns its group_id. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it to walk through product UI in a demo, with make_list selections at the same times; to move other layers use animate, and to remove the cursor edit_structure delete.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| size | No | Size of the arrow in px (default 40). | |
| color | No | Cursor colour (default near-black). | |
| label | No | Pill style: the name on it. | |
| stops | Yes | The path: at least one stop; it glides between them. | |
| style | No | ||
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| ripple | No | Ripple colour (default the cursor colour). | |
| page_id | Yes | The page to work on, as returned by create_design. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that each call adds one new group on top of every layer, that the group_id is returned, that the result is saved as a new revision which undo reverts, and that the operation is atomic ('if any part is refused, nothing changes'). This is exactly the kind of layered/undo/mutation context annotations (readOnlyHint=false, destructiveHint=false) cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and sized appropriately for a 9-parameter mutation tool. The first sentence is fairly dense with semicolon-joined clauses, but every clause (motion, click ripple, group layering, revision/undo, atomicity, routing) carries real information, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the return value (group_id) and the undo/revision semantics, and it explains the click animation behavior. Minor gaps remain: the 'name' parameter is unexplained and there's no note on how stop timings relate to the page's timeline length.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 78%, so most of the 9 parameters are already documented, and the description's restatement of the stop shape ({x, y, t, click}) and easing largely duplicates the CursorStop schema. It adds little new syntax or constraint detail beyond what the schema provides, so the baseline 3 applies; 'name' remains undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add an animated pointer to a design') and immediately enumerates the three style variants (arrow, pill, dot) with their motion/click behavior. It is clearly distinguishable from siblings animate, make_list, and edit_structure, which are named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete positive use case ('walk through product UI in a demo, with make_list selections at the same times') and routes the agent elsewhere for adjacent needs ('to move other layers use animate', 'to remove the cursor edit_structure delete'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_listBuild an animated listAInspect
Add rows of UI (a ranked list, inbox, settings, search results) with text and an optional value on the right; rows spring in one after another and a highlight slides from row to row at the select times. static: true builds a still list or table instead. Adds one new group each call and returns its group_id. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for list and table UI; pair it with make_cursor clicks at the same times, and for free text blocks use create_layers.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | Top-left of the list and its width. | |
| y | Yes | ||
| gap | No | ||
| fill | No | Row fill (default white), text colour (default near-black). | |
| name | No | ||
| color | No | ||
| items | Yes | ||
| start | No | Seconds: when rows start arriving, and between rows (default 0.07). | |
| width | Yes | ||
| accent | No | Highlight fill and the text colour on it. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| select | No | The highlight's path: it lands on each row in turn. | |
| static | No | A still list or table (ranked rows, a ledger, an answer key): a column layout flow of row frames, each a row flow with a Label text filling the width and an optional Value on the right. No motion, no highlight (`select`, `start`, `stagger` are refused). Edit rows later with update_layers like any flow. | |
| divider | No | Static lists: a hairline under each row but the last, in this colour (rows then have no fill unless `fill` is given). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| stagger | No | ||
| numbered | No | Number each row (1, 2, 3...), for ranked lists. | |
| font_size | No | ||
| parent_id | No | ||
| row_height | No | Row height px (default 64) and gap between rows (default 10). | |
| accent_text | No | ||
| font_family | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=false and destructiveHint=false; the description adds substantive behavior the annotations cannot convey: one new group per call, its `group_id` returned, saved as a new revision that undo reverts, and all-or-nothing semantics if any part is refused. That atomicity/reversibility disclosure is exactly the context an agent needs before calling a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the animated-vs-static distinction are front-loaded, and no sentence is filler. It is dense and long-sentenced, but each clause (motion, static, atomicity, sibling pairing) carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter mutation with no output schema, the description covers the return value (group_id), the atomic failure mode, and the undo/revision model. Remaining gaps are mostly layout-parameter details already present in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains `select` timing, `static`, and the text/value pairing, but with 22 parameters at 50% schema coverage it leaves much of the surface (x/y/width, fill, accent, divider, stagger, row_height, fonts) to the schema. It adds meaning where it speaks but does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a concrete verb ('Add rows of UI') tied to a clear resource and gives concrete examples (ranked list, inbox, settings, search results). It distinguishes the animated mode from the `static: true` still list/table mode, so an agent can tell exactly what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: use this for list and table UI, pair with `make_cursor` clicks at the same times, use `create_layers` for free text blocks. The `static: true` branch states its own exclusion (no motion, no highlight), which is a real 'when not to use the animated path' rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_particlesScatter a particle fieldAInspect
Add a particle field to a design: many small shapes (dots, rings, sparkles, stars, plus, cross, pills, squares, triangles, blobs) spread by a seed, with no clumps or grid, sizes leaning small, some out of focus, colours from a palette and a box kept clear behind text. Motion: float, twinkle, burst, rain, rise, pop, or still. Adds one new group behind the other layers (in front with front) each call and returns its group_id and count. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it for texture, sparkle and celebration backgrounds; for a few placed shapes use create_layers, and for shapes in a pattern place_items.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The group's layer name (default "Particles"). | |
| seed | No | Same seed, same field. | |
| size | No | Smallest and largest size, px (default 6 to 28). | |
| avoid | No | Keep this box clear (e.g. behind a headline): [x, y, width, height]. | |
| count | Yes | How many, 1 to 400. | |
| depth | No | Share of particles pushed out of focus (bigger, blurred, fainter) for depth, 0 to 1 (default 0.2). | |
| front | No | Put the field on top of everything (default: behind the other layers). | |
| start | No | Seconds: when the motion starts (default 0). | |
| until | No | Seconds: when floating stops (default start + duration + 4, so the field doesn't stretch a short scene). The scene timeline grows to it. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| motion | No | ||
| origin | No | Burst: the point they fly out from, in the parent (default the region's centre). | |
| region | Yes | The area they live in (px in the parent): [x, y, width, height]. | |
| shapes | No | Which shapes, mixed (default dot, ring, sparkle). | |
| opacity | No | Lowest and highest opacity (default 0.5 to 1). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| palette | No | Series colours in order, as hex. Default: a built-in palette. | |
| duration | No | Seconds: how long the arrival takes (burst, rain, pop; default 1.2), or the whole drift (rise). | |
| strength | No | How far they drift, px (default 14). | |
| parent_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a non-destructive, non-open-world write. The description adds substantial context beyond that: one new group per call placed behind other layers (or in front with `front`), returns group_id and count, saved as a new revision that undo reverts, and atomic semantics ('if any part is refused, nothing changes'). That is exactly the behavioural detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then layering/return/revision semantics, then sibling routing — a sensible order. It is dense and long (two packed sentences), but nearly every clause conveys non-obvious behaviour; only the long parenthetical shape list is slightly redundant with the enum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter generative tool with no output schema, the description still tells the agent what comes back (group_id and count), where the output sits in the layer stack, how revisions/undo work, and when to pick a different tool. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 90%, so the baseline is 3, but the description adds meaning beyond the fields: seed determinism ('spread by a seed, with no clumps or grid'), size leaning small, some particles out of focus for depth, palette-driven colour, and the avoid box for text legibility. The motion enum is described in prose rather than typed as an enum, and the interaction between `until` and a short scene is notable added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Add a particle field to a design') and enumerates the shape, colour, depth and motion vocabulary it controls. It also names what it is not, pointing to create_layers and place_items, so the agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given: 'Use it for texture, sparkle and celebration backgrounds; for a few placed shapes use create_layers, and for shapes in a pattern place_items.' Both the when-to-use case and the two alternatives with their selecting conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_transitionAdd a graphic transitionAInspect
Add a graphic transition: shapes that cover or reveal the whole design in one of four styles (circle, stripes, blades, burst). part: out ends fully covered at at + duration; part: in starts covered and uncovers. Adds one new group on top of every layer each call (it never replaces one) and returns its group_id. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it to hide a cut between scenes of a multi-scene animation; to move between slides use set_choreography flow, and to fade one layer animate.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | Seconds: when it starts. For `out`, usually the scene's end minus `duration`; for `in`, 0. | |
| name | No | ||
| part | No | ||
| size | No | The scene's size [width, height] (default 1920 x 1080). | |
| angle | No | Stripes: the tilt in degrees (default -18). | |
| count | No | Stripes: how many (default 5); burst: how many rays (default 14). | |
| style | No | ||
| colors | No | The layers of colour, first to last (the last is what the screen is covered by at the cut). Default: a built-in palette. | |
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| origin | No | Where circles and bursts start: [x, y] (default the centre). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| duration | No | Seconds (default 0.6). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-readonly, non-destructive, closed-world. The description goes well beyond: each call adds one new group on top of every layer and never replaces one, the result is a new revision that `undo` reverts, and the operation is atomic ('if any part is refused, nothing changes'). That is precisely the mutation context an agent cannot infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then sibling routing, and every sentence carries information. The single long middle sentence packs several distinct facts (group stacking, group_id, revision/undo, atomicity), which is dense but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description covers the missing pieces an agent needs: return value (`group_id`), stacking behavior, reversibility via `undo`, and failure semantics. Nothing required to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the enum docs are already strong, so the baseline is 3. The description adds real value by explaining the timing contract for `part` (out ends covered at `at + duration`, in starts covered and uncovers) and by disclosing that a `group_id` is returned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a graphic transition') and immediately enumerates the four styles (circle, stripes, blades, burst), so an agent can differentiate this from `animate` or `set_choreography` without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says what it is for ('hide a cut between scenes of a multi-scene animation') and names the two alternatives with their conditions: `set_choreography flow` for slides, `animate` for fading one layer. This is exactly the when/when-not routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_textMeasure textARead-onlyIdempotentInspect
Measure text as the renderer lays it out: each line and its width, the height, and whether the last line is a widow; or, with width and fit_height, the largest font size that fits that box. With page_id and layer_id it measures that text layer as styled. texts measures many at once, and pack lays them out as chips in rows and returns each chip's box. Read-only; it changes nothing. Use it before placing or sizing text instead of guessing; for text already overflowing in a design use check_layout.
| Name | Required | Description | Default |
|---|---|---|---|
| pack | No | With `texts`: lay them out as pills or chips packed in rows with no overlaps, and return each one's box (x, y, width, height) ready for create_layers. | |
| runs | No | Text in differently styled runs, as create_layers takes them (mixed families or weights), in place of `text`. | |
| text | No | The text to measure (or give `texts`). | |
| wrap | No | Line breaks as create_layers `wrap` sets them: "normal", "balance" or "pretty" (a stored layer keeps its own unless given). | |
| texts | No | Measure many texts in one call (same font, size and width); the result lists each one's width, height and lines. | |
| width | No | Wrap within this width (px); one line when omitted. | |
| intent | No | Optional: a few words on why. | |
| page_id | No | The page to work on, as returned by create_design. | |
| layer_id | No | ||
| max_size | No | ||
| min_size | No | ||
| font_size | No | Measure at this size (px). | |
| fit_height | No | Instead of measuring, find the largest size in [min_size, max_size] whose text fits `width` x `fit_height`. | |
| font_style | No | "Regular", "Bold"... | |
| font_family | No | ||
| line_height | No | line_height like create_layers ("120%", "auto", or px). | |
| letter_spacing | No | letter_spacing like create_layers: px number or a percentage of the font size like "-3%". | |
| min_last_line_words | No | Fewest words a wrapped paragraph may end on, as create_layers takes it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: measurement follows renderer layout, reports line widths/height/widow status, can search for the largest fitting font size, treats page/layer text as styled, and returns chip boxes for `pack`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core measurement purpose and then adds modes and alternatives efficiently. It is dense but nearly every clause carries useful routing or behavior information; the read-only reminder is slightly redundant with annotations but reinforces safety.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 18-parameter, nested-schema tool with no output schema, the description explains the main operational modes and enough about returned values (line widths, height, widow status, chip boxes) to call it correctly. Remaining gaps around some styling parameters are largely covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 78%, so many parameters are already documented structurally. The description adds meaningful mode semantics for central parameters, especially `width` with `fit_height`, `texts`, `pack`, `page_id`/`layer_id`, and `runs`, though it does not explain every lower-level styling parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'measure' with the resource 'text' and clearly distinguishes its modes: line measurement, fit-to-box sizing, styled-layer measurement, batch `texts`, and chip `pack` layout. It also explicitly contrasts itself with `check_layout` for overflowing existing text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives direct guidance to use the tool before placing or sizing text instead of guessing, and names `check_layout` as the alternative for text already overflowing in a design. The mode-selection conditions for `width`/`fit_height`, `texts`, and `pack` are also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_itemsCompute positions for itemsARead-onlyIdempotentInspect
Compute where N items go: around a circle, along an arc, in a grid, evenly along a line or a path. Returns places in item order: each item's centre, its top-left x and y for an item of item_size, and the rotation in degrees that faces along the layout. Free and read-only; it places nothing itself. Use it for radial menus, timelines and grids, then pass the positions to create_layers; for a single value use calculate, and for the outline of a shape shape_path.
| Name | Required | Description | Default |
|---|---|---|---|
| count | Yes | How many places. | |
| intent | No | Optional: a few words on why. | |
| layout | Yes | The shape to place them on, e.g. `{kind: "circle", center: [540, 540], radius: 300}`. | |
| item_size | No | The items' size [width, height], to also get each top-left x/y. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations by explaining that it 'places nothing itself' and by describing the returned `places` structure: centre, top-left x/y for `item_size`, and rotation in degrees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then the return shape, then usage guidance and alternatives. Every sentence earns its place, with no redundant or bloated language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested `layout` schema, the 4 parameters, and the absence of an output schema, the description is complete enough: it explains what is computed, what is returned, that nothing is mutated, and which sibling tools to use instead. No critical information is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already does the heavy lifting for parameters like `count`, `layout`, and `item_size`. The description still adds meaning by tying `item_size` to the returned top-left x/y values and by naming the supported layout shapes, giving the agent additional semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: compute positions for N items across specific layout types (circle, arc, grid, line, path). It clearly distinguishes this tool from siblings by naming create_layers, calculate, and shape_path as related alternatives, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool ('radial menus, timelines and grids'), what to do with the result ('pass the positions to create_layers'), and when to choose alternatives ('for a single value use calculate, and for the outline of a shape shape_path'). This is exactly the routing 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.
rename_pageRename a pageAIdempotentInspect
Rename one page of a template. Any edits to the design not yet saved are saved first; then the page takes the new name, which shows in Kalpana and in batches. Returns the page's page_id and new name; rename again to change it back. Use it to tell the pages of a template apart ("Story", "Banner"); to name the template itself use set_template_info.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The new name. | |
| page_id | Yes | The page, from list_pages or create_design. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing a non-obvious side effect: unsaved design edits are committed before the rename, and the new name propagates to Kalpana and batches. Annotations already cover safety and idempotency, so this added context is the right kind of contribution. It stops short of covering failure modes such as an unknown page_id or a duplicate name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and resource, then adds side effects and the sibling alternative; no filler sentences. The return-value sentence is slightly redundant but justified because no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully states the return shape (page_id plus new name) and the persistence behavior. Errors, name-collision handling, and permission requirements remain unstated, which is the one meaningful gap for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both page_id ("from list_pages or create_design") and name. The description adds only the downstream meaning of the name (it appears in Kalpana and batches), not syntax, length, or formatting constraints. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: "Rename one page of a template." It also explicitly delimits itself from set_template_info, so an agent can distinguish it from the sibling that names the template itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use case (telling pages apart, e.g. "Story", "Banner") and names the alternative tool for the adjacent task (set_template_info for the template's own name). It also notes reversibility ("rename again to change it back"), which covers the undo path without pointing at the undo sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_contact_sheetRender frames of an animationARead-onlyIdempotentInspect
Frames of the design's animation tiled into one PNG, left to right and top to bottom: evenly spaced frames from start to end, or exact times. One call checks a whole animation; a design without a timeline gives one frame. Returns the times shown. For one moment at full size use render_design with time. Previews are PNGs at most 800 px on the longest side, with a faint repeating "Kalpana preview" mark. The mark is only on previews; the design, its exports and batch renders do not have it, and sample_points read the design's own colours. Zoom with region or node_id to check small text or detail.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Last second (default the end of the timeline). | |
| start | No | First second (default 0). | |
| times | No | Exact seconds to show instead of `frames` (1 to 32). | |
| frames | No | How many frames, evenly spaced from `start` to `end` (default 12, at most 32). | |
| intent | No | Optional: a few words on why. | |
| columns | No | Frames per row (default 4, at most 8). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| cell_width | No | Width of each frame in px (default and at most 320). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, and the description still adds non-obvious behavior: PNG previews capped at 800 px on the longest side, a repeating "Kalpana preview" watermark that applies only to previews and not to the design/exports/batch renders, and that sample_points reads true colours. These are exactly the caveats an agent needs when interpreting output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it produces and how frames are chosen, then routing guidance, then caveats. Every sentence carries information, though the watermark sentence runs long and the trailing region/node_id zoom tip adds a clause that doesn't map to any actual parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating the return value ("Returns the times shown"), the preview resolution cap, and the watermark caveat. For an 8-parameter render tool with full schema coverage and read-only annotations, nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter and the baseline is 3. The description adds genuine relational meaning — that `frames` are evenly spaced between `start` and `end` while `times` overrides that with exact seconds — but it also tells the user to "Zoom with region or node_id", which are not in the input schema, creating mild ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and artifact: animation frames tiled into one PNG, read left-to-right/top-to-bottom, driven by frames/start/end or exact times. It also explicitly separates itself from render_design (single moment at full size) and implicitly from render_timeline, so an agent can choose without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"One call checks a whole animation; a design without a timeline gives one frame" states the use case and the degenerate case, and "For one moment at full size use render_design with time" names the alternative and the condition selecting it. When-to-use and when-to-use-something-else are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_designRender a designARead-onlyIdempotentInspect
A PNG of the design, rendered as it will export. Check the work with it after each meaningful change. Zoom with region or node_id, read pixel colours with sample_points, or judge shapes with hide, only and mode; time shows one moment of an animation. For layout problems as data use check_layout; for many moments of an animation use render_contact_sheet. Previews are PNGs at most 800 px on the longest side, with a faint repeating "Kalpana preview" mark. The mark is only on previews; the design, its exports and batch renders do not have it, and sample_points read the design's own colours. Zoom with region or node_id to check small text or detail.
| Name | Required | Description | Default |
|---|---|---|---|
| hide | No | Hide these layers for this picture only (the design is unchanged). | |
| mode | No | "color" (default), "grey" for a value study, or "silhouette" to judge a shape's read (use with `only`). | |
| only | No | Show only these layers (with their children) for this picture. | |
| time | No | Second of the animation to show (default 0). See render_contact_sheet for many moments in one picture. | |
| sizes | No | Several pictures in one call, each with this longest side in px (1 to 4 values, each at most 800), in place of max_size. | |
| intent | No | Optional: a few words on why. | |
| region | No | Zoom into this part: [x, y, width, height] in design px. | |
| node_id | No | Zoom into a layer: its laid-out box grown by `padding`. | |
| padding | No | Space around `node_id`'s box in design px (default 24). | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| regions | No | Several close-ups in one call: each [x, y, width, height] in design px. Combines with `node_ids`; 4 pictures at most, each `max_size`. | |
| max_size | No | Longest side of the picture in px (default and at most 800). Zoom with region or node_id for detail. | |
| node_ids | No | Several layers to zoom into, one picture each (box grown by `padding`). | |
| sample_points | No | Points [x, y] in design px whose colour to read; returned as {x, y, hex, alpha}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, but the description adds real behavior an agent cannot get elsewhere: 800 px cap, preview watermark 'Kalpana preview', and the crucial caveat that the mark is preview-only while sample_points read the design's own colours. That last point prevents a serious misreading of sampled colours.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the deliverable and the watermark caveat, and every sentence is informative. Minor redundancy: 'Zoom with region or node_id' is stated twice, once mid-paragraph and again as the closing sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-param render tool with no output schema, the description covers return format (PNG), size ceiling, watermark presence and absence, colour-read caveat, and routing to the two sibling tools. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes further by stating the purpose of parameter groups: region/node_id for zooming into small text, sample_points for pixel colours, hide/only/mode for judging shapes, and time for one animation moment. It does not touch sizes/regions/node_ids batch params, which rely on schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — 'A PNG of the design, rendered as it will export' — which immediately tells an agent what it gets back. It then distinguishes itself from the two nearest siblings by naming check_layout (layout as data) and render_contact_sheet (many animation moments).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit cadence ('Check the work with it after each meaningful change') and explicit exclusions with named alternatives: 'For layout problems as data use check_layout; for many moments of an animation use render_contact_sheet.' No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_timelinePicture of the timelineARead-onlyIdempotentInspect
A PNG picture of the timeline as a diagram, not a frame of the design: a time ruler, a row per animated layer with a bar over its motion, and under it a row per property with keyframe diamonds; where the motion ends is marked. Check timing and overlap here, then get_design timeline with node_id for the keyframes to change. node_ids limits it to layers; properties: false shows layer rows only.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | No | Optional: a few words on why. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| node_ids | No | Only these layers (or groups, with what is inside). | |
| properties | No | A row per property under each layer (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing what the returned artifact actually depicts and clarifying that it is a diagram rather than a rendered frame, which prevents a common misread. It omits any detail on image resolution, size, or how the PNG is delivered, which keeps it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: the core identity ('PNG picture of the timeline as a diagram') and the disambiguation come first, followed by what is drawn, then routing and parameter hints. The sentence about diagram contents is long and semicolon-heavy but every clause carries distinct information, so it earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return value and does so well by listing the diagram's visual elements. Together with the parameter hints and the follow-up routing to get_design, an agent has enough to call this correctly; only the delivery format and image dimensions of the PNG are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning beyond the schema: 'node_ids limits it to layers' clarifies that filtering applies to layers (and groups and their contents), and 'properties: false shows layer rows only' explains the observable consequence of the flag rather than restating its type. Only page_id and intent go unelaborated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('A PNG picture of the timeline as a diagram') and explicitly distinguishes itself from the sibling render_design by negating 'not a frame of the design'. The enumeration of what the image contains (time ruler, layer rows with motion bars, property rows with keyframe diamonds) makes the tool unmistakable among the render_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Check timing and overlap here, then get_design timeline with node_id for the keyframes to change' routes the agent between this read-only visualization and the editing path, naming the alternative tool and the condition that selects it. It stops short of stating explicit exclusions (e.g., when to prefer render_design or render_contact_sheet), so it is strong context rather than a full decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_templatesFind templates to editARead-onlyIdempotentInspect
Find the workspace's templates to edit or reuse: newest first, or those matching query (an exact template id, or words of a name, description or campaign topic), limit per page. Each comes with its template_id, name, size, whether it is animated, a preview image URL and a link that opens it in Kalpana. Read-only. Use it when the user names an existing template or wants to start from one; to start fresh use create_design, and with a page's page_id already in hand go straight to get_design. To edit one, list_pages with its template_id gives each page's page_id for get_design and the other design tools.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page of results, from 1 (default 1). | |
| limit | No | At most this many templates (default 10). | |
| query | No | At least 3 characters; omit to list the newest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the bar is lower, but the description still adds value: it lists exactly what each result carries (template_id, name, size, animated flag, preview URL, open link) and the ordering rule. It does not discuss result-set size, empty results, or failure modes, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and filter semantics, then routing guidance. It is dense in a good way, though the final workflow sentence about list_pages/get_design could be trimmed since get_design was already mentioned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by enumerating the returned fields, so an agent knows what it gets back. Combined with zero required parameters and a complete usage story, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely extends the schema by defining what `query` accepts — an exact template id or words from a name, description, or campaign topic — which the schema's 'at least 3 characters' does not convey. It also ties `limit` to `page` as pagination, adding modest context beyond the field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (find templates) plus scope (the workspace's templates) and ordering (newest first). It clearly separates itself from create_design and get_design in the same breath, so an agent can pick it without inspecting siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it (user names an existing template or wants to start from one) and two alternatives with their triggering conditions: create_design for starting fresh, get_design when a page_id is already known. It even chains the follow-up step (list_pages with the template_id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_feedbackTell Kalpana what got in the wayAInspect
Feedback for the people who build these tools, not for the user: a tool, its arguments or the design guide that was confusing, missing something, wrong, or that worked especially well, with what was tried, what happened and what would have helped. Send it when you hit a snag, and at the end of the work when you have anything to report or suggest; nothing needs sending when there is nothing to say. It holds no user content (their copy, names, image URLs or brand details). Free, and it changes nothing in the design; the reply only confirms it was received.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | confusing: a tool or argument did not do what its description led you to expect. missing: something you needed has no tool or argument. bug: a wrong result or a failure. guide: the design guide was unclear or lacked something. worked_well: worth keeping as it is. | |
| tools | No | The tools it is about, by name; empty for the guide or the connection as a whole. | |
| page_id | No | The design you were working on, if any. | |
| what_happened | Yes | What you tried and what happened. | |
| what_would_help | No | What change to the tool or guide would have helped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing the return behavior ('the reply only confirms it was received'), a privacy constraint ('holds no user content — copy, names, image URLs, brand details'), and that it has no effect on the design plus costs nothing. The one gap is that readOnlyHint=false is not reconciled in prose, though 'sends feedback' adequately implies a write to an external channel while 'changes nothing in the design' scopes the side effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, and the trailing sentences cover timing, privacy and cost — each earning its place. The sentences are long and clause-packed (semicolon-chained), which costs a little scannability, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter write tool with no output schema, the description covers purpose, trigger timing, exclusions, privacy limits on payload content, side-effect scope, and what the response will be. Nothing an agent needs in order to decide to call it and fill it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum values, maxItems and length bounds are all documented in the schema, so the baseline applies. The description reinforces the intent of the two content fields ('what was tried, what happened and what would have helped') and names the eligibility scope of `tools`, but adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause states both the resource and the audience precisely: feedback about the tools themselves, explicitly 'not for the user', and enumerates the eligible subjects (a tool, its arguments, the design guide) and failure modes (confusing, missing, wrong, worked well). No sibling tool in the list does anything similar, so an agent can route here without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit triggering conditions are given ('when you hit a snag', 'at the end of the work when you have anything to report or suggest') plus an explicit non-trigger ('nothing needs sending when there is nothing to say'). The when/when-not pair removes the main ambiguity for a voluntary meta-tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_choreographySet choreographyAInspect
Replace the design's camera moves and morphs between layers with a value in the stored format (read the current one with get_design timeline); {} clears it. A flow alone (slides in order, joined by transitions) is compiled into the camera and morphs it plays. Validated before saving, and the timeline grows to fit. Returns the timeline. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it to edit or clear choreography as a whole; for one camera move use camera, for a single layer's motion animate, for a wipe between scenes make_transition, and for the length set_timeline.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| choreography | Yes | Camera moves and morphs between layers, in the stored format (read the current value with get_timeline). `{}` clears it. May instead carry just a `flow` (the slides in video order, joined by transitions, under `stage`/`steps`), the camera and morphs it plays are compiled from it and saved alongside it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral detail beyond annotations: validation before saving, timeline growth, return of the timeline, new revision semantics, undo reversion, and atomic refusal with no partial changes. These facts are important for a mutation tool and are not contradicted by the non-destructive annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the primary action and payload format, then moves to behavior and alternatives. Every clause adds relevant decision or invocation information, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation with a nested object parameter and no output schema, the description covers the payload formats, clearing behavior, validation, return value, revision/undo semantics, atomicity, and sibling alternatives. An agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds meaningful semantics beyond the schema: the stored format, `{}` as a clear signal, the flow-only alternative, and that flow is compiled into camera and morphs. This goes beyond simply restating the parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: replace the design's camera moves and morphs. It also clarifies the accepted value format and the `{}` clearing behavior, which lets an agent distinguish this from related editing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this for editing or clearing choreography as a whole, then names alternatives for narrower tasks: camera for one move, animate for layer motion, make_transition for a wipe, and set_timeline for length. It also explains how to read the current value with get_design timeline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_template_infoName the templateADestructiveInspect
Save a template's name, description and what each input may hold; each field given replaces the old value, and fields left out keep theirs. Name: short and specific, e.g. "Ember Roasters autumn menu". Description: a sentence on what it is and where it is used. inputs: a description per text or image layer, by its id or name, saying what it holds and how long it can be, as characters and lines ("Headline: 10 to 45 characters, up to 2 lines"); batches show it to whoever fills the rows. An input description of "" clears it. It also saves every change still waiting to be saved, so call it last: the template is then ready to fill with data. Returns the template's id, name and description, with a note when a change could not be saved. Use it once at the end of a design; to rename a single page use rename_page.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| inputs | No | Layer id or name to its input description: what it holds and its length limit. | |
| description | No | ||
| template_id | Yes | The template, from create_design or search_templates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: partial-overwrite semantics (fields given replace, fields omitted keep), the "" sentinel that clears an input description, the side effect of committing every pending change, and the shape of the return value including the failure note. Annotations only flag destructive=true; the description explains exactly what is mutated and how, though it never says whether the write is undoable or what permissions are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the saved fields and the replace-vs-keep rule before the per-field detail, and every clause carries information. It is a dense single block of semicolon-chained clauses, which reads heavier than necessary but wastes little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema and a nested object parameter, the description covers the mutation semantics, the clearing convention, ordering constraints, and the return contents including partial-failure signalling. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, and the description compensates fully: it gives formatting guidance for name (short, specific, with an example), description (one sentence on what and where used), and inputs (keyed by layer id or name, format like "Headline: 10 to 45 characters, up to 2 lines", audience note for batches, "" to clear). Only template_id is left to the schema, which already documents it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Save) and a precise payload (name, description, per-input descriptions) for a specific resource (a template). It explicitly distinguishes itself from the neighbouring rename_page and from template search/creation, so an agent can tell what it does and does not do without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit calling position ("Use it once at the end of a design"; "call it last") with the reason (it flushes pending saves), and names the alternative for the adjacent use case ("to rename a single page use rename_page"). Exclusions and timing are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_timelineSet the timelineAInspect
Set how the design plays: its length in seconds (at most 30), its frame rate, and still_time, the second a batch image shows (a negative value clears it, so images use the last frame). Fields left out keep their values. Returns the timeline. Saved as a new revision that undo reverts. Use it after animate when the motion needs more or less time, and always set still_time on a template with motion that will fill image batches; motion itself is set with animate and edit_keyframes, and camera moves with camera.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | Yes | The page to work on, as returned by create_design. | |
| duration | No | Length of the scene's video in seconds. | |
| still_time | No | The second a still image of the scene shows: the moment where all its content is in place. A negative value clears it (the last frame). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: partial-update semantics ('fields left out keep their values'), the 30-second cap, still_time's negative-value clearing rule, and that the change is saved as a new revision which undo reverts. That mutation/reversibility disclosure is exactly the context the non-readOnly hint alone cannot convey. It does not mention permissions or validation errors, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded paragraph that begins with the concrete action and fields before moving to the caveats. It is dense but every clause carries operational information; the final sentence is long and packs three sibling references together, which slightly hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers the return ('Returns the timeline'), the timeframe constraint, partial-update behavior, and undo semantics. For a 5-parameter mutation tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 80%, yet the description still adds the 30-second upper bound on duration and re-frames the negative-still_time rule, both of which affect how the agent will choose values. intent and page_id are left to their schema descriptions, which is reasonable given their clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Set') and resource ('the timeline'), then enumerates exactly what it controls: length in seconds, frame rate, and still_time. It explicitly names siblings (animate, edit_keyframes, camera) and the division of responsibility, so an agent can distinguish it from those tools without reading any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('after animate when the motion needs more or less time') and a mandatory condition ('always set still_time on a template with motion that will fill image batches'). It also routes the agent to the correct alternatives for motion (animate, edit_keyframes) and camera work (camera), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shape_pathCompute a shape outlineARead-onlyIdempotentInspect
Compute exact SVG path data for a vector layer: a shape (arc, sector, ring, rounded polygon, star, spiral, wave, gear, arrow, blob, comic burst with jitter, seed and aspect, a smooth line through points, the graph of a function), a stroke's filled outline, a boolean of paths, or the gap between two shapes; layer_gap with page_id measures two placed layers. kind picks the shape and the schema lists the fields each kind takes. Returns paths, width and height (and x, y to place it). Read-only; it draws nothing. Pass the result to a vector layer in create_layers; to combine layers already in a design use edit_structure boolean, for charts make_chart, and for artwork import_svg.
| Name | Required | Description | Default |
|---|---|---|---|
| a | No | ||
| b | No | ||
| op | No | ||
| to | No | ||
| cap | No | ||
| end | No | ||
| bend | No | ||
| form | No | ||
| from | No | ||
| head | No | ||
| join | No | ||
| kind | Yes | ||
| seed | No | ||
| x_to | No | ||
| depth | No | ||
| paths | No | ||
| sides | No | ||
| start | No | ||
| teeth | No | ||
| turns | No | ||
| width | No | ||
| y_max | No | ||
| y_min | No | Fix the y range (default: the function's own min and max). | |
| aspect | No | ||
| closed | No | ||
| corner | No | ||
| height | No | ||
| intent | No | Optional: a few words on why. | |
| jitter | No | ||
| points | No | ||
| radius | No | ||
| smooth | No | ||
| wobble | No | ||
| x_from | No | ||
| page_id | No | The page to work on, as returned by create_design. | |
| samples | No | ||
| amplitude | No | ||
| expression | No | ||
| wavelength | No | ||
| inner_ratio | No | ||
| inner_radius | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces this ('Read-only; it draws nothing') while adding something the structured data does not: the return payload (`paths`, `width`, `height`, plus `x`/`y` for placement) with no output schema present. It does not discuss failure modes or invalid-input behavior, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb+resource, then the kind inventory, then returns, then sibling routing — a sound structure with no throwaway sentences. It is still dense and long, and 'Read-only; it draws nothing' partly repeats the annotation, so it is efficient rather than perfectly tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 41-param, no-output-schema tool, the description supplies the missing return shape, placement fields, and the downstream workflow (create_layers), which is exactly the gap structured data leaves. What is missing is per-kind required-field guidance and error behavior, though the schema's own kind-by-kind description partly covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 41 parameters at 7% schema description coverage, the description carries the burden and does so well: it maps kinds to their fields (e.g. burst's `jitter`/`seed`/`aspect`, wave's `amplitude`/`wavelength`, gear's `teeth`/`depth`, arrow's `bend`/`head`, outline's `width`/`paths`) and explains semantics like `inner_ratio` as a fraction of radius. A handful of fields (`closed`, `smooth`, `samples`, `start`/`end`, `cap`/`join`) are only implied rather than stated, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Compute exact SVG path data for a vector layer') and then enumerates the supported shape kinds, boolean ops and gap modes, so an agent knows exactly which capability it is invoking. It also names the siblings it is not (edit_structure, make_chart, import_svg), making it distinguishable without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Pass the result to a vector layer in create_layers; to combine layers already in a design use edit_structure boolean, for charts make_chart, and for artwork import_svg.' Each alternative is paired with the condition that selects it, and 'layer_gap with page_id' distinguishes the placed-layer mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stagger_timesCompute stagger timesARead-onlyIdempotentInspect
Compute start times for N items that cascade in: step seconds apart, or spread over a total (give one of the two), evenly or with ease in or out, from start. Returns times, a list of seconds, one per item; count must be 1 to 5000, and a call with neither step nor total is refused. Free, read-only, no design needed. Use it to time a list, grid or word-by-word entrance, then pass the times to animate; for a cascade over one layer's children, animate's own stagger is simpler.
| Name | Required | Description | Default |
|---|---|---|---|
| ease | No | linear (default), in, out, in_out: how the gaps shrink or grow. | |
| step | No | Seconds between starts; or give `total`. | |
| count | Yes | ||
| start | No | Seconds for the first one. | |
| total | No | Seconds from the first start to the last. | |
| intent | No | Optional: a few words on why. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/no-open-world, and the description adds real behavioral facts beyond them: count bounds 1–5000, refusal when neither step nor total is supplied, and the return value ('a list of seconds, one per item'). 'Free, read-only, no design needed' partially restates the annotations, which keeps this from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core computation, then validation, then routing to the sibling – a sensible order with no filler sentences. The single dense sentence packs many clauses, making it slightly harder to scan than an ideal multi-sentence split.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still names the return value (`times`, seconds per item) and covers the key failure mode and numeric bound. An agent can call this correctly without inspecting anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (83%), so the baseline is 3, but the description adds genuine semantics the schema only hints at: step and total are mutually exclusive ('give one of the two'), and the default/effect of ease on how gaps 'shrink or grow'. It does not detail 'in_out' behavior beyond naming it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Compute start times for N items that cascade in') plus the mechanism (step or total, ease, start). It is immediately distinguishable from the sibling 'animate', which it names as the consumer of its output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the use case ('time a list, grid or word-by-word entrance'), the downstream step ('pass the times to animate'), and an explicit when-not with the alternative named ('for a cascade over one layer's children, animate's own stagger is simpler'). It also states the selection rule between step and total ('give one of the two').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
undoUndoAInspect
Revert the latest change to a design: the design goes back to how it was before that call (any tool that changed it: layers, structure, motion). Call it again to step back further; there is no redo, so an undone change has to be made again. Returns the revision the design is now at and the change it is back to; refused when there is nothing to undo. Paid like other edits. Use it when an edit made things worse; to remove one property, change it with update_layers instead.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | The page to work on, as returned by create_design. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=false already declared, the description adds genuinely new behavior: stack semantics (repeatable, no redo branch), the refusal case when nothing is left to undo, what is returned (the revision now current plus the change reverted to), and the cost model ('paid like other edits'). None of this is inferable from the annotations, and nothing contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and dense with useful detail; every clause carries signal. It is a long semicolon-chained sentence, though, so the return-value and cost information is harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description supplies the missing pieces itself: what state it restores, the repeatable no-redo semantics, the refusal condition, and the response contents. An agent can call it correctly and handle its result without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter whose schema description already covers it at 100% ('the page to work on, as returned by create_design'). The prose adds no extra constraint, format, or default beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (revert) and resource (the latest change to a design), and scopes it to changes made by any tool (layers, structure, motion). It is immediately distinguishable from update_layers, which it names as the different tool for a different job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when an edit made things worse'), when to use something else ('to remove one property, change it with update_layers instead'), and how to chain it ('call it again to step back further'). It also warns there is no redo, which prevents a common misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_layersChange layersAInspect
Change properties of existing layers: position and size, rotation, visibility, opacity, blend mode, masks, fills, strokes, radius, shadows, blur, image zoom and focus, vector paths, text and its style, flows and sizing in a flow. Only the fields given change. Each update names one layer by id, or many by select (a name pattern, a type, inside a frame); coords: "page" reads x and y in page coordinates, and page_ids makes the same updates on up to 5 pages. Returns the changed ids and the layout_issues this call caused. Saved as a new revision that undo reverts; if any part is refused, nothing changes. Use it to restyle or reposition layers in place; to put a layer in another parent, delete, wrap or align use edit_structure.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | One short sentence: what you change and why. Kept in the design history. | |
| page_id | No | The page to work on, as returned by create_design. | |
| preview | No | Also return a preview picture of the result. Use it only when you need to see the design (the finished build, visual fixes); leave it off for empty frames and structural steps. | |
| updates | No | ||
| page_ids | No | Instead of page_id: up to 5 pages to make the same updates on (the slides of a carousel made with duplicate, whose copies keep their layer ids). Every layer an update names by id must be on every page with the same type, or no page changes. The reply lists each page's own result under pages; with preview, a picture of every page follows, each labelled with its page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: partial-update semantics ("Only the fields given change"), all-or-nothing failure ("if any part is refused, nothing changes"), revision/undo, and that it returns changed ids plus layout_issues. That is substantial context given destructiveHint=false already signals a non-destructive-in-the-dangerous-sense mutation. It stops short of covering permission requirements or what `layout_issues` contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information density is high and the key constraint (partial update, id vs select) comes early, but the opening enumeration of mutable properties runs long and pushes the alternative-tool routing and atomicity guarantee deep into the paragraph. Nothing is truly wasted; it is just a dense wall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, heavily nested mutation tool with no output schema, the description covers selection, scope (single vs multi-page), atomicity, undo, return payload (changed ids, layout_issues), and the sibling boundary. An agent has what it needs to call this correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 80% schema coverage the baseline is 3, but the description adds a cross-parameter constraint the schema cannot express: each update targets one layer by `id` or many by `select`, and `coords: "page"` switches x/y to page coordinates. It says less than the schema's per-field descriptions, though, and doesn't touch `intent` or `preview` tradeoffs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Change properties of existing layers") and enumerates the mutable surface (position, rotation, opacity, fills, strokes, text, flows...). It explicitly contrasts with edit_structure for reparenting/wrapping/aligning, so an agent can separate it from its closest sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names when to use it ("restyle or reposition layers in place") and when not to ("to put a layer in another parent, delete, wrap or align use edit_structure"). It also states the selection modes (one `id`, many by `select`) and the multi-page case (`page_ids` up to 5), which is exactly the decision an agent must make before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_imagesAdd images to the workspaceAInspect
Bring the user's own images (PNG, JPEG or WebP, up to 5 MB each) into the workspace, optionally into a collection (made when it does not exist). Without files: a link to the workspace's Images page (the collection's page with collection) for the user to open and drop the images into; after they say they are done, find them with find_images and that collection. When you have the files yourself (a shell, files on disk): pass files with each one's SHA-256 hash, content type and size, PUT each file's bytes to its upload_url with that Content-Type header, then call again with done (each hash and file name) to record them; the reply gives each image's image key for create_layers and its asset_id for batch rows. Never send image data as base64. Files that did not arrive come back under failed and can be sent again; a file already stored is recognised by its hash and not stored twice. Use it for the user's own files; to use images already in the workspace use find_images, and images already on the web can be placed straight from their https URL.
| Name | Required | Description | Default |
|---|---|---|---|
| done | No | Files you uploaded, to record them. | |
| files | No | Files you will upload yourself. | |
| collection | No | Collection to put the images in, by name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnly=false, destructive=false, openWorld=false; the description adds the real behavior: a two-phase upload protocol, a link-return mode, `failed` results that can be retried, hash-based deduplication so a stored file is not stored twice, and the explicit prohibition on base64 image data. It also discloses what the reply yields (image key for create_layers, asset_id for batch rows).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core purpose comes first, then the branch behaviors and the recording step. It is a single long semicolon-chained paragraph, which makes the multi-step protocol harder to scan than a short bulleted flow, but no sentence is purely filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param, zero-required mutation tool with no output schema, the description covers input modes, the required follow-up call, retry semantics, deduplication, the returned keys, and the hard 'no base64' constraint. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond it by explaining the multi-step contract per parameter — each file needs SHA-256, content type and size, bytes go to its `upload_url` with that Content-Type, and `done` records each hash plus file name. `collection` is noted as being created when it does not exist. It does not spell out the per-file `name` field semantics beyond 'file name'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: bringing the user's own images into the workspace, with formats (PNG/JPEG/WebP) and size limit (5 MB) up front. It explicitly separates itself from find_images and from placing web-hosted images by URL, so an agent can distinguish it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use branches: no `files` when the user should drop images in the browser, `files` when the agent has files on disk, `done` after PUTting bytes. It also names alternatives — find_images for existing workspace images and direct https URLs for web images.
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.
3 tool updates
- Changed
create_layers4 fields changed- added
Input schema / $defs / LayerSpec / properties / baseline_shiftAdded value: +{ + "description": "Px up (+) or down (-), line kept: - hangs a big first letter.", + "type": "number" +} - changed
Input schema / $defs / LayerSpec / properties / text_warp / descriptionPrevious value: -"Text: bend the lettering: arch (+ up, - sags), bulge, flag (a wave), perspective (+ narrower top); none straightens."New value: +"Text: bend the lettering: arch (+ up, - sags), bulge (+ taller middle, - taller ends), flag (a wave), perspective (+ narrower top), bounce (each letter tilted and lifted: hand lettering)." - added
Input schema / $defs / TextRun / properties / baseline_shiftAdded value: +{ + "description": "Px up (+) or down (-), line kept: - hangs a big first letter.", + "type": "number" +} - changed
Input schema / $defs / TextWarpKindSpec / enumPrevious value: -[ - "none", - "arch", - "bulge", - "flag", - "perspective" -]New value: +[ + "none", + "arch", + "bulge", + "flag", + "perspective", + "bounce" +]
- Changed
edit_structure1 field changed- changed
Input schema / $defs / StructureOp / oneOfPrevious value: -[ - { - "description": "Move layers under another parent (the page when parent_id is omitted) at `index` (end when omitted). Their x/y stay relative to the new parent.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "op": { - "const": "move", - "type": "string" - }, - "parent_id": { - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Copy a layer (with children and animation) next to the original.", - "properties": { - "count": { - "default": 1, - "minimum": 0, - "type": "integer" - }, - "id": { - "type": "string" - }, - "offset_x": { - "default": 0, - "description": "Shift of each copy from the previous one, in px.", - "type": "number" - }, - "offset_y": { - "default": 0, - "type": "number" - }, - "op": { - "const": "duplicate", - "type": "string" - } - }, - "required": [ - "op", - "id" - ], - "type": "object" - }, - { - "description": "Wrap sibling layers in a new group, or in a frame when `flow` is given (a frame whose layout flow arranges them).", - "properties": { - "flow": { - "$ref": "#/$defs/FlowSpec" - }, - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "wrap", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Wrap sibling layers in a new frame fitted around them, without a layout flow (the editor's \"Frame selection\"). Add a flow afterwards with update_layers, or use `wrap` with `flow` to do both.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "frame", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Combine shape layers (rectangles, ellipses, vectors, other booleans) into one boolean layer, placed where the topmost of them was. It takes the bottom shape's fills. With a single boolean layer in `ids`, only its operation changes. The shapes stay inside it, editable.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "boolean", - "type": "string" - }, - "operation": { - "$ref": "#/$defs/BooleanKind" - } - }, - "required": [ - "op", - "ids", - "operation" - ], - "type": "object" - }, - { - "description": "Remove a group, frame or boolean, keeping its children in its place.", - "properties": { - "id": { - "type": "string" - }, - "op": { - "const": "unwrap", - "type": "string" - } - }, - "required": [ - "op", - "id" - ], - "type": "object" - }, - { - "description": "Wrap sibling layers in a \"Mask group\" whose bottom layer becomes the mask: the layers above show only where it is opaque.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "mask", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Stop layers from masking (the layers they hid show in full again).", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "unmask", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Scale layers and everything inside them by `factor` (2 = twice the size): size, text, spacing, radii, strokes, effects and paths grow together, as a scale tool does. `about`: \"origin\" (default) keeps each layer's top-left where it is; \"center\" keeps its centre.", - "properties": { - "about": { - "$ref": "#/$defs/ScaleAbout" - }, - "factor": { - "type": "number" - }, - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "scale", - "type": "string" - } - }, - "required": [ - "op", - "ids", - "factor" - ], - "type": "object" - }, - { - "description": "Line layers up: `left`/`center`/`right` set the horizontal edge, `top`/`middle`/`bottom` the vertical one. Several layers line up with the box around all of them; one layer lines up with its parent (or the page). `relative_to: \"parent\"` lines each layer up with its own parent instead. Layers a layout flow places cannot be moved.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "align", - "type": "string" - }, - "relative_to": { - "$ref": "#/$defs/AlignReference" - }, - "to": { - "$ref": "#/$defs/AlignTo" - } - }, - "required": [ - "op", - "ids", - "to" - ], - "type": "object" - }, - { - "description": "Even gaps between three or more layers along an axis: the first and last stay, the others are spaced between them in their current order.", - "properties": { - "axis": { - "$ref": "#/$defs/DistributeAxis" - }, - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "distribute", - "type": "string" - } - }, - "required": [ - "op", - "ids", - "axis" - ], - "type": "object" - }, - { - "description": "Change paint order among siblings.", - "properties": { - "id": { - "type": "string" - }, - "op": { - "const": "reorder", - "type": "string" - }, - "to": { - "$ref": "#/$defs/ReorderTo" - } - }, - "required": [ - "op", - "id", - "to" - ], - "type": "object" - } -]New value: +[ + { + "description": "Move layers under another parent (the page when parent_id is omitted) at `index` (end when omitted). Their x/y stay relative to the new parent.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "op": { + "const": "move", + "type": "string" + }, + "parent_id": { + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Copy a layer (with children and animation) next to the original.", + "properties": { + "count": { + "default": 1, + "minimum": 0, + "type": "integer" + }, + "id": { + "type": "string" + }, + "offset_x": { + "default": 0, + "description": "Shift of each copy from the previous one, in px.", + "type": "number" + }, + "offset_y": { + "default": 0, + "type": "number" + }, + "op": { + "const": "duplicate", + "type": "string" + } + }, + "required": [ + "op", + "id" + ], + "type": "object" + }, + { + "description": "Wrap sibling layers in a new group, or in a frame when `flow` is given (a frame whose layout flow arranges them).", + "properties": { + "flow": { + "$ref": "#/$defs/FlowSpec" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "wrap", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Wrap sibling layers in a new frame fitted around them, without a layout flow (the editor's \"Frame selection\"). Add a flow afterwards with update_layers, or use `wrap` with `flow` to do both.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "frame", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Combine shape layers (rectangles, ellipses, vectors, other booleans) into one boolean layer, placed where the topmost of them was. It takes the bottom shape's fills. With a single boolean layer in `ids`, only its operation changes. The shapes stay inside it, editable.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "boolean", + "type": "string" + }, + "operation": { + "$ref": "#/$defs/BooleanKind" + } + }, + "required": [ + "op", + "ids", + "operation" + ], + "type": "object" + }, + { + "description": "Remove a group, frame or boolean, keeping its children in its place.", + "properties": { + "id": { + "type": "string" + }, + "op": { + "const": "unwrap", + "type": "string" + } + }, + "required": [ + "op", + "id" + ], + "type": "object" + }, + { + "description": "Wrap sibling layers in a \"Mask group\" whose bottom layer becomes the mask: the layers above show only where it is opaque.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "mask", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Stop layers from masking (the layers they hid show in full again).", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "unmask", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Scale layers and everything inside them by `factor` (2 = twice the size): size, text, spacing, radii, strokes, effects and paths grow together, as a scale tool does. `about`: \"origin\" (default) keeps each layer's top-left where it is; \"center\" keeps its centre.", + "properties": { + "about": { + "$ref": "#/$defs/ScaleAbout" + }, + "factor": { + "type": "number" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "scale", + "type": "string" + } + }, + "required": [ + "op", + "ids", + "factor" + ], + "type": "object" + }, + { + "description": "Line layers up: `left`/`center`/`right` set the horizontal edge, `top`/`middle`/`bottom` the vertical one. Several layers line up with the box around all of them; one layer lines up with its parent (or the page). `relative_to: \"parent\"` lines each layer up with its own parent instead. Layers a layout flow places cannot be moved.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "align", + "type": "string" + }, + "relative_to": { + "$ref": "#/$defs/AlignReference" + }, + "to": { + "$ref": "#/$defs/AlignTo" + } + }, + "required": [ + "op", + "ids", + "to" + ], + "type": "object" + }, + { + "description": "Even gaps between three or more layers along an axis: the first and last stay, the others are spaced between them in their current order.", + "properties": { + "axis": { + "$ref": "#/$defs/DistributeAxis" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "distribute", + "type": "string" + } + }, + "required": [ + "op", + "ids", + "axis" + ], + "type": "object" + }, + { + "description": "Change paint order among siblings.", + "properties": { + "id": { + "type": "string" + }, + "op": { + "const": "reorder", + "type": "string" + }, + "to": { + "$ref": "#/$defs/ReorderTo" + } + }, + "required": [ + "op", + "id", + "to" + ], + "type": "object" + }, + { + "description": "New unused id for a layer. After `duplicate`, give each page's own content its own id: one id on two pages is one data column.", + "properties": { + "id": { + "type": "string" + }, + "new_id": { + "type": "string" + }, + "op": { + "const": "set_id", + "type": "string" + } + }, + "required": [ + "op", + "id", + "new_id" + ], + "type": "object" + } +]
- Changed
update_layers4 fields changed- added
Input schema / $defs / LayerUpdate / properties / baseline_shiftAdded value: +{ + "description": "Px up (+) or down (-), line kept: - hangs a big first letter.", + "type": "number" +} - changed
Input schema / $defs / LayerUpdate / properties / text_warp / descriptionPrevious value: -"Text: bend the lettering: arch (+ up, - sags), bulge, flag (a wave), perspective (+ narrower top); none straightens."New value: +"Text: bend the lettering: arch (+ up, - sags), bulge (+ taller middle, - taller ends), flag (a wave), perspective (+ narrower top), bounce (each letter tilted and lifted: hand lettering)." - added
Input schema / $defs / TextRun / properties / baseline_shiftAdded value: +{ + "description": "Px up (+) or down (-), line kept: - hangs a big first letter.", + "type": "number" +} - changed
Input schema / $defs / TextWarpKindSpec / enumPrevious value: -[ - "none", - "arch", - "bulge", - "flag", - "perspective" -]New value: +[ + "none", + "arch", + "bulge", + "flag", + "perspective", + "bounce" +]
2 tool updates
- Changed
create_layers15 fields changed- changed
Input schema / $defs / BlendSpec / descriptionPrevious value: -"pass_through: Groups and frames: children blend with what is behind the group.; print_light: Mockups: a lighting map that lights the print below it in its group."New value: +"pass_through: Groups and frames: children blend with what is behind the group.; print_light: Mockups: a lighting map that lights the print below it in its group.; knockout: cuts its shape out of the layers below it in its group, drawing nothing.; fill_below: paints only where the layers below it in its group are." - changed
Input schema / $defs / BlendSpec / enumPrevious value: -[ - "normal", - "darken", - "multiply", - "color_burn", - "linear_burn", - "lighten", - "screen", - "color_dodge", - "linear_dodge", - "overlay", - "soft_light", - "hard_light", - "difference", - "exclusion", - "hue", - "saturation", - "color", - "luminosity", - "pass_through", - "print_light" -]New value: +[ + "normal", + "darken", + "multiply", + "color_burn", + "linear_burn", + "lighten", + "screen", + "color_dodge", + "linear_dodge", + "overlay", + "soft_light", + "hard_light", + "difference", + "exclusion", + "hue", + "saturation", + "color", + "luminosity", + "pass_through", + "print_light", + "knockout", + "fill_below" +] - added
Input schema / $defs / LayerSpec / properties / leading_trimAdded value: +{ + "$ref": "#/$defs/LeadingTrimSpec", + "description": "cap_height: the box hugs the letters, cap height to baseline (centre type by its letters). none: the line box." +} - added
Input schema / $defs / LayerSpec / properties / outlinesAdded value: +{ + "description": "Text: rings outside the stroke, innermost first, each `width` px (white then dark: a double outline). `[]` removes them.", + "items": { + "$ref": "#/$defs/OutlineSpec" + }, + "type": "array" +} - changed
Input schema / $defs / LayerSpec / properties / shadows / descriptionPrevious value: -"Replaces the layer's shadows. `[]` removes them."New value: +"Replaces the layer's shadows; `[]` removes them. The first lies farthest back, the last nearest the layer (unlike CSS)." - added
Input schema / $defs / LayerSpec / properties / skewAdded value: +{ + "description": "Lean in degrees (-80 to 80), + tips the top right like italic; 0 removes. Slants a font with no italic face; posters lean 8 to 15.", + "type": "number" +} - added
Input schema / $defs / LayerSpec / properties / text_warpAdded value: +{ + "$ref": "#/$defs/TextWarpSpec", + "description": "Text: bend the lettering: arch (+ up, - sags), bulge, flag (a wave), perspective (+ narrower top); none straightens." +} - changed
Input schema / $defs / LayerSpec / properties / texture / descriptionPrevious value: -"Rough, frayed edges (torn paper)."New value: +"Rough, frayed edges (torn paper); frays text, so not for clean type." - added
Input schema / $defs / LeadingTrimSpecAdded value: +{ + "enum": [ + "none", + "cap_height" + ], + "type": "string" +} - added
Input schema / $defs / OutlineSpecAdded value: +{ + "additionalProperties": false, + "properties": { + "color": { + "description": "Hex colour.", + "type": "string" + }, + "width": { + "description": "Thickness of the ring in px.", + "type": "number" + } + }, + "required": [ + "color", + "width" + ], + "type": "object" +} - changed
Input schema / $defs / TextEffectPreset / descriptionPrevious value: -"background: pill behind the text (create only)."New value: +"extrude: solid 3D depth (`color` its side, `angle` its way; add a stroke to outline face and depth). background: pill behind the text (create only)." - changed
Input schema / $defs / TextEffectPreset / enumPrevious value: -[ - "none", - "shadow", - "lift", - "hollow", - "splice", - "echo", - "glitch", - "neon", - "outline", - "sticker", - "gradient", - "background" -]New value: +[ + "none", + "shadow", + "lift", + "hollow", + "splice", + "echo", + "extrude", + "glitch", + "neon", + "outline", + "sticker", + "gradient", + "background" +] - added
Input schema / $defs / TextEffectSpec / properties / angleAdded value: +{ + "description": "Extrude: degrees clockwise from right the depth runs (default 45).", + "type": "number" +} - added
Input schema / $defs / TextWarpKindSpecAdded value: +{ + "enum": [ + "none", + "arch", + "bulge", + "flag", + "perspective" + ], + "type": "string" +} - added
Input schema / $defs / TextWarpSpecAdded value: +{ + "additionalProperties": false, + "properties": { + "amount": { + "description": "-1 to 1 (default 0.5).", + "type": "number" + }, + "kind": { + "$ref": "#/$defs/TextWarpKindSpec" + } + }, + "required": [ + "kind" + ], + "type": "object" +}
- Changed
update_layers15 fields changed- changed
Input schema / $defs / BlendSpec / descriptionPrevious value: -"pass_through: Groups and frames: children blend with what is behind the group.; print_light: Mockups: a lighting map that lights the print below it in its group."New value: +"pass_through: Groups and frames: children blend with what is behind the group.; print_light: Mockups: a lighting map that lights the print below it in its group.; knockout: cuts its shape out of the layers below it in its group, drawing nothing.; fill_below: paints only where the layers below it in its group are." - changed
Input schema / $defs / BlendSpec / enumPrevious value: -[ - "normal", - "darken", - "multiply", - "color_burn", - "linear_burn", - "lighten", - "screen", - "color_dodge", - "linear_dodge", - "overlay", - "soft_light", - "hard_light", - "difference", - "exclusion", - "hue", - "saturation", - "color", - "luminosity", - "pass_through", - "print_light" -]New value: +[ + "normal", + "darken", + "multiply", + "color_burn", + "linear_burn", + "lighten", + "screen", + "color_dodge", + "linear_dodge", + "overlay", + "soft_light", + "hard_light", + "difference", + "exclusion", + "hue", + "saturation", + "color", + "luminosity", + "pass_through", + "print_light", + "knockout", + "fill_below" +] - added
Input schema / $defs / LayerUpdate / properties / leading_trimAdded value: +{ + "$ref": "#/$defs/LeadingTrimSpec", + "description": "cap_height: the box hugs the letters, cap height to baseline (centre type by its letters). none: the line box." +} - added
Input schema / $defs / LayerUpdate / properties / outlinesAdded value: +{ + "description": "Text: rings outside the stroke, innermost first, each `width` px (white then dark: a double outline). `[]` removes them.", + "items": { + "$ref": "#/$defs/OutlineSpec" + }, + "type": "array" +} - changed
Input schema / $defs / LayerUpdate / properties / shadows / descriptionPrevious value: -"Replaces the layer's shadows. `[]` removes them."New value: +"Replaces the layer's shadows; `[]` removes them. The first lies farthest back, the last nearest the layer (unlike CSS)." - added
Input schema / $defs / LayerUpdate / properties / skewAdded value: +{ + "description": "Lean in degrees (-80 to 80), + tips the top right like italic; 0 removes. Slants a font with no italic face; posters lean 8 to 15.", + "type": "number" +} - added
Input schema / $defs / LayerUpdate / properties / text_warpAdded value: +{ + "$ref": "#/$defs/TextWarpSpec", + "description": "Text: bend the lettering: arch (+ up, - sags), bulge, flag (a wave), perspective (+ narrower top); none straightens." +} - changed
Input schema / $defs / LayerUpdate / properties / texture / descriptionPrevious value: -"Rough, frayed edges (torn paper)."New value: +"Rough, frayed edges (torn paper); frays text, so not for clean type." - added
Input schema / $defs / LeadingTrimSpecAdded value: +{ + "enum": [ + "none", + "cap_height" + ], + "type": "string" +} - added
Input schema / $defs / OutlineSpecAdded value: +{ + "additionalProperties": false, + "properties": { + "color": { + "description": "Hex colour.", + "type": "string" + }, + "width": { + "description": "Thickness of the ring in px.", + "type": "number" + } + }, + "required": [ + "color", + "width" + ], + "type": "object" +} - changed
Input schema / $defs / TextEffectPreset / descriptionPrevious value: -"background: pill behind the text (create only)."New value: +"extrude: solid 3D depth (`color` its side, `angle` its way; add a stroke to outline face and depth). background: pill behind the text (create only)." - changed
Input schema / $defs / TextEffectPreset / enumPrevious value: -[ - "none", - "shadow", - "lift", - "hollow", - "splice", - "echo", - "glitch", - "neon", - "outline", - "sticker", - "gradient", - "background" -]New value: +[ + "none", + "shadow", + "lift", + "hollow", + "splice", + "echo", + "extrude", + "glitch", + "neon", + "outline", + "sticker", + "gradient", + "background" +] - added
Input schema / $defs / TextEffectSpec / properties / angleAdded value: +{ + "description": "Extrude: degrees clockwise from right the depth runs (default 45).", + "type": "number" +} - added
Input schema / $defs / TextWarpKindSpecAdded value: +{ + "enum": [ + "none", + "arch", + "bulge", + "flag", + "perspective" + ], + "type": "string" +} - added
Input schema / $defs / TextWarpSpecAdded value: +{ + "additionalProperties": false, + "properties": { + "amount": { + "description": "-1 to 1 (default 0.5).", + "type": "number" + }, + "kind": { + "$ref": "#/$defs/TextWarpKindSpec" + } + }, + "required": [ + "kind" + ], + "type": "object" +}
2 tool updates
- Added
get_workspace - Removed
list_workspaces
3 tool updates
- Changed
kinetic_type12 fields changed- added
Input schema / properties / align / descriptionAdded value: +"Line alignment inside `width`: \"left\" (default), \"center\" or \"right\"." - added
Input schema / properties / color / descriptionAdded value: +"Hex colour of the words (default #111111)." - added
Input schema / properties / emphasis / descriptionAdded value: +"Words to stand out, each with its own colour, style, size, tilt or highlight pill." - added
Input schema / properties / font_family / descriptionAdded value: +"A family from list_fonts (default: the library's default sans)." - added
Input schema / properties / font_size / descriptionAdded value: +"Size of every word that is not emphasised, px." - added
Input schema / properties / font_style / descriptionAdded value: +"A style of that family, e.g. \"Bold\"." - added
Input schema / properties / motion / descriptionAdded value: +"How the words arrive (default fly)." - added
Input schema / properties / seed / descriptionAdded value: +"Varies the scatter and timing; the same seed and text repeat exactly." - added
Input schema / properties / text / descriptionAdded value: +"The phrase; it is split into words at spaces." - added
Input schema / properties / width / descriptionAdded value: +"Widest the block may be, px; words wrap onto new lines past it." - changed
Input schema / properties / x / descriptionPrevious value: -"Where the block sits in the parent and how wide it may be, px."New value: +"Left edge of the block in the parent, px." - added
Input schema / properties / y / descriptionAdded value: +"Top edge of the block in the parent, px."
- Changed
make_carousel9 fields changed- added
Input schema / properties / art_fill / descriptionAdded value: +"Fill of the art panel behind each image (default #F4F4F4)." - changed
Input schema / properties / card_fill / descriptionPrevious value: -"Card fill (default white), art panel fill (default #F4F4F4), title colour (default near-black), subtitle colour (default #8A8A8A)."New value: +"Card fill (default white)." - added
Input schema / properties / card_height / descriptionAdded value: +"Card height, px (default 940)." - changed
Input schema / properties / card_width / descriptionPrevious value: -"Card size (default 720 x 940)."New value: +"Card width, px (default 720)." - added
Input schema / properties / color / descriptionAdded value: +"Title colour (default near-black)." - added
Input schema / properties / font_family / descriptionAdded value: +"A family from list_fonts for the titles and subtitles." - added
Input schema / properties / items / descriptionAdded value: +"The cards, in order; the first is centred at `start`." - added
Input schema / properties / name / descriptionAdded value: +"The group's name (default \"Carousel\")." - added
Input schema / properties / subtitle_color / descriptionAdded value: +"Subtitle colour (default #8A8A8A)."
- Changed
set_template_info1 field changed- added
Input schema / properties / template_id / descriptionAdded value: +"The template, from create_design or search_templates."
8 tool updates
- Removed
color_math - Added
delete_layers - Added
delete_pages - Changed
duplicate1 field changed- changed
Input schema / properties / page_ids / descriptionPrevious value: -"The pages to copy, in order (their page_ids from pages list or create_design)."New value: +"The pages to copy, in order (their page_ids from list_pages or create_design)."
- Changed
edit_structure1 field changed- changed
Input schema / $defs / StructureOp / oneOfPrevious value: -[ - { - "description": "Move layers under another parent (the page when parent_id is omitted) at `index` (end when omitted). Their x/y stay relative to the new parent.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "index": { - "minimum": 0, - "type": "integer" - }, - "op": { - "const": "move", - "type": "string" - }, - "parent_id": { - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Delete layers and everything inside them.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "delete", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Copy a layer (with children and animation) next to the original.", - "properties": { - "count": { - "default": 1, - "minimum": 0, - "type": "integer" - }, - "id": { - "type": "string" - }, - "offset_x": { - "default": 0, - "description": "Shift of each copy from the previous one, in px.", - "type": "number" - }, - "offset_y": { - "default": 0, - "type": "number" - }, - "op": { - "const": "duplicate", - "type": "string" - } - }, - "required": [ - "op", - "id" - ], - "type": "object" - }, - { - "description": "Wrap sibling layers in a new group, or in a frame when `flow` is given (a frame whose layout flow arranges them).", - "properties": { - "flow": { - "$ref": "#/$defs/FlowSpec" - }, - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "wrap", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Wrap sibling layers in a new frame fitted around them, without a layout flow (the editor's \"Frame selection\"). Add a flow afterwards with update_layers, or use `wrap` with `flow` to do both.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "frame", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Combine shape layers (rectangles, ellipses, vectors, other booleans) into one boolean layer, placed where the topmost of them was. It takes the bottom shape's fills. With a single boolean layer in `ids`, only its operation changes. The shapes stay inside it, editable.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "boolean", - "type": "string" - }, - "operation": { - "$ref": "#/$defs/BooleanKind" - } - }, - "required": [ - "op", - "ids", - "operation" - ], - "type": "object" - }, - { - "description": "Remove a group, frame or boolean, keeping its children in its place.", - "properties": { - "id": { - "type": "string" - }, - "op": { - "const": "unwrap", - "type": "string" - } - }, - "required": [ - "op", - "id" - ], - "type": "object" - }, - { - "description": "Wrap sibling layers in a \"Mask group\" whose bottom layer becomes the mask: the layers above show only where it is opaque.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "op": { - "const": "mask", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Stop layers from masking (the layers they hid show in full again).", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "unmask", - "type": "string" - } - }, - "required": [ - "op", - "ids" - ], - "type": "object" - }, - { - "description": "Scale layers and everything inside them by `factor` (2 = twice the size): size, text, spacing, radii, strokes, effects and paths grow together, as a scale tool does. `about`: \"origin\" (default) keeps each layer's top-left where it is; \"center\" keeps its centre.", - "properties": { - "about": { - "$ref": "#/$defs/ScaleAbout" - }, - "factor": { - "type": "number" - }, - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "scale", - "type": "string" - } - }, - "required": [ - "op", - "ids", - "factor" - ], - "type": "object" - }, - { - "description": "Line layers up: `left`/`center`/`right` set the horizontal edge, `top`/`middle`/`bottom` the vertical one. Several layers line up with the box around all of them; one layer lines up with its parent (or the page). `relative_to: \"parent\"` lines each layer up with its own parent instead. Layers a layout flow places cannot be moved.", - "properties": { - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "align", - "type": "string" - }, - "relative_to": { - "$ref": "#/$defs/AlignReference" - }, - "to": { - "$ref": "#/$defs/AlignTo" - } - }, - "required": [ - "op", - "ids", - "to" - ], - "type": "object" - }, - { - "description": "Even gaps between three or more layers along an axis: the first and last stay, the others are spaced between them in their current order.", - "properties": { - "axis": { - "$ref": "#/$defs/DistributeAxis" - }, - "ids": { - "items": { - "type": "string" - }, - "type": "array" - }, - "op": { - "const": "distribute", - "type": "string" - } - }, - "required": [ - "op", - "ids", - "axis" - ], - "type": "object" - }, - { - "description": "Change paint order among siblings.", - "properties": { - "id": { - "type": "string" - }, - "op": { - "const": "reorder", - "type": "string" - }, - "to": { - "$ref": "#/$defs/ReorderTo" - } - }, - "required": [ - "op", - "id", - "to" - ], - "type": "object" - } -]New value: +[ + { + "description": "Move layers under another parent (the page when parent_id is omitted) at `index` (end when omitted). Their x/y stay relative to the new parent.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "index": { + "minimum": 0, + "type": "integer" + }, + "op": { + "const": "move", + "type": "string" + }, + "parent_id": { + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Copy a layer (with children and animation) next to the original.", + "properties": { + "count": { + "default": 1, + "minimum": 0, + "type": "integer" + }, + "id": { + "type": "string" + }, + "offset_x": { + "default": 0, + "description": "Shift of each copy from the previous one, in px.", + "type": "number" + }, + "offset_y": { + "default": 0, + "type": "number" + }, + "op": { + "const": "duplicate", + "type": "string" + } + }, + "required": [ + "op", + "id" + ], + "type": "object" + }, + { + "description": "Wrap sibling layers in a new group, or in a frame when `flow` is given (a frame whose layout flow arranges them).", + "properties": { + "flow": { + "$ref": "#/$defs/FlowSpec" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "wrap", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Wrap sibling layers in a new frame fitted around them, without a layout flow (the editor's \"Frame selection\"). Add a flow afterwards with update_layers, or use `wrap` with `flow` to do both.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "frame", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Combine shape layers (rectangles, ellipses, vectors, other booleans) into one boolean layer, placed where the topmost of them was. It takes the bottom shape's fills. With a single boolean layer in `ids`, only its operation changes. The shapes stay inside it, editable.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "boolean", + "type": "string" + }, + "operation": { + "$ref": "#/$defs/BooleanKind" + } + }, + "required": [ + "op", + "ids", + "operation" + ], + "type": "object" + }, + { + "description": "Remove a group, frame or boolean, keeping its children in its place.", + "properties": { + "id": { + "type": "string" + }, + "op": { + "const": "unwrap", + "type": "string" + } + }, + "required": [ + "op", + "id" + ], + "type": "object" + }, + { + "description": "Wrap sibling layers in a \"Mask group\" whose bottom layer becomes the mask: the layers above show only where it is opaque.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "op": { + "const": "mask", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Stop layers from masking (the layers they hid show in full again).", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "unmask", + "type": "string" + } + }, + "required": [ + "op", + "ids" + ], + "type": "object" + }, + { + "description": "Scale layers and everything inside them by `factor` (2 = twice the size): size, text, spacing, radii, strokes, effects and paths grow together, as a scale tool does. `about`: \"origin\" (default) keeps each layer's top-left where it is; \"center\" keeps its centre.", + "properties": { + "about": { + "$ref": "#/$defs/ScaleAbout" + }, + "factor": { + "type": "number" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "scale", + "type": "string" + } + }, + "required": [ + "op", + "ids", + "factor" + ], + "type": "object" + }, + { + "description": "Line layers up: `left`/`center`/`right` set the horizontal edge, `top`/`middle`/`bottom` the vertical one. Several layers line up with the box around all of them; one layer lines up with its parent (or the page). `relative_to: \"parent\"` lines each layer up with its own parent instead. Layers a layout flow places cannot be moved.", + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "align", + "type": "string" + }, + "relative_to": { + "$ref": "#/$defs/AlignReference" + }, + "to": { + "$ref": "#/$defs/AlignTo" + } + }, + "required": [ + "op", + "ids", + "to" + ], + "type": "object" + }, + { + "description": "Even gaps between three or more layers along an axis: the first and last stay, the others are spaced between them in their current order.", + "properties": { + "axis": { + "$ref": "#/$defs/DistributeAxis" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "op": { + "const": "distribute", + "type": "string" + } + }, + "required": [ + "op", + "ids", + "axis" + ], + "type": "object" + }, + { + "description": "Change paint order among siblings.", + "properties": { + "id": { + "type": "string" + }, + "op": { + "const": "reorder", + "type": "string" + }, + "to": { + "$ref": "#/$defs/ReorderTo" + } + }, + "required": [ + "op", + "id", + "to" + ], + "type": "object" + } +]
- Added
list_pages - Removed
pages - Added
rename_page
3 tool updates
- Changed
create_design1 field changed- changed
Input schema / $defs / GradientSpec / properties / repeat / descriptionPrevious value: -"Past the last stop: hold its colour (none, default), repeat the gradient (stripes, rings) or mirror it."New value: +"Past the last stop: hold its colour (none, default), repeat the gradient (stripes, rings) or mirror it. Repeat tiles the from-to segment: fine stripes need a short from/to."
- Changed
create_layers4 fields changed- changed
Input schema / $defs / GradientSpec / properties / repeat / descriptionPrevious value: -"Past the last stop: hold its colour (none, default), repeat the gradient (stripes, rings) or mirror it."New value: +"Past the last stop: hold its colour (none, default), repeat the gradient (stripes, rings) or mirror it. Repeat tiles the from-to segment: fine stripes need a short from/to." - changed
Input schema / $defs / LayerSpec / properties / x / descriptionPrevious value: -"Left edge in px, relative to the parent. Ignored inside a layout flow unless `absolute` is true."New value: +"Left edge in px, relative to the parent. Ignored inside a layout flow unless `absolute` is true. Rotated: the box before rotation." - added
Input schema / $defs / ShadowSpec / properties / spread / descriptionAdded value: +"On an image it grows the picture's alpha (blur 0: a sticker outline)." - added
Input schema / $defs / StrokeSpec / descriptionAdded value: +"Follows the layer's box; around a cutout's own edge, use a shadow with blur 0 and spread."
- Changed
update_layers8 fields changed- added
Input schema / $defs / CoordsAdded value: +{ + "enum": [ + "parent", + "page" + ], + "type": "string" +} - changed
Input schema / $defs / GradientSpec / properties / repeat / descriptionPrevious value: -"Past the last stop: hold its colour (none, default), repeat the gradient (stripes, rings) or mirror it."New value: +"Past the last stop: hold its colour (none, default), repeat the gradient (stripes, rings) or mirror it. Repeat tiles the from-to segment: fine stripes need a short from/to." - added
Input schema / $defs / LayerUpdate / properties / coordsAdded value: +{ + "$ref": "#/$defs/Coords", + "description": "x and y from the parent (default) or the page (get_design's boxes)." +} - changed
Input schema / $defs / LayerUpdate / properties / x / descriptionPrevious value: -"Left edge in px, relative to the parent. Ignored inside a layout flow unless `absolute` is true."New value: +"Left edge in px, relative to the parent. Ignored inside a layout flow unless `absolute` is true. Rotated: the box before rotation." - added
Input schema / $defs / ShadowSpec / properties / spread / descriptionAdded value: +"On an image it grows the picture's alpha (blur 0: a sticker outline)." - added
Input schema / $defs / StrokeSpec / descriptionAdded value: +"Follows the layer's box; around a cutout's own edge, use a shadow with blur 0 and spread." - added
Input schema / properties / page_idsAdded value: +{ + "description": "Instead of page_id: up to 5 pages to make the same updates on (the slides of a carousel made with duplicate, whose copies keep their layer ids). Every layer an update names by id must be on every page with the same type, or no page changes. The reply lists each page's own result under pages; with preview, a picture of every page follows, each labelled with its page.", + "items": { + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "page_id", - "intent" -]New value: +[ + "intent" +]
41 tool updates
- First observed
animate - First observed
calculate - First observed
camera - First observed
check_layout - First observed
clear_animation - First observed
color_math - First observed
create_design - First observed
create_layers - First observed
design_guide - First observed
duplicate - First observed
edit_keyframes - First observed
edit_structure - First observed
find_images - First observed
get_design - First observed
import_svg - First observed
kinetic_type - First observed
list_fonts - First observed
list_shaders - First observed
list_workspaces - First observed
make_carousel - First observed
make_chart - First observed
make_cursor - First observed
make_list - First observed
make_particles - First observed
make_transition - First observed
measure_text - First observed
pages - First observed
place_items - First observed
render_contact_sheet - First observed
render_design - First observed
render_timeline - First observed
search_templates - First observed
send_feedback - First observed
set_choreography - First observed
set_template_info - First observed
set_timeline - First observed
shape_path - First observed
stagger_times - First observed
undo - First observed
update_layers - First observed
upload_images
Publisher details
- Operator
- Shreekaram Technologies · Publisher source
- Operator website
- https://kalpana.one · Publisher source
- Vendor relationship
- First-party
- Documentation
- https://docs.kalpana.one/mcp/designer
- Trust center
- Not available
- Restrictions
- Requires an active paid Kalpana plan; designer calls are paid from the workspace’s render credits. Each connection covers one workspace chosen at sign-in, within the user’s role there. · Publisher source
Related MCP Connectors
Ready-to-publish ad creatives from an AI assistant: campaigns, image/video/UGC ads, brands, edits.
Photos and a brief in, finished social-media designs out. First design free, no account.
On-brand ad creative generation: teach it your brand once, generate images and video forever.
Make on-brand social videos and designs: Reels, stories, carousels and posts in your brand kit.
1
Related MCP Servers
- AlicenseAqualityCmaintenanceGenerate production-ready images from text prompts. AI-powered design API with 50+ templates for social posts, banners, OG images, and more.82 npmMIT
- AlicenseNot gradedqualityCmaintenanceTurns photos plus a short brief into finished social-media designs such as stories, carousels, reel covers and invites. It searches and ranks templates, uploads images, places photos and copy, and returns rendered designs with links for further editing.Apache 2.0

Canvora MCPofficial
AlicenseAqualityDmaintenanceEnables AI agents to generate on-brand visuals from ideas, URLs, documents, or PDFs in over 100 formats and 150+ languages, with consistent brand kits.1612 npm1MIT- AlicenseNot gradedqualityCmaintenanceEnables AI agents to act as graphic designers by generating images and social-ready visuals, with brand DNA memory, genre-aware styles, 35+ platform presets, self-critique, and version control.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.