genable-mcp
The genable-mcp server is a Figma design agent that lets you create, inspect, edit, and manage native Figma designs programmatically from any MCP client.
Design Generation
jsx— Create entire design trees using JSX-like markup (frames, text, icons, images, instances, vectors, etc.) with full auto-layout, styling, and gradient supportcreate_vector— Create vector nodes from SVG path data or polyline points (charts, icons, custom shapes)
Node Manipulation
edit— Batch update properties (size, opacity, radius, component props) on one or many nodesdelete_node— Delete a node and all its childrenmove_node— Relocate or rename a node without recreating itclone_node— Deep-copy a node with optional property overrides
Layout & Styling
set_text— Set text content on one or more text nodesset_fill— Set fill or background color (hex, gradient, variable token)set_stroke— Set border/stroke color, weight, and alignmentset_layout— Set auto-layout properties (direction, gap, padding, alignment, grid)
Inspection & Validation
inspect— Read node properties (layout, fills, strokes, typography, effects, variables, etc.)describe— Validate a design subtree for layout conflicts, overflow, missing properties, and structural issuesfind_nodes— Search nodes by name or type across the current pageget_selection— Retrieve the user's currently selected nodesget_screenshot— Capture a PNG screenshot of any node for visual verificationdiscover_props/replace_props— Find unique property values or bulk find-and-replace across a subtree (e.g., theming, token migration)
Variable & Token System
list_variables,create_collection,ensure_collection,create_variable,ensure_variable,set_variable_value,bind_variable,set_variable_mode,find_references— Full management of Figma variables, collections, and modes (e.g., Light/Dark theming)
Component System
create_component— Convert a frame or group into a Figma componentcombine_components— Combine multiple components into a variant setadd_component_prop/list_component_props— Manage TEXT, BOOLEAN, or INSTANCE_SWAP propertiescreate_instance— Create a live instance of an existing component
Knowledge & Guidance
skill— Load procedural workflow guidesstyle— Load visual style presets (color tokens, typography, mood)guideline— Load page-type design guidelines (landing pages, dashboards, forms, etc.)help— Load how-to documentation for tools, edge cases, and conventions
Page & File Navigation
switch_page— Navigate between pages or discover the page roster
Plugin Data
read_plugin_data/write_plugin_data— Read/write private or shared plugin metadata on nodes
Agent & Session Management
subtask— Delegate focused sub-tasks to typed child agents (create, audit, token operations)session_note— Persistent scratchpad for plans, decisions, failures, and learnings across turnsask_user— Present a structured multi-question form to clarify ambiguous design decisions
Provides tools for building and editing Figma designs, including JSX tree creation, variables/tokens, components, cross-page navigation, and visual verification.
Genable
Use your model. Keep the design.
Turn a detailed brief into native, editable Figma structure you can inspect and refine.
A design agent with a canvas to act on
Genable runs an agent loop against Figma's scene graph through typed design operations. It can plan a composition, build native structure, inspect the result, and continue refining it in context.
Plan the direction — Make audience, content, hierarchy, brand, mood, typography, density, and rhythm part of the brief.
Build native structure — Create and edit frames, Auto Layout, vectors, text, components, variables, and pages instead of returning one flat image.
Check the work — Inspect structure, read back writes, and use screenshots for visual verification when useful.
Keep refining — Continue the conversation with the current canvas in context; every generated layer remains available to edit in Figma.
Related MCP server: figwright
A visual direction, not a preset shell
Generic output often begins with a generic brief. Genable's design guidance pushes the model to treat composition, hierarchy, typography, density, rhythm, surfaces, and data presentation as connected decisions—not as a card grid with a new accent color.
No tool can guarantee taste. The model, source material, and judgment still matter. Genable keeps intent explicit and the result inspectable so refinement stays inside the workflow.
Choose the model that fits the brief
The Figma plugin supports provider presets and configurable compatible endpoints across three protocol families. It validates the provider before the first run and lets you switch models later without hard-coding this page to a specific model version.
Protocol | Typical connections |
OpenAI-compatible | OpenAI, OpenRouter, Moonshot, DeepSeek, DashScope, compatible endpoints |
Anthropic-compatible | Anthropic and compatible endpoints |
Gemini | Google AI Studio |
Provider credentials are stored in Figma client storage. Requests go to the endpoint you configure; some presets can use a relay when browser-network constraints require it. Provider billing and limits still apply.
One engine, two ways into Figma
Inside Figma: the plugin
Add a supported provider or compatible endpoint in Settings.
Describe the design in detail, then inspect and refine the native layers in conversation.
From an MCP client: genable-mcp
Use the model already configured in a STDIO MCP client. genable-mcp provides
a local, plugin-backed bridge for creating, editing, inspecting, and visually
verifying Figma designs; it does not require a second model API key inside
Genable.
{
"mcpServers": {
"genable": {
"command": "npx",
"args": ["-y", "genable-mcp"]
}
}
}Keep the Genable plugin running in Figma desktop, then ask your client to list the pages in the current file. See the current package docs for client-specific setup and the live tool schema.
Example briefs
Detail gives the model a real direction to work with. Adapt one of these to your product rather than treating it as a guaranteed output recipe:
“SaaS pricing page — three tiers, monthly/annual toggle, featured Pro plan, dark mode, and brand color bound to variables.”
“Analytics dashboard — sidebar, KPI grid with sparklines, compact holdings table, dark and light modes, and a calm editorial hierarchy.”
“Mobile onboarding — three screens with progress, illustration direction, named type scale, spacing rhythm, and one clear primary action.”
“Landing hero — audience and value proposition first, dual CTA, code preview, Inter typography, and an 8pt spacing scale.”
Sponsor
Genable is maintained by one developer. Sponsorship supports development time, real-model evaluation, and ongoing plugin and MCP improvements.
License
The material in this public repository and the genable-mcp package are
MIT-licensed. The Figma Community plugin is free; model-provider usage may be
billed separately.
Available Tools
41 toolsadd_component_propA
Add a component property and bind it to a child node.
For TEXT properties: binds to the target text node's characters, so instances can override the text content. For BOOLEAN properties: binds to the target node's visibility.
Parameters: node: The component node ID (must be COMPONENT or COMPONENT_SET). name: Property display name. type: TEXT, BOOLEAN, or INSTANCE_SWAP. default: Default value. bind: Child node ID to bind this property to. For TEXT, binds to text content. For BOOLEAN, binds to visibility.
Examples: add_component_prop({node: "1:2", name: "Label", type: "TEXT", default: "Click me", bind: "1:5"}) add_component_prop({node: "1:2", name: "Show Icon", type: "BOOLEAN", default: "true", bind: "1:6"})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Component node ID (e.g. "1:2") | |
| name | Yes | Property name | |
| type | Yes | Property type | |
| default | No | Default value | |
| bind | No | Child node ID to bind this property to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses the binding behavior for TEXT and BOOLEAN types but does not mention error handling, side effects (e.g., overwriting existing properties), or required permissions. Examples provide some insight but gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with a brief header, bullet points for parameters, and separate examples. While it could be slightly more concise (e.g., removing redundant 'Parameters:' header), it is efficient and easy to parse.
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 is present, and the description does not mention return values or confirmation of success. For a mutation tool, specifying what happens on successful execution (e.g., returns the updated component) would improve completeness. Otherwise, it covers purpose, parameters, and examples adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 5 parameters with descriptions (100% coverage). Description adds value by explaining how the 'type' parameter affects binding behavior (TEXT->text, BOOLEAN->visibility) and provides concrete examples. This contextual enrichment goes 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?
Description clearly states verb ('Add') and resource ('component property') and specifies binding to child node. Differentiates from sibling tools like 'create_component' or 'list_component_props' by detailing the binding mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use each type (TEXT binds to text, BOOLEAN binds to visibility) and includes practical examples. However, lacks explicit when-not-to-use or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ask_userA
Ask the user 1-3 questions in a single form. Each question has its own options and can be single- or multi-select. Bundle related decisions in ONE call instead of multiple turns.
Use when:
The prompt is ambiguous on multiple dimensions (audience + aesthetic + length) — bundle them into one form
You need a decision before proceeding (delete existing? which section first?)
Multiple valid approaches exist and user preference matters
Returns one of:
{ answers: [...] } — array indexed to questions order. string for single-select, string[] for multi-select. The string MAY be one of the option labels OR custom text the user typed via the auto-injected "Other..." option.
{ freeText: "..." } — when the user typed a free-form answer in the chat input instead of submitting the form. Treat as authoritative — user is overriding the structured options.
Each question:
question: required prompt string. Self-contained — no separate header/label, the question text IS the heading.
options: 2-3 options, each { label, description? }. The form auto-injects an "Other..." row, so the user always sees options.length + 1 rows total — keep options ≤ 3 to stay within the 4-row visual cap.
multiSelect: optional boolean (default false). Use only when the answer is genuinely a list (e.g. "which features?"). For mutually exclusive choices keep false.
Conventions:
First option = recommended. If you have a strong default for the user, put it FIRST and add "(Recommended)" at the end of the label. The form auto-focuses the first option and the dev/auto-pick fallback selects it — both work better with a deliberate recommendation.
Do NOT include an "Other" option yourself — the form auto-injects an "Other..." row per question with an inline text input. Don't add a redundant one.
Bundle aggressively. 2 related dimensions in ONE call beats 2 sequential turns.
Example: ask_user({ questions: [ { question: "Who is this for?", options: [{label:"B2B SaaS"},{label:"Consumer"},{label:"Developer tool"}] }, { question: "What visual direction?", options: [{label:"Minimal"},{label:"Bold/Brutalist"},{label:"Neon/Cyber"}] } ]})
Skip when the prompt is already actionable — asking adds a turn and costs momentum.
| Name | Required | Description | Default |
|---|---|---|---|
| questions | Yes | 1-3 questions to present in a single form (3 is the soft cap; bundle related decisions but don't pad). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description fully discloses behavior: return format (answers array or freeText), UI behavior (auto-injected 'Other', visual cap, auto-focus), conventions, and recommended option placement.
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?
Well-structured with sections: purpose, usage, return, question details, conventions, example, skip note. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensively covers all aspects given no output schema: return values, parameter nuances, behavioral context, and usage guidelines. Leaves no gap for agent decision-making.
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?
Despite full schema coverage, the description adds critical context: conventions for recommended option, bundling, not adding own 'Other', and detailed return format. Goes well beyond schema explanations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool asks the user 1-3 questions in a single form. It distinguishes itself from sibling tools like 'describe' or 'help' by focusing on interactive decision-making.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use (ambiguity, need for decision, multiple valid approaches) and when to skip (prompt already actionable). Includes bundling advice and examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bind_variableA
Bind a FLOAT, BOOLEAN, or STRING variable to a node property.
prop is a flat Figma bindable field (e.g. fontSize, itemSpacing, paddingTop, cornerRadius, opacity, visible, width, height, characters). Shorthands: gap → itemSpacing, padding → paddingTop, corner → cornerRadius, font-size → fontSize.
COLOR variables are NOT bound here — they live inside Paint objects. To apply a color token, specify it at the source instead: • At creation: jsx <frame bg="$TokenName" ...> or fill="$TokenName" • Post-hoc: set_fill({node, bg: "$TokenName"}) or set_stroke
When selecting which variable to bind: if the node is a Tablet or Mobile variant (name or variant property contains "Tablet"/"Mobile"), match the node's property value against the Tablet/Mobile mode column from list_variables — not Desktop.
Examples: bind_variable({node: "1:2", prop: "fontSize", variable: "VariableID:1:6"}) bind_variable({node: "1:3", prop: "paddingTop", variable: "VariableID:1:7"}) bind_variable({node: "1:4", prop: "visible", variable: "VariableID:1:8"}) bind_variable({node: "1:5", prop: "characters", variable: "VariableID:1:9"})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Node ID (e.g. "1:2") | |
| prop | Yes | Flat Figma bindable field (fontSize, paddingTop, itemSpacing, visible, characters, etc.). COLOR props (fills/strokes) not supported — use set_fill/jsx. | |
| variable | Yes | VariableID to bind (FLOAT/BOOLEAN/STRING only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry the burden. It discloses that COLOR variables are not bound here and explains workarounds, plus mode selection logic. However, it does not mention that binding is a mutating operation or any required permissions, which would improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured: starts with main action, then details props, color exclusion, mode selection, and ends with examples. Every sentence adds unique value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers major aspects: supported types, prop list, color exclusion, mode selection, and examples. Lacks description of return value (e.g., success/error), but for a simple binding tool this is acceptable. Overall complete given complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all three parameters with descriptions, but the description adds significant value: lists example prop values, shorthands (gap→itemSpacing), exclusions (colors), and context for mode selection. This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool binds FLOAT/BOOLEAN/STRING variables to node properties, lists supported properties (e.g., fontSize, paddingTop), and explicitly excludes COLOR variables with references to set_fill/set_stroke. This distinguishes it well from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (binding non-color variables) and when-not-to-use (color variables, with alternative tools named). Also gives mode selection guidance for Tablet/Mobile variants, helping agents choose the correct mode column from list_variables.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clone_nodeA
Deep-copy a node with optional property overrides.
Examples: clone_node({node: "1:2"}) — clone to page root, same name clone_node({node: "1:2", parent: "/"}) — clone to page root explicitly clone_node({node: "1:2", parent: "/", name: "Hero Copy"}) — clone to root with custom name clone_node({node: "1:2", parent: "1:4"}) — clone into parent node 1:4 clone_node({node: "1:2", parent: "1:4", overrides: {"bg": "#D9D9D9"}})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Source node ID (e.g. "1:2") | |
| parent | No | Target parent node ID the clone should live inside, or "/" for page root. Defaults to page root. | |
| name | No | Name for the cloned node. Defaults to source node name. | |
| overrides | No | Property overrides. Use "Child.prop" for child overrides. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must convey behavior. It discloses deep-copy nature and optional overrides. However, it omits what the tool returns (e.g., cloned node ID) and error conditions.
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?
Extremely concise: one sentence plus five short examples. All content is front-loaded and relevant. No redundant or missing 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?
Covers the main use case well with examples for root, custom parent, name, and overrides. Lacks specification of return value (likely new node ID), but overall adequate for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptions, so baseline is 3. The description adds value through five examples showing parameter combinations and defaults, going beyond schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Deep-copy a node with optional property overrides,' which is a specific verb (clone) and resource (node). This purpose is distinct from sibling tools like move_node or delete_node.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides examples but no explicit guidance on when to use this tool versus alternatives (e.g., copy vs move vs create). Usage context is implied but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
combine_componentsB
Combine multiple components into a variant set (ComponentSet).
Examples: combine_components({nodes: ["1:2", "1:3", "1:4"], name: "Button"})
| Name | Required | Description | Default |
|---|---|---|---|
| nodes | Yes | Component node IDs to combine | |
| name | No | Component set name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No behavioral traits disclosed beyond the basic action. No mention of side effects, permissions, or constraints. Since no annotations are provided, the description fails to fill the gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence plus an example. Front-loaded, every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (2 parameters, no output schema, no annotations), the description is mostly complete with the example. However, it lacks details on return values or error conditions.
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 baseline is 3. The example adds some value by showing typical usage, but the description itself adds no extra semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Combine' and the resource 'multiple components into a variant set (ComponentSet)'. This action is distinct from sibling tools like create_component or create_instance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like create_component. No exclusions or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_collectionA
Create a VariableCollection with named modes.
The first mode in the array becomes the default mode. Returns {data: {id, modes: [{modeId, name}]}} — use those modeIds with set_variable_value and set_variable_mode.
Examples: create_collection({name: "Theme", modes: ["Light", "Dark"]}) create_collection({name: "Device", modes: ["Desktop", "Tablet", "Mobile"]})
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Collection name | |
| modes | Yes | Mode names (first becomes default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description discloses important behavior: the first mode becomes default, and the return structure includes mode IDs for use with set_variable_value and set_variable_mode. It does not mention side effects or reversibility, but for a creation tool, this is adequate.
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 succinct: one sentence for purpose, one for return and usage, and two example calls. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only two simple parameters, no output schema, and no annotations, the description covers the core information needed to use it correctly: what it does, what it returns, and how to use the return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers both parameters fully (100% coverage), and the description adds value by clarifying that the first mode in the array becomes default, and with examples showing typical usage 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 clearly states the tool creates a VariableCollection with named modes, distinguishing it from siblings like create_variable (creates a single variable) and ensure_collection (which would create or retrieve).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to use the returned modeIds with other tools and provides examples, but does not explicitly state when to use this tool versus alternatives like ensure_collection, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_componentC
Convert a frame or group to a Figma component.
Examples: create_component({node: "1:2"})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Node ID (e.g. "1:2") to convert |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only says 'convert' without disclosing side effects like whether the original node is modified or if children are affected. This is insufficient for an action that likely mutates state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and includes a concise example, which is beneficial. However, it could be slightly more structured with a clear summary.
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 only one parameter, the description lacks information about return values (e.g., confirmation, new component ID) and behavioral context. Given no annotations or output schema, this is incomplete.
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 description adds only an example, which does not provide additional meaning beyond the schema's description of the node parameter. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it converts a frame or group to a Figma component, which is a specific action on an existing node. This distinguishes it from sibling tools like create_instance or combine_components.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as create_instance or combine_components. Only an example is provided, but no context for selection or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_instanceA
Create an instance of an existing component. Mutates the canvas — appends a new InstanceNode as the last child of parent (or the active page root if omitted). The instance is LINKED to the component master, so future component edits propagate. Returns the new instance's nodeId.
Use when:
Spawning runtime copies of a Component master (buttons, list items, cards)
Reusing a design-system component in a fresh layout
Programmatic instantiation outside a jsx() tree-build
Returns: { data: { id: "5:42", name: "Button", componentId: "1:2" } }
Parameters beyond schema:
nodemust be a Component node (not Frame, Text, or another Instance). Discover IDs with find_nodes({ type: "COMPONENT" }).parentoptional. If parent is auto-layout, the instance enters the flow and inherits sizing rules. If omitted, the instance is placed at the active page root with detached position — may overlap existing content; set explicit position with edit afterwards.
Skip when:
Duplicating a non-component node — instance creation will fail; use clone_node instead.
Building a subtree from scratch — use jsx with for atomic single-call construction.
Examples: create_instance({node: "1:2"}) // at page root create_instance({node: "1:2", parent: "1:4"}) // inside frame 1:4
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Component node ID (e.g. "1:2") to instantiate | |
| parent | No | Parent node ID for placement |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: it mutates the canvas, appends as last child of parent or page root, creates a linked instance so edits propagate, and explains optional parent effects (auto-layout vs root placement, potential overlap). Return format is also documented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: succinct purpose, detailed behavior, usage conditions, return type, parameter details, skip cases, and examples. Every sentence contributes valuable information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (instance creation, linking, optional parent behavior), the description covers all necessary aspects: purpose, behavior, parameters, return value, and edge cases. The lack of an output schema is compensated by an explicit return format example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters have 100% schema coverage, but the description adds significant extra meaning: node must be a Component node (not Frame/Text/Instance), with a method to discover such nodes; parent is optional with behavioral consequences (auto-layout vs detached position, need for editing). This goes well beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Create') and resource ('instance of an existing component'), and explains the action (creates an InstanceNode linked to the component master). It distinguishes from sibling tools like clone_node and jsx by specifying when to use each.
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 'Use when' and 'Skip when' sections provide clear context: when to use (spawning runtime copies, reusing design system components, programmatic instantiation) and when not to use (non-component nodes, building subtrees with jsx). Alternative tools are named (clone_node, jsx).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_variableA
Create a variable in an existing collection.
No value is set here — use set_variable_value after. Returns {data: {id}}.
Examples: create_variable({collection: "VariableCollectionId:1:2", name: "Theme/bg", type: "COLOR"}) create_variable({collection: "VariableCollectionId:1:2", name: "spacing/md", type: "FLOAT"})
| Name | Required | Description | Default |
|---|---|---|---|
| collection | Yes | VariableCollectionId to create the variable in | |
| name | Yes | Variable name (slashes denote hierarchy in the Figma UI) | |
| type | Yes | Variable type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It discloses creation in existing collection, no value set, and return format {data: {id}}. However, it omits error conditions, idempotency, or permission requirements, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is three sentences plus two examples, front-loaded with the main purpose. Every sentence adds value, no redundancy. Examples are compact and illustrative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple creation tool with three fully-described parameters, the description covers purpose, post-creation step, and return value. Lacks details on error handling or permissions, but is reasonably complete given the tool's simplicity and absence of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with all three parameters documented. Description adds value beyond schema by explaining that slashes in name denote hierarchy in Figma UI and provides concrete examples with different types. This extra context pushes the score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Create a variable in an existing collection' with specific verb and resource. It further distinguishes from sibling 'set_variable_value' by noting that no value is set here, and provides examples demonstrating usage.
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?
Description explicitly says to use set_variable_value after creation, providing clear when-to-use guidance. It does not mention alternatives like ensure_variable, but the directive is sufficient for a well-scoped tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_vectorA
Create a vector node from SVG path data or a list of points. Use for chart lines, custom icon paths, freeform curves, or any shape that needs path data.
Examples: // Polyline (chart trend line) create_vector({ parent: "1:23", name: "TrendLine", x: 40, y: 20, width: 550, height: 240, points: [[0,144],[90,96],[180,120],[270,64],[360,80],[450,40],[540,72]], stroke: "#6366F1", strokeWeight: 2 })
// Raw SVG path (custom shape) create_vector({ parent: "1:23", name: "Wave", width: 200, height: 60, data: "M 0 30 Q 50 0 100 30 T 200 30", stroke: "linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)", strokeWeight: 1.5 })
Path input — provide ONE of: points: [[x,y], ...] compiled to "M x0 y0 L x1 y1 ..." (polyline shortcut) data: "M ... L ..." raw SVG path (LLM-native; supports M, L, C, Q, A, Z)
Stroke / fill (same formats as set_stroke / set_fill): hex "#6366F1" gradient "linear-gradient(angle, #color stop%, ...)" variable qualified bare name "$Brand/Primary"
Default fill is "transparent" so the vector shows only its stroke. Pass an explicit fill if you want it filled.
When NOT to use:
Standard rectangles / ellipses / lines — use jsx , , elements (simpler, batch-friendly)
Existing vector edits — use edit / set_stroke instead
| Name | Required | Description | Default |
|---|---|---|---|
| parent | No | Parent node ID. Omit to attach to the current page. | |
| name | No | Node name (default: "Vector"). | |
| x | No | X position relative to parent (default: 0). | |
| y | No | Y position relative to parent (default: 0). | |
| width | Yes | Vector bounds width in px. | |
| height | Yes | Vector bounds height in px. | |
| data | No | Raw SVG path string. Mutually exclusive with `points`. | |
| points | No | Polyline points as [[x,y], ...]. Compiled internally to "M x0 y0 L x1 y1 ...". Mutually exclusive with `data`. | |
| windingRule | No | Path fill winding rule (default: NONZERO). | |
| stroke | No | Stroke color — hex, gradient string, or qualified bare-name token. | |
| strokeWeight | No | Stroke weight in px (default: 1). | |
| strokeAlign | No | Stroke alignment relative to the path (default: center). | |
| fill | No | Fill — hex / gradient / variable / "transparent" (default: "transparent"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full burden. It discloses default fill transparency, mutual exclusivity of points/data, and references to stroke/fill formats from other tools. However, it does not discuss side effects, authorization needs, or potential errors, which would enhance transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: purpose sentence, examples, path input details, stroke/fill, and when-not-to-use. Each section is useful and well-organized without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters, no output schema, and no annotations, the description covers essential behavior: path input methods, defaults, stroke/fill format references, and usage guidance. Examples and prohibitions make it complete for an AI agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds significant value by explaining use cases, the two exclusive path input methods, default values, and stroke/fill formats with examples. It greatly enriches the schema information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Create a vector node from SVG path data or a list of points' and provides specific use cases like chart lines and custom shapes. It also distinguishes from sibling tools by listing when not to use (standard shapes use jsx, existing vectors use edit/set_stroke).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear when-to-use and when-not-to-use sections with explicit alternatives. Examples demonstrate typical usage, and the description explains the relationship between 'points' and 'data'. It provides practical guidance for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_nodeB
Delete a node and its children.
Examples: delete_node({node: "1:2"})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Node ID (e.g. "1:2") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must fully disclose behavior. It only states the deletion, but does not mention permanence, side effects, permissions, or whether the operation is reversible. This is insufficient for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with an example, which is efficient and front-loaded. However, it is perhaps too terse, but it 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 no annotations and no output schema, the description fails to cover essential context such as return value, recursive behavior confirmation, or error conditions. It is not complete enough for a deletion 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 describes the parameter as 'Node ID (e.g. "1:2").' The description adds no extra meaning beyond the schema, resulting in a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Delete a node and its children,' which is a specific verb and resource. This distinguishes it from sibling tools like clone_node or move_node.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool over alternatives, nor does it mention when not to use it. No context on prerequisites or constraints is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describeA
Validate a design subtree — semantic description, role detection, and lint rules. Checks for layout conflicts, overflow, missing properties, and structural issues.
Parameters: node: Node ID to describe (e.g. "100:5"). Required. depth: How deep to check children (default: 3, max: 8).
Returns per-node: role, visual summary, layout summary, and issues (severity: error/warning/info).
Examples: describe({node: "100:5"}) → validate subtree, depth 3 describe({node: "100:5", depth: 1}) → shallow check (root + direct children only)
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Node ID to describe (e.g. "100:5"). | |
| depth | No | Max depth to check (default: 3, max: 8) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description transparently discloses the tool's behavior: it validates and returns per-node data including issues with severity levels. It implies a read-only operation without side effects, though not explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: purpose sentence, bullet list of checks, parameter details, return description, and examples. No superfluous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description adequately covers return values and includes examples. It could mention that the tool does not modify state, but overall it's complete for understanding usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds little beyond schema defaults and examples. It restates the default depth value (3) and max (8), which is helpful but not substantial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool validates a design subtree with semantic description, role detection, and lint rules. It lists specific checks (layout conflicts, overflow, missing properties, structural issues), distinguishing it from sibling tools like inspect or find_nodes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for validation but does not explicitly state when to use this tool versus alternatives like inspect or discover_props. No exclusion criteria or usage context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_propsA
Discover unique property values in a subtree.
Examples: discover_props({node: "1:2", props: ["fillColor", "fontSize"]})
Searchable properties: fillColor, textColor, strokeColor, strokeWeight, opacity, cornerRadius, gap, fontSize, fontFamily, fontWeight.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Target node ID (e.g. "1:2") | |
| props | Yes | Properties to discover |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It discloses that the tool discovers unique values and lists searchable properties, but it does not mention whether the operation is read-only, potential side effects, error scenarios, or performance implications.
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 extremely concise: one sentence, one example, and a list of searchable properties. Every element is informative, and there is no wasted text. The structure is front-loaded with the purpose and then provides immediate practical details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required parameters, no output schema), the description is quite complete. It explains the purpose, provides an example, and lists acceptable property names. However, it could mention the output format (e.g., an array of unique values) or behavior on missing nodes, though this is partially mitigated by the example.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters (node and props) with clear descriptions. The description adds value by explicitly listing valid property names (e.g., fillColor, fontSize), which goes beyond the schema's generic 'Property name' and helps the agent select correct values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Discover unique property values in a subtree.' It includes an example and lists searchable properties, making the action and resource unmistakable. The tool is distinct from siblings like 'list_component_props' which lists props rather than discovering values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives or provide any contextual guidance. While the example suggests a typical use case, there is no explanation of prerequisites, when not to use it, or how it fits into a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
editA
Batch update properties on multiple nodes.
For single-property changes, prefer focused setters: set_text — text content set_fill — fill/background color set_stroke — border set_layout — padding, gap, direction
Use edit for batch fixes or properties not covered by setters (sizing, radius, opacity, effects, component props): edit({nodes: [ {node: "1:1", props: {w: "fill", corner: 8}}, // Figma native props {node: "1:2", props: {opacity: 0.6}}, {node: "1:3", props: {Label: "Sign In"}}, // instance TEXT prop (by display name) ]})
For instances, use component property DISPLAY NAMES (e.g. "Label") — edit resolves them to Figma's internal keys automatically. Component props can be mixed with Figma props in the same call.
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | Node ID (e.g. "1:2") from jsx/inspect results | |
| nodes | No | Batch: array of {node, props?, content?} objects. No hard item cap — real ceiling is LLM output stream length (~10KB+ of rendered params can stall mid-JSON). If a batch is large and props are rich, split into 2 calls. | |
| props | No | Properties to update (single mode) | |
| content | No | New text content (single mode) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses important behavioral traits: automatic resolution of component property display names, practical limits on batch size due to stream length, and the ability to mix component props with Figma props. It does not mention reversibility or undo, but covers the key aspects for an edit tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections, bullet points, and a code example. Every sentence adds value, and the main purpose is front-loaded. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (4 parameters, nested objects, no output schema), the description covers all necessary aspects: single/batch modes, examples, node ID format, stream limits, and component prop resolution. It is complete enough for an agent to use 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?
With 100% schema coverage, the description adds substantial nuance: explains node ID format, shows example usage, clarifies that props should be an object not stringified, and details the structure of the nodes array. This goes well beyond the schema's field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Batch update properties on multiple nodes' and distinguishes itself from focused setters like set_text, set_fill, set_stroke, set_layout. It provides specific use cases and examples, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'prefer focused setters' for single-property changes and lists them, then defines when to use edit: 'batch fixes or properties not covered by setters'. This provides clear when-to-use and when-not-to-use guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ensure_collectionA
Idempotent VariableCollection creation — safe to retry.
Returns existing collection if one with the same name + identical mode list already exists, otherwise creates a new one. Spec §3.1.
Prefer this over create_collection — re-running with the same name + modes returns the existing collection instead of creating a duplicate.
Omit idempotency_key — the handler computes it canonically from (name, modes). Pass it only if you need strict concurrency-safety validation (LLMs should not try to compute SHA-256 inline; placeholder strings are rejected).
Returns {data: {collection_id, modes: [{modeId, name}], reused?: true}}.
Examples: ensure_collection({name: "Theme", modes: ["Light", "Dark"]})
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Collection name | |
| modes | Yes | Mode names (first becomes default) | |
| idempotency_key | No | Optional. Handler auto-computes canonically if omitted. Pass only if you need strict concurrency-safety validation against the SHA-256 formula in spec §3.1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses idempotent behavior, return shape (including reused flag), canonical key computation, and rejection of placeholder strings. All critical behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise and well-structured: starts with core concept, then conditions, return format, and an example. Every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no annotations or output schema, the description covers all needed aspects: idempotency, parameter usage, return shape, and an example. An agent can confidently invoke this tool with the given 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 coverage is 100%, baseline 3. Description adds value by explaining the idempotency_key's role and the 'canonical' computation, warning against manual SHA-256, and clarifying that the first mode becomes default. This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it's for 'Idempotent VariableCollection creation' and distinguishes itself from the sibling 'create_collection' by explaining that it returns an existing collection instead of duplicating. The verb 'ensure' implies idempotency, and the description reinforces this.
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 advises 'Prefer this over create_collection' for idempotent creation, and provides guidance on when to omit or pass the idempotency_key. No ambiguity about use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ensure_variableA
Idempotent variable creation — populates values_by_mode in one shot.
Prefer this over create_variable — re-running with the same args returns the existing variable instead of creating a duplicate.
Behavior (spec §3.1):
Exactly 1 variable with (collection_id, name, type) in target collection → idempotent reuse.
0 in target, matches in OTHER collections → create new in target + warning NAME_EXISTS_OUTSIDE_TARGET_COLLECTION.
0 anywhere → create new.
2+ in target collection (Figma allows duplicates) → fail SAME_COLLECTION_NAME_DUPLICATE.
values_by_mode keys can be either mode NAMES (e.g. "Light") or modeIds (e.g. "1:0"). Each value must match the variable type (hex/RGBA for COLOR, number for FLOAT, string for STRING, boolean for BOOLEAN).
Omit idempotency_key — the handler computes it canonically from (collection_id, name, type, values_by_mode). Pass it only if you need strict concurrency-safety validation (LLMs should not try to compute SHA-256 inline; placeholder strings are rejected).
Mode coverage policy (spec §6.2):
mode_coverage_required: 'all' (default) — every mode in the collection must have an explicit value. set_fill / bind_variable will REJECT bindings that fall through to a missing mode (MISSING_MODE_VALUES).
mode_coverage_required: 'opt-in-fallback' — fallback to default mode is intended. Bindings emit FALLBACK_BINDING warning instead of failing. Caller MUST provide fallback_reason containing the structured phrase "fallback to " (machine-greppable).
Returns {data: {variable_id, name, type, collection_id, mode_coverage[], mode_coverage_required, reused?: true}, warnings?: [...]}.
Examples: ensure_variable({collection_id: "VariableCollectionId:1:2", name: "Text/Primary", type: "COLOR", values_by_mode: {Light: "#111", Dark: "#EEE"}}) ensure_variable({collection_id: "VariableCollectionId:1:2", name: "Spacing/desktop", type: "FLOAT", values_by_mode: {Desktop: 24}, mode_coverage_required: "opt-in-fallback", fallback_reason: "Desktop-only metric; fallback to Desktop in Mobile mode."})
| Name | Required | Description | Default |
|---|---|---|---|
| collection_id | Yes | Target VariableCollectionId — strict ID, no name lookup. | |
| name | Yes | Variable name (slashes denote hierarchy). | |
| type | Yes | Variable type | |
| values_by_mode | Yes | Map of mode name OR modeId → value. Hex strings allowed for COLOR. | |
| idempotency_key | No | Optional. Handler auto-computes canonically if omitted. Pass only if you need strict concurrency-safety validation against the SHA-256 formula in spec §3.1. | |
| mode_coverage_required | No | Mode coverage policy — "all" (default; every mode must have explicit value) or "opt-in-fallback" (allow fallback, requires fallback_reason). | |
| fallback_reason | No | REQUIRED iff mode_coverage_required="opt-in-fallback". Must contain the structured phrase "fallback to <mode_name>". Persisted on the variable for audit trail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully bears the burden of behavioral transparency. It explains idempotent behavior in detail (four bullet-pointed cases), return structure, and special handling of mode coverage and fallback scenarios. The description is comprehensive and leaves no ambiguity about the tool's 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 relatively long but justified by the tool's complexity (7 parameters, nested objects, multiple behavioral cases). It is well-structured with clear sections and bullet points. Every sentence adds value, though some minor redundancy exists in repeating parameter details already in the schema. Overall, it strikes a good balance between completeness and conciseness.
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 (7 parameters, nested objects, no output schema), the description provides complete coverage. It explains the return value structure, behavioral edge cases, and mode coverage policy in detail. The absence of annotations and output schema is fully compensated by the rich description, making the tool easy to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, but the description adds significant value beyond the schema. It clarifies that values_by_mode keys can be mode names or modeIds, explains the type matching requirement, and provides examples of valid values. The description also expands on the mode_coverage_required and fallback_reason parameters with behavioral details not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is for idempotent variable creation, specifying the action (create variable) and resource (variable), and explicitly distinguishes from the sibling tool create_variable by recommending 'Prefer this over create_variable'. The verb 'ensure' combined with the behavior description gives a specific, non-ambiguous purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends preferring this tool over create_variable, explains when to use idempotency_key (only for strict concurrency-safety), and details mode coverage policy with explicit conditions for 'all' versus 'opt-in-fallback'. It provides clear context for when to use and when not to use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_nodesA
Search nodes by name or type. Scoped to the current page — call switch_page first if your target lives on a different page.
Examples: find_nodes({query: "Button"}) find_nodes({query: "frame", scope: "1:2"})
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query — matches node name or type | |
| scope | No | Limit search to subtree. Node ID (e.g. "1:2"). Default: entire page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses scoping constraint (current page) and default scope behavior, but no annotations exist to cover read-only or side effects. Does not state whether operation is safe or idempotent, leaving some behavioral ambiguity.
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 succinct sentences plus two examples. No wasted words. Purpose and critical constraint front-loaded immediately.
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 essential context: purpose, parameter defaults, page-scoping prerequisite. No output schema exists, so return format is not expected. Could mention case-sensitivity or partial matching, but overall adequate.
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?
Input schema already has full coverage (100%). Description adds value by clarifying scope default ('entire page') and providing a concrete node ID format example ('1:2'), which schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Search nodes by name or type' with specific verb+resource. Examples reinforce purpose. Distinguishes from sibling tools by explicitly noting scoping to current page and referencing switch_page for cross-page searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells agent to call switch_page if target is on a different page, providing clear when-to-use guidance. Examples show typical usage patterns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_referencesA
Find every node on the current page that references a given variable.
This is the REVERSE of inspect: inspect asks "what does this node bind?", find_references asks "who uses this variable?". Use it when renaming, auditing, or swapping tokens — you need to know all the binding sites before you touch the variable.
Scan scope: currentPage only. Invisible nodes are skipped by default. Node-level bindings (e.g. boundVariables.paddingLeft) and per-paint color bindings (fills[i].boundVariables.color, strokes[i].boundVariables.color) are both returned.
Parameters: variable — VariableID (e.g. "VariableID:1:5"). Required.
Returns: {variable, variableName, variableType, referenceCount, references: [{nodeId, nodeName, nodeType, path}, ...]}
path values look like: "boundVariables.paddingLeft" "fills[0].boundVariables.color" "strokes[2].boundVariables.color"
Examples: find_references({variable: "VariableID:1:5"})
| Name | Required | Description | Default |
|---|---|---|---|
| variable | Yes | VariableID to look up (e.g. "VariableID:1:5"). Get IDs from list_variables. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses scan scope (currentPage), behavior (invisible nodes skipped), and types of bindings returned. Lacks explicit read-only hint, but non-destructive nature is clear. 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?
Well-structured with clear sections, examples, and minimal redundancy. Every sentence adds 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?
Complete for a single-parameter tool with no output schema; description explains return structure and path examples. No gaps.
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%, description adds example and source hint ('Get IDs from list_variables'), providing value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it finds nodes referencing a variable, with a specific verb and resource. Differentiates from sibling 'inspect' by contrasting reverse behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use (renaming, auditing, swapping tokens) and contrasts with inspect. Also specifies scope and default skipping of invisible nodes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_screenshotA
Capture a PNG screenshot of a node.
Use after style changes to visually verify the result instead of reading properties back. Returns base64 PNG data embedded in the response.
Parameters: node: Node ID from jsx/inspect results (e.g. "100:5"). Page root ("/") is not supported. scale: Export scale 0.5–2 (default 1). Higher = larger file. padding: Reserved for future use — currently ignored.
Examples: get_screenshot({node: "100:5"}) → PNG at 1x get_screenshot({node: "100:5", scale: 2}) → PNG at 2x (sharper)
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Node ID (e.g. "100:5"). Page root "/" is not supported. | |
| scale | No | Export scale 0.5–2 (default 1). | |
| padding | No | Reserved for future use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Notes return format (base64 PNG) and unsupported page root. No annotations provided, so description carries burden; it adequately discloses behavior without contradictions.
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?
Concise lead sentence, followed by usage guide, return info, parameter list, and examples. No redundant or unnecessary content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, when to use, parameters, and return format. With no output schema, it sufficiently describes output. Complete for a capture 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%, but description adds examples, default value, and notes on padding (future use), providing significant added value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it captures a PNG screenshot of a node, distinct from sibling tools that deal with properties, components, or other 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?
Provides explicit guidance to use after style changes for visual verification, implying alternative of reading properties. Does not name a specific sibling, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_selectionA
Get the user's currently selected nodes in Figma.
Returns node names, types, and IDs of selected elements. Call this when the user's intent involves modifying existing elements:
"change this button", "update the card", "fix the spacing"
References to "this", "the selected", "it"
Skip for fresh design requests ("design a login page", "create a dashboard") — a new canvas has no selection to read, so the call returns nothing and burns an iteration.
Examples: get_selection()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that calling with no selection returns nothing and wastes a turn, which is key for an AI agent. Also describes return content (names, types, IDs). No annotations exist to contradict. Could mention error cases or behavior on multiple selections, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise with clear front-loading: purpose, then usage guidance, then example. No superfluous sentences; every part adds 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?
Despite no output schema, description explains return values. Covers when to use and when not. With zero parameters and clear purpose, the description provides complete context for an agent to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema, so baseline 4. Description adds no parameter info, which is acceptable as there are none to describe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get the user's currently selected nodes in Figma', a specific verb and resource. It differentiates well from sibling tools by focusing on reading selection rather than modification or creation.
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 lists when to call (modifying existing elements, references to 'this', 'the selected', 'it') and when to skip (fresh design requests). Provides concrete examples of user intents and warns about burning iterations on empty canvases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
guidelineA
Load a page-type design guideline — layout patterns for landing pages, dashboards, login flows, forms, etc.
Example: guideline({ name: "form" })
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The guideline name exactly as it appears in the KNOWLEDGE LIBRARY menu — no "guideline:" prefix, no quotes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool loads a guideline but does not disclose any behavioral traits (e.g., read-only, side effects, error behavior, or what happens if the name is invalid). The example suggests a return, but no details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus an example, with no redundant information. It front-loads the purpose and immediately gives a concrete usage example.
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 simplicity (one parameter, no output schema, no annotations), the description is nearly complete. It covers purpose, parameter usage, and a use case. Missing a brief note on return value or outcome, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a detailed description for the 'name' parameter. The description adds an example and categorization of guidelines, but does not significantly enhance the schema's clarity. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (load) and resource (page-type design guideline) and gives concrete examples of guideline types (landing pages, dashboards, forms). It distinguishes itself from sibling tools, none of which load guidelines.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an example invocation, which implies usage, but does not explicitly state when to use this tool vs alternatives or when not to use it. No guidance on preconditions or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helpB
Load narrow how-to / process help — tool usage rules, edge cases, naming conventions.
Example: help({ name: "interaction-model" })
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The help name exactly as it appears in the KNOWLEDGE LIBRARY menu — no "help:" prefix, no quotes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It implies a read-only operation (loading help) but does not disclose any behavioral traits such as side effects, authentication needs, or rate limits. The basic purpose is clear but transparency is minimal.
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 extremely concise: two sentences and an example. Every part is useful, and it is front-loaded with the core purpose. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description is adequate. However, it does not mention what the tool returns (e.g., help text). Given no output schema, a hint about the return value would improve completeness. Still, it covers the essential usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the input schema already describes the 'name' parameter well, the description adds value by specifying the kind of help content and providing a concrete example. This aids correct invocation beyond schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool loads 'narrow how-to / process help' and specifies the content types (tool usage rules, edge cases, naming conventions). It is specific and distinguishes from siblings implicitly as the only help tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'describe' or 'inspect', nor any mention of situations where it should not be used. The description lacks usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspectA
Read design node(s) — choose what to surface with facets.
Default (no facets) returns a skeleton: id, name, type, role, children. For anything else, list the facets you need — nothing else is included.
Facets: structure name, type, size, layout shorthand — cheap overview layout layoutMode/gap/padding/align/sizing (row/column, fill/hug, etc.) paint|fill fills + Paint.boundVariables.color (see bound tokens) stroke strokes, strokeWeight, strokeAlign, dashPattern effects shadows, blurs typography|text fontFamily, fontSize, fontWeight, lineHeight, letterSpacing appearance opacity, visible, blendMode, cornerRadius, clipsContent variables node-level boundVariables + explicitVariableModes (token bindings) all everything
Parameters: node "/" for page root, or node ID from jsx/inspect results (e.g. "100:5"). facets array of facet names listed above. depth Max tree depth (default: 5, max: 10).
Examples: inspect({node: "/"}) → page skeleton inspect({node: "100:5"}) → one-node skeleton inspect({node: "100:5", facets: ["variables"]}) → token bindings only inspect({node: "100:5", facets: ["layout", "paint"]}) → layout + fills inspect({node: "100:5", facets: ["all"]}) → full properties
Use get_screenshot for visual verification. Use describe for lint/validation.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | "/" for page root, or node ID (e.g. "100:5"). | |
| facets | No | Property buckets to surface. Omit for a skeleton-only response. | |
| depth | No | Max depth (default: 5, max: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: it's a read-only operation that returns a skeleton or specified facets. It explains what each facet returns, parameter constraints (depth max 10), and default output. No destructive or side effects are implied, and the examples clarify usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: a one-sentence summary, default behavior, a bulleted list of facets with explanations, parameter descriptions, and a set of examples. Every sentence is informative and earns its place without redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains return values in detail: skeleton fields and facet contents. It covers all 3 parameters with defaults and constraints. Examples illustrate various use cases. The tool's complexity is fully addressed without gaps.
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%, but the description adds significant value beyond the schema: it explains the node parameter format ('/' for root, node IDs), the meaning and grouping of facets (e.g., 'paint|fill' combined), and provides concrete examples that illustrate parameter combinations. The facets enum is elaborated with plain-English descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Read design node(s)' — a specific verb and resource. It explains the facet system to control output granularity. The last line explicitly distinguishes from sibling tools like get_screenshot and describe, providing clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description details when to use the tool (reading node properties) and explicitly recommends alternatives: 'Use get_screenshot for visual verification. Use describe for lint/validation.' It also explains default behavior versus facet usage, guiding the agent on when to supply facets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsxA
Create design trees with nested JSX markup. One jsx call builds a complete subtree atomically — nesting is the hierarchy. Keep a single logical unit inside one call; the returned root's children are already built, not stubs to be filled in later.
Examples: jsx({markup: ""}) jsx({markup: "Account"})
Elements: frame, text, rect, ellipse, line, icon, image, instance, component, group, section, vector Attributes (frame): layout, justify, items, wrap, w, h, minW, maxW, p, gap, bg, fill, rounded, stroke, shadow, blur, bgblur, opacity, layoutPositioning Attributes (text): size, weight, lineHeight, font, fill, w (w="fill" for wrap), maxLines, textTruncation Effects: shadow="0,8,32,0,#0006" or shadow={shadow(0,8,32,0,'#0006')}; blur={10} for layer blur; bgblur={20} for frosted-glass/glassmorphism background blur. Multiple effects merge automatically. Decoration in auto-layout: floating orbs/blobs/decorative shapes inside a row/column parent need layoutPositioning="absolute" so they don't get stacked into the main-axis flow. Full-frame backgrounds: set the parent frame's bg directly. Don't add a separate backdrop. Supported gradient strings (CSS-like subset, not full CSS):
linear-gradient(deg, <#hex> %, ...) e.g. "linear-gradient(135deg, #A 0%, #B 100%)"
linear-gradient(to , ) directions: top/right/bottom/left and corners (e.g. "to bottom right")
radial-gradient() centered, ellipse-fill — no position/shape modifiers
radial-gradient(circle, ) centered, circle shape only
conic-gradient(from deg, ) Unsupported (will be rejected): "circle at X% Y%", "ellipse at ...", "X% Y%" position syntax, named colors (red/blue/...), hsl(), and numeric stops without a percent sign. Text: content here Instance: Self-closing: (use line for dividers/separators; rect/ellipse for SMALL pure decoration with no children — page-level backgrounds belong on the parent frame's bg) Arc/Ring: (arc="start end innerRadius?" — innerRadius 0-1 makes a donut/ring) Grid layout: call help({ name: "grid-layout" }) for tracks, gaps, and when row/column is a better fit Variable binding: fill/bg/stroke accept qualified bare-name token strings (e.g. bg="$Theme/Bg/Surface"). Object literals (fill={{variable_id:...}}) drop the binding silently — always use the string form.
Swap an existing subtree: jsx({replaceId: "", markup: "..."}) replaces the old node at the same parent and sibling index atomically, preserving position in one call. Markup must have a single root. Use jsx for tree creation; edit for property updates on known nodes.
| Name | Required | Description | Default |
|---|---|---|---|
| markup | Yes | JSX-like nested markup string | |
| parent | No | Target parent node ID — the frame/container the new subtree will live inside | |
| replaceId | No | Replace this existing node in-place (keeps parent + sibling index). Old node is deleted on success. Markup must be single-root. Mutually exclusive with parent. | |
| insertIndex | No | Position among parent siblings (0 = first). Omit to append at end. Ignored when replaceId is set (inherits old node index). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses atomic build behavior, replacement semantics (delete old node), supported/unsupported gradient patterns, effect merging, and self-closing rules. Missing details on error handling or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with front-loaded purpose, then examples, then detailed sections. Slightly verbose in listing all supported elements and attributes, but justified given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, parameters, syntax, behavioral nuances, and references sibling tools. Missing return value description and error handling, but overall comprehensive for a complex tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds significant value: explains mutual exclusivity of parent and replaceId, inherit behavior of insertIndex with replaceId, and provides extensive markup syntax examples, attribute lists, and special cases for gradients, effects, and variable binding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates design trees with nested JSX markup, building complete subtrees atomically. It distinguishes from sibling tools like edit and help by specifying that jsx is for tree creation, not property updates or grid layout queries.
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 guidance on when to use this tool (tree creation, replacement) versus alternatives (edit for property updates, help for grid layout, help for grid-layout). Includes examples and specific use cases like swap with replaceId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_component_propsA
List properties and variants of a component, component set, or instance.
Examples: list_component_props({node: "1:2"})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Component/instance node ID (e.g. "1:2") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; the description states it's a read operation (listing) but does not mention behavior for invalid nodes, permissions, or response format.
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?
Extremely concise with two sentences, including an example. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a simple read tool but could be improved by mentioning output format or error conditions given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and describes the parameter well. The description adds no extra semantic meaning beyond the example.
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 verb 'list' and identifies the resource as 'properties and variants of a component, component set, or instance', clearly distinguishing it from siblings like add_component_prop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an example but lacks explicit guidance on when to use this tool versus alternatives such as discover_props or add_component_prop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_variablesA
List variables as a flat array with referenced collections.
Returns {data: {variables[], collections[], nextCursor?}}. Each variable carries its full Figma shape: id, name, variableCollectionId, resolvedType, valuesByMode. collections[] only includes collections referenced by the returned variables (use for mode-name resolution).
Parameters: collection — VariableCollectionId to filter by filter — substring match on variable name (case-insensitive) cursor — opaque pagination cursor from a previous call limit — max variables per page (default 100)
Examples: list_variables() list_variables({collection: "VariableCollectionId:1:2"}) list_variables({filter: "bg"}) list_variables({cursor: "100"})
| Name | Required | Description | Default |
|---|---|---|---|
| collection | No | VariableCollectionId to filter by | |
| filter | No | Substring match on variable name (case-insensitive) | |
| cursor | No | Opaque pagination cursor from a previous call | |
| limit | No | Max variables per page (default 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explains the return shape (variables[], collections[], nextCursor?), clarifies that collections only include referenced ones, and mentions pagination via cursor. This provides sufficient transparency for a read-only list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with no wasted words. It front-loads the purpose, then leverages bullet-style parameter explanations and examples, making it easy to scan. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 optional parameters, no output schema, and no annotations, the description is complete. It covers the return shape, all parameters with additional context, pagination, and provides diverse examples. No gaps are apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaningful details: 'case-insensitive' for filter, 'default 100' for limit, and 'opaque pagination cursor' for cursor. This goes beyond the schema descriptions, adding practical usage information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List variables as a flat array with referenced collections.' It identifies the specific verb (list) and resource (variables), and the mention of 'referenced collections' differentiates it from other variable-related tools like bind_variable or create_variable, which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides examples and parameter details, implying usage scenarios, but it does not explicitly state when to use this tool versus alternative listing methods (e.g., if there were a search_variables tool). No guidance on when not to use it or which situations are inappropriate is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_nodeA
Relocate a node without recreating it. Preserves IDs, bound variables, and component instances across the move, so callers tracking the node by ID never need to re-discover it. Use for: (a) changing child order within a container, (b) moving a subtree into a different parent, (c) fixing a placement mistake after jsx.
Examples: move_node({node: "1:3", name: "NewTitle"}) — rename in place move_node({node: "1:3", parent: "1:4"}) — move into parent 1:4 move_node({node: "1:5", index: 0}) — reorder within current parent
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Node ID (e.g. "1:3") to move/rename | |
| parent | No | Target parent node ID — the frame/container the node should live inside after the call | |
| name | No | New name (rename without changing parent) | |
| index | No | Reorder position among siblings. 0 = first, -1 = last. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behavioral traits: preservation of IDs, bound variables, and component instances. It does not detail failure modes or permissions, but covers essential identity-preserving 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 concise, well-structured with a clear start, bullet-point use cases, and concrete examples. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage, parameters, and behavior. However, without an output schema, it does not describe return values or error conditions, which slightly lowers completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value beyond schema descriptions through examples that show parameter combinations and index semantics (-1 for last). This helps the agent understand usage 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 clearly states the tool relocates a node while preserving IDs, bound variables, and component instances, distinguishing it from clone_node or delete_node. Examples clarify specific use cases like reordering or changing parent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists three scenarios (changing child order, moving subtree, fixing placement) where the tool should be used. It does not mention when to use alternatives, but the context of sibling tools provides options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_plugin_dataA
Read plugin data (private or shared) from a Figma node.
Use for: i18n metadata, design-system tags, custom plugin annotations, anything stored via setPluginData / setSharedPluginData.
If namespace is omitted, reads private pluginData (node.getPluginData(key)).
If namespace is provided, reads sharedPluginData (node.getSharedPluginData(namespace, key)).
Returns {value: ""} (empty string) when the key does not exist — Figma's API never throws here.
Examples: read_plugin_data({node_id: "1:5", key: "ref"}) read_plugin_data({node_id: "1:5", namespace: "i18n", key: "ref"})
| Name | Required | Description | Default |
|---|---|---|---|
| node_id | Yes | Figma node id (resolve via find_nodes / get_selection first). | |
| namespace | No | Optional sharedPluginData namespace. Omit for private pluginData. | |
| key | Yes | Key to read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description explains the return value `{value: ''}` for missing keys and notes Figma's API never throws. It also clarifies the difference between private and shared data. No mention of auth or rate limits, but these are typical for the platform.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: purpose, use cases, parameter behavior, return value, and examples. Every sentence serves a clear purpose.
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 fully covers return value behavior and parameter semantics. Examples provide practical context. No obvious gaps are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by explaining how to resolve node_id and how namespace controls private vs shared access. Examples further clarify parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read plugin data (private or shared) from a Figma node' with specific verb and resource, and distinguishes itself from siblings like write_plugin_data. Provides explicit use cases such as i18n metadata and design-system tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use private vs shared plugin data via the namespace parameter. It includes examples but lacks explicit when-not-to-use guidance relative to sibling tools, though the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_propsA
Bulk find-and-replace property values across a subtree (target node + all descendants). Destructive batch mutation — no preview, no undo across many nodes. Returns per-rule match counts.
Use when:
Theming pass: change every #FFF fill to #000 across a screen
Token migration: bump every fontSize from 14 to 16
Normalizing values left inconsistent by earlier passes
The alternative is N targeted single-node calls (set_text / set_fill / edit)
Returns: { data: { replacements: [{ rule: 0, matched: 12 }, { rule: 1, matched: 0 }] } }
Parameters beyond schema:
nodeis the subtree root; search recurses into all descendants (depth-first).Each rule's
fromis an EXACT-match string (no substring, no regex). For typed props (fontSize, opacity), pass values as strings — the executor coerces.Zero matches do NOT error — they return matched: 0. Sanity-check with discover_props first if you're unsure values exist.
Skip when:
Updating a single known node — use set_text / set_fill / set_stroke / set_layout for type-aware single-intent edits, or edit for generic.
Values are variable-bound (tokens) — replace_props bypasses bindings; use bind_variable to swap the token instead.
You need partial / fuzzy match — replace_props is exact-only; you'll need find_nodes + a loop.
Examples: // single rule, white -> black replace_props({node: "1:2", rules: [{prop: "fillColor", from: "#FFF", to: "#000"}]})
// batch theme update — both rules applied in one pass replace_props({node: "1:2", rules: [ {prop: "fillColor", from: "#FFF", to: "#000"}, {prop: "fontSize", from: "14", to: "16"} ]})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Target node ID (e.g. "1:2") | |
| rules | Yes | Replacement rules |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description carries full burden. It discloses destructive nature (no preview/undo), exact-match behavior, no error on zero matches, and bypassing variable bindings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is lengthy but well-structured with sections, bullet points, and examples. Every sentence adds value; front-loaded purpose.
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 provides return format and match counts. It also suggests using discover_props for sanity checks, covering important context for a destructive batch 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 covers 100% of parameters, but description adds meaning: node recursion, exact-match string, typed props as strings, batch application of rules, and examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs bulk find-and-replace on property values across a subtree, with specifics on being destructive and batch. It distinguishes from siblings like set_fill, set_text, and edit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use (theming, token migration) and when to skip (single node, variable-bound values, fuzzy match), with alternative tools named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_noteA
Read / write your own session scratchpad. Persists across turns within one design session ("New Design" resets it). Notes are how state carries from this turn into the next — the next session loads them as context.
Actions: action: "read" → read({key}) returns the current value (empty string if unset) action: "write" → write({key, value}) replaces or deletes (pass value:"" to delete) action: "list" → list({}) returns [{key, chars}] for all existing notes
Slots — FORWARD-LOOKING (what we plan / commit to):
plan — this turn's intent + step outline (write at turn start)
decisions — locked choices: style picked + reason, accent token, font scale, hero treatment, etc. (write BEFORE jsx)
brand — durable brand notes pulled from a project design.md (if user supplied one)
todo — TRULY unfinished work for the next turn (omit if everything shipped)
Slots — BACKWARD-LOOKING (what happened, write AT TURN END — AUTO-MERGE on write):
failures — tool calls that failed this turn + how you worked around them. Example: "jsx items='stretch' rejected (DSL valid: center|start|end|space-between|baseline); retried with 'center'." If a failure repeats a class you've seen before, name the class.
gotchas — validator warnings you noticed but chose not to fix + why. Example: "4 LOW_CONTRAST on nav links (2.5:1) — deliberate for ambient-grey style; revisit if user complains." Also: magic numbers / hand-tuned positions and what motivated them. Example: "Glow ellipses at (-180, 220) / (1060, 70) — placed half outside frame to bleed in."
learnings — surprises about this codebase / DSL / Figma API. Example: "radial-gradient(circle at X% Y%) rejected — DSL only takes the simple form. Same trap as CSS-prior bleed elsewhere."
BACKWARD-LOOKING slots auto-merge: writing to failures / gotchas / learnings appends to prior content after a "---" divider — your new value never silently overwrites accumulated retrospective notes. To replace fresh, first write({value: ""}) to clear, then write again. The result data.merged=true flag confirms when merge happened.
REQUIRED behavior:
First turn: write at least
decisionsBEFORE any jsx (commit-before-act).Subsequent turns:
readdecisionsandlearningsBEFORE any jsx — those slots survive across turns and your conversationHistory won't carry the full content reliably. Your turn's adjacent snapshot also surfaces current notes, but explicitreadproves you considered them.Every turn end: write at least ONE of
failures / gotchas / learningsif ANY of these happened this turn: • a tool call returned an error • a tool call returned warnings you chose not to fix • you hand-tuned a coordinate / size / color away from a value the model would have picked • you found a DSL behavior that surprised you "All clean, no carry-over" is almost never accurate — at least one backward slot belongs.jsx that uses a color / font / size should round-trip through
decisions(token traceability).
Examples: session_note({action: "write", key: "decisions", value: "Style: fintech-dark.\nAccent: #3B82F6 (style.accent — NOT indigo).\nFont: Space Grotesk display / Inter body.\nHero treatment: split (overrides anatomy VERTICAL — desktop convention).\nH1 size: 32 (style.display)."}) session_note({action: "write", key: "failures", value: "jsx #6 align='stretch' rejected (DSL valid: center|start|end|space-between|baseline) — retried with 'center'. Same CSS-prior class as gradient: model has CSS values that DSL doesn't accept."}) session_note({action: "write", key: "gotchas", value: "8 LOW_CONTRAST warnings on nav links + secondary CTA (2.5:1 against dark bg). Left as-is — user prompt didn't require WCAG pass; flagging in case next iteration tightens contrast."}) session_note({action: "write", key: "learnings", value: "layoutPositioning='absolute' children render correctly inside auto-layout frame, but parent needs clipsContent=true to suppress overflow on big glow ellipses."}) session_note({action: "read", key: "decisions"}) session_note({action: "list"})
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | read | write | list | |
| key | No | Note key. Required for read/write. Recommended slots: plan, decisions, brand, todo. | |
| value | No | Markdown body for write. Pass "" to delete. Ignored for read/list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully bears the burden of behavioral disclosure. It explains persistence across turns, auto-merge behavior for backward-looking slots, deletion semantics, and the merged flag on writes. This leaves no ambiguity about tool 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 well-structured with clear sections (Actions, Slots, Backward-looking slots, Required behavior, Examples) and front-loaded with the core purpose. While lengthy, every part serves a purpose given the tool's complexity. It could be slightly shorter but remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (three actions, slot conventions, auto-merge, turn-cycle requirements, examples) and the absence of an output schema, the description covers all necessary behavioral aspects. It ensures an agent can correctly invoke the tool in any scenario, including edge cases like deletion and auto-merge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant meaning beyond the schema: it defines the three actions with expected parameters, explains slot conventions (plan, decisions, etc.), details auto-merge mechanics, and provides examples. This greatly enriches semantic understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Read / write your own session scratchpad.' It differentiates from sibling tools by emphasizing its role as a persistent state carrier across turns. The three actions (read, write, list) are explicitly defined, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit, actionable usage guidelines: first turn write decisions before jsx, subsequent turns read decisions and learnings before jsx, and every turn end write at least one backward-looking slot. It also explains when not to use (e.g., clearing slots before overwriting) and offers examples for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_fillA
Set fill or background color on a node.
set_fill({node: "1:2", bg: "#F5F5F5"}) set_fill({node: "1:2", fill: "#333333"}) set_fill({node: "1:2", bg: "linear-gradient(135deg, #8B5CF6 0%, #F97316 100%)"})
// Batch — bulk paint update in one call: set_fill({nodes: [{node: "1:2", bg: "#FFF"}, {node: "1:3", bg: "#F5F5F5"}]})
fill = text color or shape fill. bg = frame background. For stroke color, use set_stroke.
Accepted color formats (for fill or bg): hex "#FFF", "#F5F5F5" gradient string CSS-like subset, not full CSS: "linear-gradient(deg, <#hex> %, ...)" "linear-gradient(to , ...)" directions: top/right/bottom/left + corners "radial-gradient()" centered, no position/shape modifiers "radial-gradient(circle, )" circle shape only "conic-gradient(from deg, ...)" Rejected: "circle at X% Y%", "ellipse at ...", named colors, hsl(). variable token qualified bare name "$Surface/Card" transparent "transparent" (bg only)
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | Node ID (single mode) | |
| fill | No | Text color or shape fill — hex, gradient string, or qualified bare-name token | |
| bg | No | Background — hex, gradient string, "transparent", or qualified bare-name token | |
| nodes | No | Batch: [{node, fill?, bg?}] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses accepted color formats (hex, gradients, variable tokens, transparent), explicitly rejects certain gradient patterns (e.g., 'circle at X% Y%'), and notes that 'transparent' is bg-only. This is highly transparent about tool behavior and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but well-structured with examples, bullet points, and clear sections. Every sentence adds value, and the format specifications are necessary given the complexity. Minor verbosity prevents a perfect score, but it remains readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers all parameters, usage modes, and format constraints. However, it does not mention return values or error cases (e.g., what happens with invalid input). Given the absence of an output schema, this is a minor gap, but the core functionality is well-explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds substantial meaning beyond the schema: it explains the semantic difference between fill and bg, provides concrete examples, details accepted formats, and describes the batch parameter structure. This significantly aids correct usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sets fill or background color on a node, with examples for single and batch modes. It distinguishes between fill (text/shape fill) and bg (frame background) and differentiates from sibling set_stroke.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit alternatives ('For stroke color, use set_stroke') and includes example calls. It does not explicitly state when not to use the tool, but the examples and format restrictions serve as implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_layoutB
Set auto-layout properties on a container.
set_layout({node: "1:2", gap: 16, p: 24}) set_layout({node: "1:2", layout: "row", justify: "space-between"}) set_layout({node: "1:2", layout: "column", gap: 8, p: "16 24", align: "center"}) set_layout({node: "1:2", layout: "grid", cols: 3, rows: 2, gap: 16})
// Batch — bulk update in one call: set_layout({nodes: [{node: "1:2", gap: 16, p: 24}, {node: "1:3", gap: 8, p: 12}]})
Controls spacing, padding, direction, and alignment of a container's children. Grid: use layout:"grid" with cols/rows + gap (or rowGap/colGap for asymmetric). Children fill the grid in insertion order.
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | Node ID (single mode) | |
| layout | No | Auto-layout mode | |
| gap | No | Spacing between children (px). On grid sets both row+column gap. | |
| rowGap | No | Grid row gap (px, grid only) | |
| colGap | No | Grid column gap (px, grid only) | |
| cols | No | Grid column count (required when layout="grid") | |
| rows | No | Grid row count (required when layout="grid") | |
| p | No | Padding — number, "v h", or "t r b l" | |
| justify | No | Main axis (flex only) | |
| align | No | Cross axis (flex only) | |
| wrap | No | Wrap behaviour (flex only) | |
| nodes | No | Batch: [{node, layout?, gap?, p?, ...}] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose whether the operation is destructive (overwrites existing settings), what permissions are needed, or any side effects. Partial information is given for grid mode (children fill in insertion order), but overall insufficient.
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 moderately sized and front-loaded with examples followed by a clear summary. It is not overly verbose, though some examples could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (12 parameters, no output schema), the description covers main use cases with examples and grid-specific details. However, it lacks information on return values, error handling, or default behaviors, leaving gaps for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds examples that illustrate parameter combinations but does not provide additional semantic meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it sets auto-layout properties on a container and lists the controlled aspects (spacing, padding, direction, alignment). It distinguishes itself from sibling set_* tools by focusing on container layout.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides examples for different layout modes and batch usage, but does not explicitly state when to use this tool versus alternatives or when not to use it. Usage context is implied but not clearly defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_strokeA
Set stroke (border) on a node.
set_stroke({node: "1:2", stroke: "1 #E0E0E0"}) set_stroke({node: "1:2", stroke: "2 #333 inside"}) set_stroke({node: "1:2", color: "#E0E0E0", weight: 1, align: "inside"}) set_stroke({node: "1:2", color: "linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)", weight: 1.5, align: "inside"})
// Batch — bulk stroke update in one call: set_stroke({nodes: [{node: "1:2", color: "#E0E0E0", weight: 1}, {node: "1:3", color: "#333", weight: 2}]})
Shorthand: "weight color align" (e.g. "1 #E0E0E0 inside"). Hex only in shorthand.
Accepted color formats (for the explicit color field, not the shorthand):
hex "#E0E0E0"
gradient string CSS-like subset (see set_fill description for full grammar — same rules).
Common: "linear-gradient(deg, <#hex> %, ...)", "radial-gradient()".
Rejected: "circle at X% Y%", named colors, hsl().
variable token qualified bare name "$Border/Default"
To bind a variable to the stroke color, use the explicit color field — the shorthand parser silently drops bare-name tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | Node ID (single mode) | |
| stroke | No | Shorthand: "1 #E0E0E0 inside" — single-string form. Hex only; for gradient/variable use the explicit color field. | |
| color | No | Stroke color — hex, gradient string, or qualified bare-name token | |
| weight | No | Stroke weight in px | |
| align | No | Stroke alignment relative to the frame edge | |
| nodes | No | Batch: [{node, color?, weight?, align?, stroke?}] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses behaviors like shorthand syntax, gradient/variable support, and the fact that the shorthand parser silently drops bare-name tokens. It does not mention mutation effects or permissions, but the level of detail is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening, examples, and syntax breakdown. It is slightly lengthy due to multiple examples, but every sentence adds value and it is front-loaded with the core purpose.
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 (6 parameters, no output schema), the description covers all parameters, provides extensive examples, and explains edge cases like gradients and variable binding. It is complete for the agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, baseline 3. The description adds significant value by explaining shorthand format, color format details, and batch structure beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Set stroke (border) on a node' and provides multiple examples including batch usage, making the purpose unmistakable. It implicitly distinguishes from sibling tools like set_fill by focusing on stroke-specific properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers explicit usage patterns (single, batch, shorthand) and explains accepted color formats. It does not explicitly state when to avoid this tool vs alternatives, but the examples provide clear context for appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_textA
Set text content on one or more nodes.
set_text({node: "1:2", text: "Hello World"}) set_text({nodes: [{node: "1:2", text: "Title"}, {node: "1:3", text: "Subtitle"}]})
Use this when changing what text says. For text styling (font, size, weight), use edit.
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | Node ID | |
| text | No | New text content | |
| nodes | No | Batch: [{node, text}] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It only states basic mutation without disclosing additional traits like whether text overwrites, permissions needed, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: one statement, two examples, one usage guideline. No redundancy, efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main use case and provides examples. Lacks return value info but no output schema; still adequate for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds value with examples showing usage of 'node'/'text' and 'nodes' array, clarifying batching behavior beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'set' and resource 'text content on nodes', with examples. Explicitly distinguishes from sibling tool 'edit' for styling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directly says 'Use this when changing what text says' and 'For text styling, use edit', providing explicit when-to-use and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_variable_modeA
Set a node to use a specific mode of a variable collection.
This controls which variable values the node displays. For example, set a frame to use "Dark" mode of the "Theme" collection so all bound variables show dark values.
Examples: set_variable_mode({node: "1:2", collection: "VariableCollectionId:1:2", mode: "1:1"}) set_variable_mode({node: "1:5", collection: "VariableCollectionId:1:3", mode: "1:2"})
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | Node ID (e.g. "1:2") | |
| collection | Yes | VariableCollectionId | |
| mode | Yes | Mode id (e.g. "1:1") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool 'sets' a mode, implying mutation, but does not disclose any behavioral traits like reversibility, error conditions, or required permissions. For a mutation tool, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two sentences plus two examples. It is front-loaded with the action and purpose, and every sentence earns its place without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with three required parameters and no output schema. The description explains the effect and provides examples, which is sufficient for most use cases. It does not mention return values, but for a setter, this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are described in the input schema (100% coverage), but the description adds value with concrete examples showing the format of node, collection, and mode IDs. This helps the agent understand the expected input beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sets a node to a specific mode of a variable collection, using the verb 'set' and specifying the resource. It provides a concrete example, distinguishing it from siblings like set_variable_value or bind_variable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the tool controls which variable values the node displays, providing clear context for when to use it. However, it lacks explicit guidance on when not to use it or alternatives, such as using bind_variable for binding variables.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_variable_valueA
Set a variable's value for a specific mode.
Thin wrapper over Figma's variable.setValueForMode(modeId, value). Call once per mode. Value is a raw value (COLOR/FLOAT/STRING/BOOLEAN) OR an alias object {type: "VARIABLE_ALIAS", id: "VariableID:x:y"}. Hex strings are accepted for COLOR and normalized to {r,g,b,a} in 0-1 range.
Examples: set_variable_value({variable: "VariableID:1:5", mode: "1:0", value: "#FFFFFF"}) set_variable_value({variable: "VariableID:1:5", mode: "1:1", value: {r: 0.1, g: 0.1, b: 0.1, a: 1}}) set_variable_value({variable: "VariableID:1:6", mode: "1:0", value: 16}) set_variable_value({variable: "VariableID:1:7", mode: "1:0", value: {type: "VARIABLE_ALIAS", id: "VariableID:1:9"}})
| Name | Required | Description | Default |
|---|---|---|---|
| variable | Yes | VariableID to set | |
| mode | Yes | Mode id from the variable's collection (e.g. "1:0") | |
| value | Yes | Raw value (COLOR/FLOAT/STRING/BOOLEAN) or {type: "VARIABLE_ALIAS", id} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the thin wrapper nature, acceptable value types (raw values or alias objects), and hex color normalization. The 'Call once per mode' constraint is noted. This is good but could mention side effects or restrictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loading the purpose, then detailing behavior, and finally providing clear examples. Every sentence adds value 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?
The description covers the tool's behavior, parameter details, and constraints (call once per mode). No output schema exists, but for a setter tool, this is adequate. Could mention return value or errors.
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 significant meaning beyond schema: it explains the value parameter can be a raw value or alias object, hex normalization, and provides examples. This extra context raises the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Set a variable's value for a specific mode.' The phrase 'Call once per mode' and the mention of being a thin wrapper over Figma's API help distinguish it from other variable-related tools (e.g., set_variable_mode, create_variable).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for a single mode but does not explicitly compare with sibling tools like bind_variable or set_variable_mode. No direct guidance on when to use this tool versus alternatives is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skillA
Load a procedural skill — workflow + tool sequence + anti-patterns. Use FIRST when the user is changing/adjusting existing canvas, OR before creating a new design if a matching skill exists.
Example: skill({ name: "restyle" })
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The skill name exactly as it appears in the KNOWLEDGE LIBRARY menu — no "skill:" prefix, no quotes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It only says 'load' without explaining side effects, state changes, permissions, or safety implications. The agent cannot tell if this is a read-only or mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences plus an example, with no wasted words. The purpose is front-loaded, and the structure is clear and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool loads a skill but does not specify what happens afterward—whether it returns skill contents, executes actions, or modifies state. With no output schema and no annotations, this is a significant omission for a tool that likely has consequences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides a detailed description for the 'name' parameter (100% coverage). The tool description adds only an example ('restyle'), which is helpful but not essential. Baseline of 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool loads a procedural skill consisting of a workflow, tool sequence, and anti-patterns. The verb 'load' is specific and distinguishes it from sibling tools that perform direct actions like 'set_fill' or 'create_component'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using this tool 'FIRST' when adjusting an existing canvas or before creating a new design if a matching skill exists. This provides clear context for when to use it, though it does not name specific alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
styleA
Load a visual style preset as INSPIRATION — color tokens, typography, shape, depth. Treat as a reference library, not a cage: pick one wholesale, mix elements, or invent your own. You are not restricted to the menu.
Example: style({ name: "neon-cyber" })
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The style name exactly as it appears in the KNOWLEDGE LIBRARY menu — no "style:" prefix, no quotes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavioral traits. It explains the tool loads a style as inspiration, but does not clarify whether it mutates the current selection or just returns style information. The example suggests it applies the style, but the effect on the design state is not explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences and an example. It is front-loaded, to the point, and every sentence adds relevant information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, usage, and provides an example. It is nearly complete, though it could explicitly state what the tool affects (e.g., current selection) for full clarity.
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% with a clear description for the 'name' parameter. The description adds value beyond the schema by providing an example and explaining the inspiration philosophy, which aids correct usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool loads a visual style preset for inspiration. It specifies the resource (visual style preset), the action (load as inspiration), and distinguishes from siblings by emphasizing it's a reference library, not a rigid constraint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on how to use the tool: pick wholesale, mix elements, or invent your own. It implies the tool is for inspiration rather than strict application, but does not explicitly mention when not to use it or name alternative tools for direct styling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subtaskA
Delegate a focused sub-task to a typed child agent. Each type has its own tools, iteration budget, and behavioral constraints.
Available agent types:
create: Build an independent UI section (header, sidebar, form, card). Default.
audit: Read-only design review — find layout issues, property omissions, report PASS/FAIL.
token: Variable system operations — create collections, bind tokens, set up aliases.
Use when the prompt names 3+ distinct regions (e.g. header, sidebar, main) that share no nodes, or when specialized behavior is needed (audit, token ops). For 1-2 tool-call operations, inline calls finish faster than the subtask spin-up cost.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | Description of the sub-task to delegate. Be specific about what to create/modify/audit. | |
| type | No | Agent type. Defaults to "create" if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While no annotations are present, the description discloses behavioral traits: each agent type has its own tools, iteration budget, and behavioral constraints, plus the spin-up cost. It doesn't detail return values or side effects, but the transparency is adequate for delegation context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a concise opening sentence, a bullet-like list of agent types, and a clear usage guideline. Each sentence serves a purpose without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, agent types, and usage guidelines. It lacks explicit mention of return values or detailed constraints (iteration budget), but given the complexity and absence of output schema, it provides sufficient context for correct tool 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%, but the description adds value beyond the schema by explaining each agent type's purpose (create, audit, token) and implying the prompt should be specific about what to create/modify/audit. This adds meaningful context for parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool delegates a focused sub-task to a typed child agent, lists three agent types with specific purposes (create, audit, token), and explicitly differentiates from inline calls for 1-2 operations. This provides clear verb+resource and distinguishes 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?
The description explicitly states when to use (3+ distinct regions or specialized behavior) and when not (1-2 tool-call operations finish faster). It provides clear context and exclusions, guiding the agent to choose appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_pageA
Navigate between pages in the Figma file. ID-driven — names are not addressable (they can collide and change).
Two modes:
switch_page({}) → return the page roster only, no switch (use to discover IDs on first call)
switch_page({pageId: "1:23"}) → switch and return the updated state + roster
Pages are top-level containers under the file root. Most read/write operations default to figma.currentPage. Call this when you need to operate on nodes that live on a different page than the current one.
Returns:
currentPageId, currentPageName — the now-current page (always present)
pages — full roster [{id, name}] of every page in the file (always present)
previousPageId, previousPageName — what you switched from (only when an actual switch happened)
unchanged — true if target was already current
Typical flow:
switch_page({}) // get IDs
switch_page({pageId: ""}) // switch
When to call:
User mentions content on a different page than the current one
A previous tool reported a node ID is on a non-current page
You need to inspect/modify nodes outside the active page
Don't call:
For nodes already on the current page — figma.currentPage is the default scope, this would just waste an iteration
Repeatedly to "explore" — every call returns the full pages roster, cache it
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Target page ID (e.g., "0:1"). Omit to just fetch the page roster without switching. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description fully discloses behavior: ID-driven (names not addressable), two modes, return fields, side effects (switching page), and that most operations default to current page. No contradictions.
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?
Well-structured with sections and bullet points, but slightly verbose. Front-loaded with key behaviors and modes, which is good. Could trim redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete despite no output schema: explains all return fields, two modes, typical flow, and operational context (default page scope). No gaps left for agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter fully with description identical to the tool description. No additional parameter-level insight beyond schema, but the overall description provides context for parameter usage. Baseline 3 due to 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly defines the tool as navigating between pages in a Figma file, with two distinct modes (roster-only vs switch). Distinguished from siblings by focusing on page-level navigation, which no other tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-call scenarios (user mentions different page, node on non-current page) and when not to call (current page, repetitive exploration). Includes a typical flow and caching advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_plugin_dataA
Write plugin data (private or shared) to a Figma node.
If namespace is omitted, writes private pluginData (node.setPluginData(key, value)).
If namespace is provided, writes sharedPluginData (node.setSharedPluginData(namespace, key, value)).
Pass an empty string as value to delete a key.
Examples: write_plugin_data({node_id: "1:5", key: "ref", value: "home_title"}) write_plugin_data({node_id: "1:5", namespace: "i18n", key: "ref", value: "home.welcome_title"})
| Name | Required | Description | Default |
|---|---|---|---|
| node_id | Yes | Figma node id. | |
| namespace | No | Optional sharedPluginData namespace. | |
| key | Yes | Key to write. | |
| value | Yes | Value (string). Pass "" to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so full burden on description. Discloses mutation via setPluginData/setSharedPluginData and delete behavior. However, does not explicitly state overwrite behavior or potential errors (e.g., missing node). Adequate but leaves some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: two short paragraphs and two examples. Front-loaded with main action and key distinction. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but tool is a write operation so return value likely minimal. Covers both modes and deletion. Could mention that node must exist or that data is overwritten, but overall sufficient for common use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage for all 4 parameters. Description adds meaning: explains namespace optionality for shared vs private, and value empty string for deletion. Examples demonstrate correct usage and parameter combinations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states action: writing plugin data to a Figma node, distinguishes between private and shared based on namespace. Verb 'write' and resource 'plugin data' are specific. Sibling read_plugin_data implies this is the write counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use namespace (shared data) vs omit (private data), and how to delete a key with empty string. Examples illustrate common usage. Could mention prerequisite that node_id must exist, but not required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
41 tool updates
v1.0.0- First observed
add_component_prop - First observed
ask_user - First observed
bind_variable - First observed
clone_node - First observed
combine_components - First observed
create_collection - First observed
create_component - First observed
create_instance - First observed
create_variable - First observed
create_vector - First observed
delete_node - First observed
describe - First observed
discover_props - First observed
edit - First observed
ensure_collection - First observed
ensure_variable - First observed
find_nodes - First observed
find_references - First observed
get_screenshot - First observed
get_selection - First observed
guideline - First observed
help - First observed
inspect - First observed
jsx - First observed
list_component_props - First observed
list_variables - First observed
move_node - First observed
read_plugin_data - First observed
replace_props - First observed
session_note - First observed
set_fill - First observed
set_layout - First observed
set_stroke - First observed
set_text - First observed
set_variable_mode - First observed
set_variable_value - First observed
skill - First observed
style - First observed
subtask - First observed
switch_page - First observed
write_plugin_data
TDQS
Each tool has a clear, distinct purpose with detailed descriptions. Tools with overlapping functionality (e.g., edit vs. setters) are explicitly differentiated by usage guidance.
All tools follow a consistent verb_noun pattern (e.g., add_component_prop, bind_variable, create_vector). No mixing of conventions.
41 tools is high but justified by the broad scope of Figma design operations. However, it exceeds the typical well-scoped range (3-15), feeling somewhat heavy.
Covers CRUD for nodes, components, variables, and provides audit, user interaction, and session management. Minor gaps exist (e.g., no explicit ungroup tool), but most workflows are supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The Figma MCP server brings Figma design context directly into your AI workflow.
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Real-time chat hub for AI agents — Claude Code, Cursor, Cline, Codex over MCP or REST.
Related MCP Servers
- AlicenseCqualityCmaintenanceA comprehensive MCP server that enables Claude to read, create, edit, and generate code from Figma designs. Supports design tokens, code generation to multiple frameworks, and accessibility checks.1004MIT
- AlicenseAqualityAmaintenanceOpen-source, bidirectional Figma agent for MCP clients — a free alternative to Figma's Dev Mode MCP. Reads designs with high-fidelity grounding and writes back to the canvas: frames, text, auto-layout, styles, variables, and components. 92 tools, no API token, no paid Figma seat.100683MIT
- AlicenseNot gradedqualityAmaintenanceFigma MCP server with full read/write access via plugin bridge — no API token, no rate limits. 83 tools for design automation: styles, variables, components, prototypes, and content.11MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that bridges Claude to Figma, enabling read access via REST and full create/edit capabilities through the Figma Plugin API over a local WebSocket.7MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/musepy/genable'
If you have feedback or need assistance with the MCP directory API, please join our Discord server