Figxel
Lets an AI agent read, design and animate inside the Figma desktop file you have open, via a local Figma plugin. Capabilities include reading layers, design context, variables, styles, fonts, screenshots and exports (PNG, JPG, SVG, PDF); building and editing frames or whole sections in one call; working with components, variants, styles, variables with modes and library assets; prototyping and animating with keyframes, storyboards and video export; validating its own work (layout checks for overflowing text, clipped/overlapping content, low contrast, placeholder copy) and reading FigJam boards and Figma Slides decks.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Figxelbuild a landing hero in my open Figma file and check the layout"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Figxel is an MCP server with a small Figma desktop plugin. With it, an AI app such as Claude, ChatGPT, Cursor or VS Code can read, build and animate real designs in the file you have open, guided by skills that teach it to work like a designer. It runs on your computer, or through a hub on a server that your team runs or that you are invited to (Figxel Cloud and hubs).
Figxel is not affiliated with, endorsed or sponsored by Figma, Inc. Figma is a trademark of Figma, Inc.
Tested live on Windows; macOS has not been run live yet.
Why Figxel
It works with the AI app you already use. Claude, Cursor, VS Code, Codex, Gemini CLI or any other app that runs local MCP servers, whatever model it runs.
It reads and writes your real Figma file. A plugin runs in Figma desktop, so the agent makes editable layers, components and variables in the file you have open.
It never silently overwrites your edits. When you change something the agent read earlier, its next write to it is refused until it reads again
[C-397]; each instruction can be taken back in one step, and only when that takes back nothing of yours.The agent works like a designer, in the role the work needs. UI/UX, graphic, illustration, brand, presentation, design system, board or motion: each role has its own workflow, with planning before the work and testing after it. The tools enforce it: new work starts with a brief, ends with a sign-off that runs the role's checks, and a final export waits for that sign-off. For motion, a plan comes before the first keyframe.
It is local by default and open source. The server runs on your machine and listens only on
127.0.0.1; a team can run its own hub instead. MIT licensed.
Related MCP server: figma-proxy-mcp
What you can do
Ask in plain words; the agent picks the tools.
Read a design: layers, design context for writing code, screenshots and exports (PNG, JPG, SVG, PDF), variables, styles and fonts.
Build and edit: a whole section in one call (
figma_create_from_spec) or frame by frame. Each call is one Ctrl+Z step in Figma.Work with a design system: components and variants, styles, variables with modes, and library assets.
Prototype and animate: prototype flows, keyframes, storyboards and video export, checked with
figma_check_motion.Check its own work:
figma_check_layoutfinds overflowing text, clipped or overlapping content, low contrast and placeholder copy, and its audits measure target sizes, focus and error states, copy, the brief's grid and type scale, a mark at its smallest size, a deck's density and how much is bound to your variables, each with the fix.Stress-test a design:
figma_stress_testmakes copies with translated, longer and bigger content and many or no items, checks each, and says what broke, before real content arrives.FigJam and Figma Slides: reads work today; board and deck writes stay refused until a live run verifies them.
Follow a process: fourteen skills, from design and motion to critique, reach every app through
figma_get_guide, MCP prompts andskill://resources.
That is 140 tools by default: see the tool catalog.
Requirements
Figma desktop on macOS 12 or later, or Windows 10 or later (64-bit) or Windows on Arm
[C-273].Node.js 22 or later.
An AI app that runs local (stdio) MCP servers (setup per app).
Optional: ffmpeg on your PATH, so the agent can review its video renders frame by frame.
Quickstart
Quit Figma desktop completely, then run setup in a terminal. On Windows, closing Figma's window is not enough: quit it from its icon in the notification area
[C-341].npx -y figxel-mcp@latest setup --registerSetup creates a token, copies the plugin into
~/.figxel/plugin, lists it in Figma's development plugins[C-323], and prints the token and the entries for your AI app.Run the plugin. Open Figma and a file, choose Plugins → Development → Figxel, paste the token and press Save. You paste the token once, and run the plugin once per Figma session (why).
Add the server to your AI app. In Claude Desktop, Settings → Developer → Edit Config opens
claude_desktop_config.json[C-277]. Add Figxel undermcpServers:{ "mcpServers": { "figxel": { "command": "npx", "args": ["-y", "figxel-mcp@latest"] } } }On Windows, start it through
cmd, because an app that startsnpxwithout a shell fails there[C-281]:{ "mcpServers": { "figxel": { "command": "cmd", "args": ["/c", "npx", "-y", "figxel-mcp@latest"] } } }In Claude Code, this command works on every operating system
[C-279][C-280]:claude mcp add -s user figxel -- npx -y figxel-mcp@latestOther apps: docs/clients.md.
Try it. Restart your AI app (quit Claude Desktop completely
[C-277]) and ask it to call figma_status: it should list your open file. Then ask for real work, such as "Design a landing hero for Slow Wheel, a fictional pottery studio." Using Figxel shows how to brief the agent and review its work.
Setup's backup of Figma's settings, --dry-run, --force, --unregister, the manual import and the macOS status: Install details.
Figxel Cloud and team hubs
A hub runs the bridge on a server, so the plugin and your AI apps meet there instead of on your computer, and apps that cannot start a local server, such as claude.ai and ChatGPT, connect with a URL. Each person signs in with Figma or Google and reaches only their own Figma.
Figxel Cloud is the hub at
mcp.figxel.moirelabs.dev, by invitation for now. Install the plugin withnpx -y figxel-mcp@latest install(quit Figma first), press Sign in in it, and addhttps://mcp.figxel.moirelabs.dev/mcpto your AI app (connecting).Your team's own hub: docs/hub.md runs one, with the people, sign-in and security it needs.
See it in action
Design a landing hero for Slow Wheel, a fictional pottery studio.
The build at the top of this page, finished: four sections in four calls, then figma_check_layout found seven warnings (low contrast, a chip outside its frame, a sizing conflict) and the agent fixed them in one undoable figma_batch.
Animate this end card for a fictional run club: hook, schedule, call to action.
Keyframes set in Figma, rendered by figma_export_video and checked frame by frame with figma_review_video:
More to try, with what to expect, in Using Figxel:
"Set up colour, spacing and type tokens for this file, then make a Button component with size and state variants."
"Rebuild the settings screen from
src/app/settings/page.tsxin Figma.""Critique the selected frame as a panel of senior designers, then fix what you find."
"Summarize the stickies on this FigJam board by theme."
Configuration
Settings are environment variables in your AI app's server entry. The two you are most likely to change:
BRIDGE_TOOLSETtrims the tool list for apps with a tool limit, such as VS Code (128 tools[C-286]) and Windsurf (100[C-289]):coreregisters 20 tools.BRIDGE_PROCESSsets how strictly the design process is enforced:strict(the default: new work waits for a brief, a final export for a sign-off, keyframes for a motion plan),guided(warnings instead of refusals) oroff.
Every setting, its default and where to set it: docs/configuration.md.
Troubleshooting
"No Figma plugin is connected" (
NO_SESSION): run the plugin in Figma, Plugins → Development → Figxel. Not in that menu? See Install details."Its token does not match": run setup again, paste the token it prints into the plugin window and press Save.
The server does not start on Windows (
spawn npx ENOENTin the app's log): use thecmd /c npx …form[C-281].Too many tools in VS Code or Windsurf: set
BRIDGE_TOOLSET(Configuration).figma_statusasks for a restart: run the plugin again, or restart your AI app, as its hint says.
Port conflicts, timeouts, video exports, macOS and logs: docs/troubleshooting.md.
Privacy
Figxel runs on your machine. The server listens only on
127.0.0.1, the plugin connects only to it, and Figxel sends nothing to any other service.Your AI app sends what the agent reads to its model provider: file, page and layer names, text, the images it exports to look at, and your Figma user name and id.
Your token stays local. It lives in
~/.figxel/token; the server never sends it to your AI app and never logs it.On a hub, the plugin's requests and answers pass through that server over TLS, and files written for a web client stay there for an hour; the hub keeps no design data beyond that, and its people table keeps hashes, not tokens (docs/hub.md).
More, including the tools that take a URL: Privacy details.
Updating and uninstalling
With @latest in the entry, restarting your AI app picks up a new version [C-283]; then close the Figxel plugin window and run it again. To uninstall, remove the figxel entry from each app, remove Figxel from Figma's development plugins and delete ~/.figxel. Details: Updating and uninstalling.
FAQ
Is Figxel an official Figma product?
No. Figxel is an independent open-source project; it is not affiliated with, endorsed or sponsored by Figma, Inc.
Which AI apps does it work with?
Any app that runs local (stdio) MCP servers, with any model: Claude Desktop, Claude Code, Cursor, VS Code, Codex, Gemini CLI and more (setup per app). Apps with a tool limit need a smaller BRIDGE_TOOLSET (Configuration).
Do I need a paid Figma plan?
No. Plugins run on the Starter plan and with a Full seat on paid plans; a Dev, Collab or View seat cannot run them in Figma Design [C-308]. Your plan's limits still apply [C-045]: a Starter file has at most 3 pages [C-048] and no variable modes [C-047].
Why do I have to start the plugin myself?
Figma has no command or link that runs a plugin from outside [C-016]. Run it once per Figma session; it reconnects by itself when your AI app restarts the server.
Does my design data leave my machine?
On your computer, Figxel itself sends nothing off your machine. Through a hub, the plugin's requests and answers pass through that server. Either way, your AI app sends what the agent reads to its model provider, as it does with anything else you share with it (Privacy).
Does it run on Linux?
No. Figma desktop has no Linux build, and development plugins run only in the desktop app [C-273] [C-274].
Documentation
Document | What is in it |
How to work with the agent: the first session, writing a brief, example requests, reviewing and undoing its work, tips | |
Setup per app, install details, updating and uninstalling, installing the skills, tool-call timeouts, sharing one Figma connection | |
Every setting, its default and where to set it | |
A hub on a server: the container, the TLS route, people, sign-in with Figma or Google, security | |
Known problems with their fixes, and the privacy details | |
How an agent should work: the loop, the skills, prompts and resources, choosing a tool, the safety rules | |
Every tool and its parameters, toolsets, resources, and which editor runs each tool | |
The wire protocol between the server and the plugin | |
Architecture, configuration, limits, safety, errors, testing and decisions | |
Phases, next steps, locked decisions, and why Figxel uses a plugin | |
Every external fact the design relies on, with source and date: the ids such as | |
Development setup, conventions, tracked claims, pull requests |
Figxel was called figma-mcp during development, so dated documents (the design spec's file name, plans and spike results) keep that name.
Contributing
Contributions are welcome. Start with CONTRIBUTING.md; everyone who takes part follows the Code of Conduct. Report security problems privately, as SECURITY.md describes. Changes are listed in the changelog.
License
MIT. The npm package bundles third-party code under its own licences, listed in dist/THIRD_PARTY_NOTICES.md.
Available Tools
140 toolsfigma_add_component_propertyAdd component propertyAIdempotent
Give a component (or component set) a property that instances can change: TEXT (wire it to text layers with bindNodeIds — instances then edit the label without detaching), BOOLEAN (show/hide the bound layers), INSTANCE_SWAP (swap a nested icon instance; default = a component id), VARIANT (on a set only). Returns the property key (name + #id) that figma_set_instance_properties accepts — the plain name works too. Called again with a name and type that exist, it reuses that property (reused: true) and wires the new layers; to rename, re-default or unwire use figma_edit_component_property. A slot is figma_create_slot. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | e.g. "Label", "Show icon". | |
| type | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| bindNodeIds | No | Layers inside the component this property drives. | |
| componentId | Yes | A COMPONENT, or a COMPONENT_SET — not a single variant inside a set. | |
| defaultValue | Yes | Text, "true"/"false" for BOOLEAN, a component id for INSTANCE_SWAP. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| preferredValues | No | INSTANCE_SWAP only: component or component-set ids offered first in the swap menu. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it non-read-only, idempotent, non-destructive, and closed-world. The description adds valuable behavior beyond that: it returns a property key (name + #id) usable by figma_set_instance_properties, re-calling with an existing name/type reuses the property and reports reused: true, and it lists editor support. This is rich context not derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: it defines the core action, then explains each type and key behaviors in compact clauses. Every sentence carries actionable information, including reuse behavior and sibling routing, 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?
There is no output schema, but the description explains the return value (the property key and that plain names also work). It covers all nine parameters implicitly through type-specific guidance and explicitly mentions editors and sibling alternatives, leaving no material gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (89%), so the baseline would be 3. The description adds type-specific semantics beyond the schema: TEXT uses bindNodeIds to wire text layers, BOOLEAN shows/hides bound layers, INSTANCE_SWAP default is a component id, and VARIANT is only on sets. This clarifies parameter behavior across types, though some schema descriptions already cover the per-parameter mechanics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Give a component (or component set) a property that instances can change') and then enumerates the four property types. It explicitly distinguishes itself from sibling tools like figma_edit_component_property, figma_set_instance_properties, and figma_create_slot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states clear conditions: VARIANT is 'on a set only', bindNodeIds wires text layers, and reuse happens when the name/type already exist. It also routes rename/re-default/unwire actions to figma_edit_component_property and slot creation to figma_create_slot, with editor availability noted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_add_variable_modeAdd variable modeAIdempotent
Add a mode (e.g. "Dark") to a variable collection; returns its modeId. Modes beyond the first need a paid plan — on a Starter file Figma refuses, and its message is returned. Then set values per mode with figma_set_variable_value. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| collectionId | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that the call returns a modeId, that Figma refuses extra modes on a Starter file and returns its own message, and that Design is verified while FigJam and Slides are unverified. The fail-mode and output-value context is exactly what a mutation tool needs on top of destructiveHint=false and idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core action and return value front-loaded, then the plan gating, then the follow-up tool and editor support. The telegraphic final clause ("Editors: Design; unverified: FigJam, Slides.") trades readability for brevity but still 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?
With no output schema, the description correctly states the return value, and it covers the paid-plan failure path for a 5-parameter mutation. Only the optional parameters' behavior (retry key, session disambiguation, overwrite semantics) is left entirely to the schema, which is acceptable given partial coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description maps collectionId ("to a variable collection") and name (the mode name, e.g. "Dark"), adding modest meaning, but says nothing about force, session, or idempotencyKey even though only 60% of parameters carry schema descriptions. The typed hints in the schema still cover those, so the description neither fully compensates nor needs to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Add a mode ... to a variable collection") and names the return value (modeId), so the agent knows exactly what effect to expect. It is clearly distinguishable from adjacent tools like figma_create_variable_collection and figma_set_variable_value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when: adding a mode to a collection, plus the sequencing hint to follow up with figma_set_variable_value per mode, and warns that non-first modes require a paid plan. It does not explicitly name alternatives for renaming/updating an existing mode (e.g. figma_set_variable_mode or figma_update_variable_collection), so routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_apply_style_to_nodeApply styleAIdempotent
Apply a local style (paint, text, effect or grid) by id or by name — the node then follows the style. Give type when a name is shared across kinds, or to apply a paint style as the stroke (default: fill). figma_get_styles lists local styles; a style from a library (not listed there) is applied by the id that figma_get_design_context returns in stylesUsed. For a raw colour use figma_set_fills. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | Nodes to change. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| styleId | No | A style id from figma_get_styles. | |
| styleName | No | Or its exact name, e.g. "Brand/Primary". | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, but the description adds what the annotations cannot: per-item partial-failure semantics (`{ updated, items: [{ id, ok, error? }] }`, one node failing does not fail the call) and platform support scope (Design verified; FigJam/Slides unverified). This is exactly the extra context the bar asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing, then return shape, then platform scope — no filler sentences. It is dense and semicolon-packed for a 7-parameter tool, which slightly slows parsing but every clause carries 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?
No output schema exists, yet the description spells out the return shape and partial-failure behaviour, and it covers platform reach and the id-vs-name sourcing. An agent has everything needed to call this mutation correctly without opening other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 86%, so the baseline is 3, but the description adds real meaning: the `type`-vs-name interaction, the default-to-fill behaviour of paint styles, and where a valid `styleId` originates for library styles. The STALE/`force` semantics live in the schema, so the description doesn't repeat them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (apply) and resource (local style: paint, text, effect, grid) plus the resulting behavior ('the node then follows the style'). It is also clearly distinguishable from sibling figma_set_fills, which it explicitly reserves for raw colour.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use styleName when convenient, supply `type` when a name is shared across kinds or to apply a paint style as a stroke (default fill), get local styles from figma_get_styles, and use the `id` from figma_get_design_context's `stylesUsed` for library styles. It names the alternative (figma_set_fills) and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_batchBatch editsAIdempotent
Several edits in ONE call and ONE undo step — a polish pass over what you built: fills, strokes, radius, effects, auto-layout, sizes, text, constraints, names. steps is a JSON array of { "op": "set_fills", "params": { … } } (tool names without figma_, 1–50), each checked against that tool's own parameters before anything runs. Modify and style edits only: no creates (figma_create_from_spec builds), no deletes, nothing that replaces nodes with new ids (group, boolean, flatten, clone). Steps run in order and stop at the first failure without rolling back: the error's partial.steps and partial.failedAt say what was applied, and one Ctrl+Z undoes the whole batch. Success: { steps: [{ index, op, ok, result }], completed, itemsFailed? }. A step's ok means it ran; each node it could not change is listed in itemsFailed: [{ step, op, id, error }]. Keyframe steps pass the same motion gate as figma_set_keyframes (BRIDGE_PROCESS).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| steps | Yes | JSON array, e.g. [{"op":"set_corner_radius","params":{"nodeIds":["1:2"],"radius":12}},{"op":"set_opacity","params":{"nodeIds":["1:3"],"opacity":0.6}}]. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: steps run in order, stop at first failure without rollback, partial.steps and partial.failedAt report what was applied, one Ctrl+Z undoes the batch, success returns { steps, completed, itemsFailed? }, and per-node failures are listed in itemsFailed. It also discloses validation against each target tool's parameters and the keyframe motion gate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core value proposition and then supplies dense operational detail. It is longer than typical, but most sentences add distinct, useful information about batching, failure behavior, undo, and validation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex batch mutation tool with no output schema, the description covers purpose, exclusions, failure semantics, success shape, undo behavior, and validation. It does not elaborate on `force`, `session`, or `idempotencyKey`, but those are fully documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters. The description nevertheless adds meaningful semantics for `steps`: it is a JSON array of op/params objects, tool names omit the figma_ prefix, batch size is 1–50, each step is validated against its target tool, and keyframe steps obey the motion gate. Other parameters are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and scope: several edits in one call and one undo step, covering fills, strokes, radius, effects, auto-layout, sizes, text, constraints, and names. It clearly distinguishes itself from create, delete, group/boolean/flatten/clone operations, so an agent can tell exactly what it is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use it (polish pass / batch modifications) and what it excludes: no creates, no deletes, no node-replacing operations. It names figma_create_from_spec as the alternative for builds, but does not explicitly compare batch usage against calling individual setter tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_batch_rename_nodesBatch renameAIdempotent
Bulk rename by find/replace over names. Scope, optional type filter, optional regex. Useful for turning Frame 12 into Card / 12. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| regex | No | Default false. | |
| scope | No | Default "page". | |
| types | No | Only these node types, e.g. ["FRAME"]. | |
| nodeId | No | Subtree root when scope is "subtree". | |
| pattern | Yes | Text to find in names (or a regex when `regex: true`). | |
| replace | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the partial-failure contract ('one node failing does not fail the call') and the exact return shape, plus editor support (Design verified; FigJam/Slides unverified). These are behavioral facts the schema and annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: operation, scope controls, return contract, then platform caveat. The core verb leads and every sentence carries distinct information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation with no output schema, the description still supplies the result envelope and partial-failure semantics, and the schema covers the remaining parameter detail. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 89%, so the schema already documents scope, regex, types, force and idempotencyKey in detail. The description only restates scope/filter/regex at a high level and adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Bulk rename by find/replace over names') plus its scope controls, and the word 'Bulk' implicitly separates it from the single-node sibling figma_rename_node. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete motivating use case ('turning `Frame 12` into `Card / 12`') and makes clear this is for many nodes rather than one. It does not explicitly name figma_rename_node or figma_find_replace_text as the alternatives for single-node or text-content renaming, so the routing guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_bind_variable_to_nodeBind variableAIdempotent
Bind a variable (design token) to a property of nodes so it follows the variable. field: fill, stroke (COLOR; index picks the paint, which must be SOLID — a gradient or image is refused, not replaced), radius, gap, padding (all four sides), width, height, opacity, visible; "effect.color" / "effect.radius" / "effect.spread" / "effect.offsetX" / "effect.offsetY" and "grid.count" / "grid.gutterSize" / "grid.offset" / "grid.sectionSize" with index for the effect or grid; on text, the text fields (fontSize, lineHeight, letterSpacing, fontFamily, fontStyle, fontWeight) go to Figma as is, a refusal coming back per item; or any Figma bindable field (paddingLeft, topLeftRadius, characters). Library variables bind by the id figma_get_variable_defs { nodeId } reports; a token inside a style: figma_update_style. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | e.g. "fill", "radius", "gap", "padding", "effect.color", "fontSize". | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| index | No | Which paint, effect or grid (0 = the first, the default). | |
| nodeIds | Yes | Nodes to change. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| variableId | No | e.g. "VariableID:1:2". | |
| variableName | No | Or its full name, e.g. "color/bg/default". | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover idempotency and non-destructiveness, and the description adds meaningful behavior beyond them: gradients/images are refused (not replaced), text fields may be refused per item, and the call returns per-item results so one failure doesn't fail the batch. It does not restate the safety profile, adding real 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?
Front-loaded with the core action and otherwise dense with useful detail, but the single semicolon-chained sentence is run-on and harder to parse than a structured list of field categories would be. Information earns its place, but the structure is not optimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by documenting the return shape `{ updated, items: [{ id, ok, error? }] }` and per-item failure behavior. Editor support (Design vs unverified FigJam/Slides) is also noted, leaving little an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description significantly enriches `field` with a full enumeration of bindable properties and explains how `index` selects the paint/effect/grid and that paints must be SOLID. This adds value beyond the schema's example-only field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (bind) and resource (variable/design token to a node property), plus the consequence ('so it follows the variable'). This clearly positions it against siblings like figma_set_fills or figma_set_opacity, which set a value rather than bind a token.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent to figma_get_variable_defs for library variable ids and to figma_update_style for tokens inside a style, which is explicit alternative guidance. It lacks a crisp 'when not to use this vs setting a raw value' exclusion, but the routing cues are strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_boolean_nodesBoolean operationAIdempotent
Combine shapes into one boolean shape, as Figma's toolbar does: union (merge), subtract (cut the upper shapes out of the BOTTOM one), intersect (keep the overlap), exclude (keep what does not overlap). The shapes must share a parent; the result takes the lowest one's place and its id is returned. Builds icons, badges, cut-out shapes and logos. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | The shapes, from any layer order — Figma uses their stacking. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| operation | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe-ish mutation profile (destructiveHint=false, idempotentHint=true), and the description adds real value beyond them: the result inherits the lowest node's position, its id is returned, and editor support is qualified (Design verified; FigJam and Slides unverified). It stops short of saying that the source shapes are consumed by the merge, which is the main behavioral detail an agent still has to infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the action and operation semantics before preconditions, use cases, and compatibility. No filler and no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 6-parameter mutating tool with no output schema, the description covers operation meaning, precondition, resulting node position, returned id, and editor support — enough to invoke correctly. What is missing is the fate of the original nodes and any failure modes beyond the parent requirement, which the schema's force parameter only partially covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description adds semantics the schema itself does not carry — that stacking order, not list order, determines union/subtract outcomes. The remaining undocumented parameters (name, session) are not explained in the description, which is a modest gap rather than a blocker.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('combine shapes into one boolean shape') and then defines all four operations inline, including the non-obvious subtract semantics ('cut the upper shapes out of the BOTTOM one'). An agent can distinguish this from figma_flatten_nodes, figma_group_nodes, and figma_set_mask without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases ('icons, badges, cut-out shapes and logos') and a hard precondition ('shapes must share a parent'), plus editor availability. It does not explicitly name alternatives such as flatten or group, which keeps it from a 5, but the usage context is clear enough to select the tool confidently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_check_layoutCheck a design for defectsARead-only
After each section and before calling anything done: a designer's last look, in numbers (figma_export_node shows the picture). Per node, with a number and fix: text overflowing, collapsed, overlapping or covered; content clipped or sticking out; a fill child in a hug parent; stacked frames; placeholder copy; low contrast (WCAG); zero-size, empty or default-named nodes; text off or cut by a slide. audit adds: tokens (unbound values), names (duplicates), fonts (expectFonts), board (FigJam), craft (finish: sizes, edges, near-touches, contrast; safeArea, minTextSize), tells (generated look; warning if the brief avoids it), handoff (share bound), a role's: a11y (targets, focus, labels), states, copy, system (format, scale, grid), deck (words, headlines, floor), mark (size, versions, clear space), icons (canvas, stroke, pixels), library (modes, aliases). briefId: against that brief's numbers. ok: true = no errors or warnings. Default: the selection, then the page (Slides: focused slide). Reads only.
| Name | Required | Description | Default |
|---|---|---|---|
| audit | No | QA passes to add: tokens, names, fonts, board, craft (finish defects), tells (the generated look; info, a warning where a page or top brief avoids it, and run by default under one), handoff (how much is bound to the system), a11y, states, copy, system, deck, mark, icons, library (a role's sign-off checks; with briefId, the brief's numbers). | |
| limit | No | Max findings returned. Default 100. | |
| nodeId | No | The frame or section to check. Defaults to every selected node, then the page. | |
| briefId | No | The node a brief is stored on (figma_set_brief returns it): the role audits measure against its platform, viewport, screens, system, room, applications, grid and platforms, and craft takes its minTextSize and safeArea. At page or top gear its `avoid` kinds are warnings, and tells run by default where its role's sign-off judges them or it avoids one. A motion brief judges layout where the viewer sees it (restPose). Default: the brief in force, unless the checked node is another brief's work (its own record, its top-level frame's, or a brief listing it), which wins; audit.brief names the one used. | |
| nodeIds | No | Several roots in one call, e.g. a batch of 3–5 slides. Not with nodeId. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| maxNodes | No | Stop after this many nodes. Default 3000. | |
| safeArea | No | "x,y,width,height" in the root's coordinates (its top-left is 0,0), from the brief — no presets. Text, logos and CTAs outside it are flagged. Implies craft. | |
| expectFonts | No | Font families the design should use, e.g. ["Inter"]; implies the fonts audit. | |
| minSeverity | No | Hide findings below this level. Default "info". | |
| minTextSize | No | Smallest readable text in px of the frame: the device's floor × frame width ÷ device width, e.g. 28 or more on a 1080-wide story. Implies craft. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, so the bar is lower, yet the description still adds value: default scope (selection, then page, focused slide in Slides), the `ok: true` success signal, that every finding carries a number and a fix, and the effect of `audit` passes. It does not describe how truncated results are signalled when `limit`/`maxNodes` are hit, which is the main remaining 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?
It is compact and the when-to-run clause is front-loaded, but the body is a single telegraphed run-on of semicolon-delimited jargon ("a fill child in a hug parent", "board (FigJam)", "tells") that is hard to parse on first read. Important scope defaults are buried at the tail end rather than placed where an agent will scan for them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter QA tool with no output schema and no required parameters, the description covers the essentials: what is checked, what the audit passes add, how the target and brief are resolved, and what `ok` means. Only the shape of the findings payload and truncation behaviour are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters, and the description largely restates the audit pass list and brief defaults. The one genuinely additive point is the brief-precedence rule (a node that is another brief's work wins over the default brief); otherwise it adds little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain 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 establishes a specific verb (check) and resource (per-node layout findings) and explicitly distinguishes itself from figma_export_node ("shows the picture"), naming concrete defect classes such as overflow, clipping, contrast and zero-size nodes. The framing "a designer's last look, in numbers" is metaphorical rather than literal, but the enumerated defect list leaves no doubt about what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"After each section and before calling anything done" gives an explicit trigger point, and the parenthetical routing to figma_export_node separates it from the visual-inspection sibling. It stops short of stating when this tool should not be used or that it never repairs findings, although "Reads only" implies the latter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_check_motionCheck motion frame by frameARead-only
A motion designer's frame-by-frame check of an animated top-level frame from its keyframes, no render: figma_check_layout for motion. Each issue names layer, field, frame and numbers at fps, with a fix. It finds pops and vanishes mid-move, one frame carrying most of a move, fast moves without blur, blur out of phase, one-frame peaks, arrivals never held, dead stretches (outside holds), a cold open, template moves, missing staggers, keys between frames, HOLD, beat offsets (bpm or beatTimes), text too brief, a late brand or short CTA (brandId, ctaId). The frame's plan (figma_set_motion_plan) fills bpm, holds, brandId and ctaId when left out; its accept lists intended findings apart. ok: true = no errors or warnings. A whole passing check (no rules, from, to, nothing looser than the plan) at the delivery fps unlocks figma_export_video { final: true } until the file changes. Then figma_review_video. UNSUPPORTED: no Figma Motion here. Skill: critique. Editors: Design only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Judge up to this time, s. Default the end. | |
| bpm | No | Tempo: turns on the beat check. Default the plan's. | |
| fps | No | Frame rate to judge at; match the planned export. Default 30. | |
| from | No | Judge from this time, s. Default the start. | |
| ctaId | No | The call-to-action layer: turns on cta_short. Default the plan's. | |
| holds | No | Intended stillness, exempt from dead_span: seconds, e.g. [{ from: 10.4, to: 10.9 }], or frames at `fps`, e.g. [{ fromFrame: 312, toFrame: 327 }]. Default the plan's. | |
| limit | No | Max findings returned. Default 100. | |
| rules | No | Only these rules. Default all. | |
| nodeId | No | The animated top-level frame, or any layer in it (id or Figma link). Default: the selection's frame, else the page's only animated frame. | |
| brandBy | No | Brand fully visible by this time, s. Default 3. | |
| brandId | No | The brand layer: turns on brand_late. Default the plan's. | |
| ctaMinS | No | Seconds the CTA must stay readable. Default 2.5. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| maxNodes | No | Layers read. Default 2000. | |
| beatTimes | No | The beat times of the music in seconds, increasing: the beat check uses them instead of the bpm grid. | |
| beatOffset | No | Time of the first downbeat, s. Default the plan's, else 0. | |
| thresholds | No | Override a default threshold; each comes from a measured 2026-10-09 finding. | |
| beatsPerBar | No | Default 4. | |
| minSeverity | No | Hide findings below this level. Default "info". | |
| includeActivity | No | Add `activity`: the fastest on-screen move per frame, px. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/non-destructive/closed-world; the description adds genuinely new behavior — keyframe-based analysis with no render, the meaning of ok:true, the export-unlock gate that expires when the file changes, and the plan-default-fill behavior. It does not cover permission requirements or error/limit behavior, so it stops short of the top of the range.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and the removal signal ('no render') lands immediately. It is a dense wall of clauses for a 20-parameter tool, but nearly every sentence maps to a distinct capability or workflow step rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description sketches the return shape ('each issue names layer, field, frame and numbers at fps, with a fix') and the ok:true contract, and it covers the surrounding workflow and the unsupported case. For a complex 20-param checker this is complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining cross-parameter semantics: which params the plan supplies by default, that `holds` are exempt from dead_span, that `rules`/`from`/`to` must stay as loose as the plan to preserve the ok verdict, and that bpm/beatTimes/brandId/ctaId each toggle a specific rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('frame-by-frame check of an animated top-level frame from its keyframes'), plus a crisp scope qualifier ('no render'). It explicitly positions itself against the sibling figma_check_layout, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives when-to-use via the workflow chain: figma_set_motion_plan fills bpm/holds/brandId/ctaId, this check runs, a clean pass unlocks figma_export_video { final: true }, then figma_review_video. It names the alternative (figma_check_layout) and states the failure-mode scope (UNSUPPORTED: no Figma Motion here), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_clone_nodeClone nodeAIdempotent
Duplicate a node with its whole subtree, optionally into another parent and at a new position. A slide is duplicated into a slide row — right after itself, or at the end of the row parentId names — and the result gives its row and col. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Not for a slide: the deck's grid places it. | |
| y | No | ||
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | Default: the source's parent. For a slide, a SLIDE_ROW. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive behavior, but the description adds real context beyond them: subtree duplication, slide row placement, the returned row/col, and editor support boundaries. It does not cover permissions or failure modes beyond what force already handles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the core action front-loaded and the slide-specific caveat following. Every clause carries information, though the slide sentence is syntactically dense enough to require rereading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with no output schema, the description covers the non-obvious pieces: subtree scope, parent/position behavior, slide row semantics, return of row/col, and editor availability. The unexplained name and y parameters are the only notable 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 63%, and the description clarifies the tricky cases: x is ignored for slides because the deck grid places them, and parentId takes a SLIDE_ROW for slides. However, name, y, and nodeId remain unexplained in both schema and description, so it only partially compensates for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and scope: duplicate a node with its whole subtree, optionally into another parent or position. That clearly separates it from creation tools like figma_create_instance or manipulation tools like figma_reparent_nodes, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It hints at when this applies (slide duplication into a slide row, editor availability in Design vs unverified FigJam/Slides) but never states when to prefer it over figma_reparent_nodes or figma_create_instance. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_combine_as_variantsCombine as variantsAIdempotent
Combine components into one component set (variants), like Figma's Combine as variants. Name each component "Property=Value, Other=Value" first (figma_rename_node) — Figma derives the variant properties from those names. The components must share a parent; the set is laid out as a wrapping row unless arrange: false. columns: "State" lays it out as a grid instead — a column per State value, a row per combination of the other properties — and returns the grid's page coordinates, for header labels made with figma_create_text outside the set. Then place variants with figma_create_instance and switch them with figma_set_instance_properties. Editors: Design; unverified: Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| gap | No | Space between variants, px. Default 24. | |
| name | No | The set's name, e.g. "Button". | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| arrange | No | Lay the variants out in a wrapping row. Default true. | |
| columns | No | A variant property every component names, e.g. "State": one grid column per value. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| description | No | What the set is for — shown in the assets panel and Dev Mode. | |
| componentIds | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, idempotent, closed-world, so the description's added value is the editor support note ('Design; unverified: Slides'), the shared-parent constraint, the default layout behavior, and the fact that grid mode returns page coordinates for external header labels. It stops short of describing failure modes (e.g. what happens if parents differ) or the return shape outside grid mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the naming prerequisite are front-loaded, and each subsequent clause carries a distinct operational fact (parent constraint, default layout, grid alternative, follow-up tools, editor support). It is dense but not padded; the em-dash chaining makes it slightly harder to scan than a short bulleted breakdown would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no output schema, the description covers preconditions, layout modes, the one documented return value (grid coordinates), and the downstream calls. What is missing is any statement of the normal return value (presumably the resulting component set node) and error behavior, which matters given there is 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 89%, so most parameters are already documented. The description adds genuine meaning beyond the schema for two of them: `arrange: false` suppresses the wrapping row, and `columns: "State"` produces a column per value and a row per combination of the remaining properties, with page coordinates returned. `gap`, `name`, and `force` semantics are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Combine components into one component set (variants)') and anchors it to the Figma UI action of the same name. It is clearly distinguishable from siblings like figma_convert_to_component, figma_group_nodes, or figma_add_component_property.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and an ordered workflow: rename components to 'Property=Value' first via figma_rename_node, ensure a shared parent, then place variants with figma_create_instance and switch with figma_set_instance_properties. Alternatives for layout (arrange vs columns) are spelled out with the conditions that select each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_convert_to_componentConvert to componentAIdempotent
Turn an existing node (usually a frame) into a reusable COMPONENT, keeping its properties and children — the toolbar's Create component. The result has its own id (returned). A node that is already a component, or sits inside a component or instance, cannot be converted. To place copies afterwards use figma_create_instance. Editors: Design; unverified: Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Component name. Defaults to the node's name. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | The node to convert. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| description | No | What the component is for — shown in the assets panel and Dev Mode. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false. The description adds useful behavioral detail: the conversion keeps the node's properties and children, returns a new component id, and cannot run on nodes already inside components or instances. It does not cover permission or stale-edit failure handling, but the force parameter's schema description does.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation and then efficiently layers in constraints, the relevant sibling tool, and editor availability. Every sentence carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool without an output schema, the description compensates by noting that the result id is returned. It also covers conversion constraints, the next-step sibling, and editor scope, leaving little an agent needs to know before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both required and optional parameters are already documented. The description does not add parameter-specific semantics beyond the schema; its mention of the returned id is output context rather than parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Turn an existing node (usually a frame) into a reusable COMPONENT.' It distinguishes the operation from sibling tools like figma_create_instance by naming that tool for placing copies afterward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use context ('existing node, usually a frame'), when-not conditions ('already a component, or sits inside a component or instance, cannot be converted'), and points to figma_create_instance for the follow-up copy step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_animaticCreate an animaticAIdempotent
Play a storyboard back at its planned pace: turn a figma_create_storyboard board into an animatic, a top-level frame Animatic · <title> with one plate per panel, each on screen on exactly the panel's frames, switched by frame-exact OPACITY cut pairs. Timing is read from the board as it is now (each duration caption), at the board's fps. A plate shows the panel's best picture: its styleframe once something is drawn in it, else its source rendered again, else its thumbnail; blank lists panels with nothing yet. dissolveFrames cross-fades out of a panel whose transition caption starts with "dissolve"; drift pushes each plate 3 %; burnIn labels plates. Every track is read back (verified, else notApplied). The result's render is the figma_export_video call; then judge the pace with figma_review_video. Plates 2–n rest at opacity 0, so figma_export_node shows panel 1. Skill: storyboard (figma_get_guide). One undo step. Editors: Design only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Default: right of everything on the page. | |
| y | No | ||
| drift | No | Push each plate's picture 3 % over its panel, so a held panel does not read as a freeze. Default false. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | Plate width in px; the height follows the board's aspect. Default 1080 (1920 for 16:9). | |
| burnIn | No | "panel" (default): each plate's number and title in its corner; "full": also its time, frames and the beat, action, camera and transition captions; "none". | |
| pageId | No | The page to build on, at its top level. Default: the board's page. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| storyboardId | Yes | The board figma_create_storyboard returned (its storyboardId: the Storyboard / <title> frame), id or Figma link. | |
| dissolveFrames | No | Frames of cross-fade out of a panel whose transition caption starts with "dissolve". Default 0: every change is a cut. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (not read-only, idempotent, non-destructive), but the description adds substantial behavioral context beyond them: one undo step, Design-only editors, plates 2–n resting at opacity 0 (so figma_export_node shows panel 1), STALE refusal via `force`, and every track read back as `verified`/`notApplied`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core transformation and every sentence carries real information, but the paragraph is dense and heavy, packing many behaviors (dissolve, drift, burnIn, verified tracks, render routing) into long clauses. Helpful, but not maximally scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-param, complex creation tool with no output schema, the description is complete: it explains what gets built, how timing is sourced, what `blank` lists, the verification readback, and the render/review follow-up. Nothing an agent needs to call it correctly appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (91%) and already documents most params, but the description adds operational meaning: `dissolveFrames` applies only to panels whose transition caption starts with 'dissolve', `drift` pushes 3%, and `burnIn` semantics. It complements the schema rather than merely repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('turn a figma_create_storyboard board into an animatic') and describes exactly what the output is: a top-level `Animatic · <title>` frame with one plate per panel. It explicitly names the sibling it builds on (figma_create_storyboard) and downstream tools, so an agent can distinguish it without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: the result's `render` is the figma_export_video call, then pace is judged with figma_review_video, and the skill is storyboard (figma_get_guide). It also states the editor restriction ('Design only, unverified') and the one-undo-step caveat, covering when and how to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_code_blockCreate a code block (FigJam)AIdempotent
A FigJam code block with syntax highlighting. language (case-insensitive): typescript, javascript, python, go, rust, ruby, css, html, json, graphql, sql, swift, kotlin, cpp, bash, plaintext, dart — dart is in the Plugin API but not yet confirmed on the canvas. Default plaintext; any other value is refused rather than shown as plain text, so ask for plaintext yourself. FigJam styles it: no theme, font or size to set. Editors: FigJam only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content. | |
| y | No | Top edge, in the parent's coordinates. | |
| code | Yes | The code. | |
| name | No | Layer name. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| language | No | typescript, javascript, python, go, rust, ruby, css, html, json, graphql, sql, swift, kotlin, cpp, bash, plaintext, dart. Default plaintext. | |
| parentId | No | A section or frame to put it in (id or Figma link). Default: the current page. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: unknown language values are refused rather than falling back to plain text, FigJam controls styling so there is no theme/font/size to set, and the editor support is flagged unverified. It does not restate the mutation/staleness behavior that the schema's `force` parameter already documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose and keeps the constraints tight, but the full 17-item language enumeration largely duplicates the schema's description and clutters an otherwise efficient paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter creation tool with no output schema, the description covers what the agent most needs (editor scope, language handling, styling limits); placement, retry and staleness parameters are fully explained in the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3; the description earns a bump by explaining the refusal semantics behind `language` (invalid values rejected, not rendered as plaintext) which the schema's flat value list does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'A FigJam code block with syntax highlighting.' The 'Editors: FigJam only' line distinguishes it from the general text/shape creation siblings, though it never names figma_create_text as the alternative for design files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete guidance on the language argument (default plaintext, unknown values refused, 'ask for plaintext yourself'), but says nothing about when to choose this over figma_create_text or figma_create_stickies, nor any prerequisite about needing a FigJam file open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_connectorsCreate connectors (FigJam)AIdempotent
FigJam connector lines between nodes, 1–200 in one call. Each is made IN its final parent — by default the lowest section holding both ends, else the page — and never moved: a reparented connector keeps stale elbows, so build connectors last. Endpoints: One string: "12:34" (attach; magnet auto), "12:34@right" (magnet: auto, top, bottom, left, right, center, none), "12:34@0.5,1" (a point on the node, 0–1 of it — to be confirmed) or "120,340" (a free point). An end may not be another connector. lineType elbowed (default), straight or curved; caps default none at the start and arrow-lines at the end (ERD caps too); label is the visible text. Change one later with figma_edit_connectors. Editors: FigJam only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | Where every connector goes: a section or a frame without auto-layout. Default: per connector, the lowest section holding both ends, else the page. | |
| connectors | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only mark it as a non-destructive, idempotent write): it discloses that connectors are created in their final parent and never moved, that reparenting leaves stale elbows, and that an endpoint cannot be another connector. It also flags environment risk ('FigJam only, unverified') and uncertainty in the point syntax, all of which the agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb, resource, and batch limit, and every sentence carries real information (ordering, endpoints, styling, sibling). It is dense and heavily parenthetical, with some endpoint syntax duplicated from the schema, which costs a bit of tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter batch-write with no output schema, it covers placement, ordering constraints, endpoint forms, styling defaults, and the edit path. The remaining gap is what a call returns (created connector identifiers/status), which it never mentions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema already documents endpoint syntax, lineType defaults, and cap defaults — and the description largely repeats those same strings. It adds marginal gloss (caps default none at start / arrow-lines at end, ERD caps) but no syntax or format details absent from the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource with scope: 'FigJam connector lines between nodes, 1–200 in one call.' It distinguishes itself from figma_create_line (plain lines) and figma_edit_connectors (modifying an existing one), so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives ordering advice ('build connectors last') and routes later changes to figma_edit_connectors, plus a hard scope exclusion ('FigJam only'). It does not explicitly contrast with figma_create_line for the same visual output, so usage context is clear but not fully disambiguated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_effect_styleCreate effect styleAIdempotent
A local effect style (shadows, blurs) that nodes can then follow via figma_apply_style_to_node. Same effect entries as figma_set_effects. Change it later in place with figma_update_style. Editors: Design only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| effects | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| description | No | What the style is for — shown in Figma's style picker. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/idempotent/non-destructive/non-open-world profile, so the description's job is to add context — and it does: the style is *local* (not a published library asset) and "Editors: Design only," a real permission constraint an agent cannot infer from annotations. It does not mention duplicate-name behavior or what the call returns, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short clauses, zero filler, with the resource and the apply path front-loaded. It reads as telegraphic fragments rather than sentences, which is efficient but slightly cryptic on first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter creation tool with no output schema, the description covers purpose, related tools, and permission scope, but never says what comes back (a style id/key to pass to figma_apply_style_to_node) or how name collisions are handled. Those gaps matter because there is no output schema to fill them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the effect sub-object is documented field by field with defaults and per-type applicability. The description adds only that entries mirror figma_set_effects and cover shadows/blurs; it says nothing about name, description, session, idempotencyKey, or the stale/force contract. Baseline 3 is appropriate when the schema carries most of the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely ("a local effect style (shadows, blurs)") and implicitly separates it from the paint/text/grid style siblings by qualifying it as an effect style. It lacks an explicit verb, relying on the title "Create effect style" to supply the action, so it falls just short of a full verb+resource statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Three sibling relationships are spelled out: apply it with figma_apply_style_to_node, edit it with figma_update_style, and its entries match figma_set_effects. That effectively routes the agent between the create-style path and the direct-effects path, though it never states the selection rule outright ("use this instead of figma_set_effects when you want a reusable style").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_ellipseCreate ellipseCIdempotent
An ellipse with an optional fill. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| fill | No | ||
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | Yes | ||
| height | Yes | ||
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description contributes the editor-availability note (works in Design, unverified in FigJam/Slides), which is real context not present in annotations. However, it says nothing about the STALE/force overwrite semantics, parent requirements, or what gets created and returned, leaving meaningful 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?
Two short sentences with no filler, so it is compact. But it is compact to the point of under-specification: the lead sentence is a fragment with no verb, so the size is achieved by omitting necessary information rather than by trimming waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with a nested `sizing` object, low schema coverage, and no output schema, the description should carry substantial weight. Instead it supplies one line of editor scoping and nothing about geometry, parenting, or the result of the call — clearly inadequate 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?
With 11 parameters and only 36% schema description coverage, the description is expected to compensate and does not — it only alludes to the optional `fill` value. Critical parameters like `parentId`, `x`/`y` positioning, `sizing`, and `name` are never explained in the description, and the `force` STALE-retry semantics are documented only inside 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 is a noun phrase ("An ellipse with an optional fill") that restates the tool title rather than stating an action; the verb "create" only appears in the tool name/title. It offers no differentiation from the many sibling creation tools (figma_create_rectangle, figma_create_polygon, figma_create_star, figma_create_vector), so an agent gains nothing beyond what the name already says.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Editors: Design; unverified: FigJam, Slides" is a useful environment constraint that hints at when the tool is applicable, but it is terse and unexplained. There is no guidance on when to choose an ellipse over a polygon/vector, and no mention of prerequisites such as needing a parentId or an active Figma session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_frameCreate frameAIdempotent
A frame — the building block for structure. Build designs step by step: one frame per section, row or card, each with auto-layout (layout, gap, padding, alignX/alignY), then add content into it by parentId. An auto-layout frame hugs its content on any axis you give no size for; sizing: { horizontal: "fill" } makes it take its parent column's width. A wrapping row (wrap) spaces its rows by rowGap (default: the gap). Content is not clipped unless clipsContent: true. Name it for what it is. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| gap | No | Space between items, px. | |
| name | No | What it is, e.g. "Header", "Pricing card". | |
| wrap | No | Wrap items onto new lines (horizontal layout only). | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | Fixes the width. Omit to hug (auto-layout) — a plain frame defaults to 100. | |
| alignX | No | Horizontal alignment of the items. | |
| alignY | No | Vertical alignment of the items. baseline (a row only) lines up text baselines, e.g. "$29 /mo". | |
| height | No | Fixes the height. Omit to hug (auto-layout). | |
| layout | No | Auto-layout direction: horizontal = a row, vertical = a column. | |
| rowGap | No | Space between wrapped rows, px. Needs wrap; default the gap. | |
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| padding | No | Padding: one number for all sides ("24"), or four comma-separated ("48,48,32,32") for top,right,bottom,left. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | Defaults to the current page (in Slides: the focused slide). | |
| background | No | Omitted: transparent inside another frame, white directly on the page. | |
| alignContent | No | How wrapped rows share the height. Needs wrap. | |
| clipsContent | No | Clip children at the frame edge. Default false (shadows stay visible). | |
| cornerRadius | No | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write, idempotent, non-destructive, so the bar is lower; the description nonetheless adds real behavior: no clipping unless clipsContent (so shadows stay visible), auto-layout hugging on any unsized axis, sizing fill inheriting parent width, and rowGap defaulting to gap. It doesn't cover the STALE/force write-refusal semantics, which live only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the concept ('A frame — the building block for structure') then compressed to practical advice. Dense and mostly earns its space, though the mixed backtick-heavy phrasing and trailing editor caveat read slightly telegraphic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 21-parameter creation tool with no output schema, the description supplies the layout model and composition workflow an agent needs to call it correctly. Gaps remain around returned identifiers/return shape and the force/idempotency interplay, but the core decision inputs 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 86%, so 3 is the floor; the description earns an extra point by explaining cross-parameter logic the schema can't: layout+gap+padding+align as a unit, rowGap defaulting to gap under wrap, and sizing.horizontal='fill' taking the parent column's width. It doesn't touch a few parameters such as cornerRadius or background defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Create frame') and defines the frame's role as the structural building block. It's clearly distinguishable from siblings like create_rectangle or create_section by the auto-layout emphasis, but it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear contextual guidance: 'one frame per section, row or card, each with auto-layout ... then add content into it by parentId' supplies a usage pattern, and the editor scope (Design; unverified FigJam, Slides) tells the agent where it applies. It stops short of explicitly stating when to use a plain shape or group instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_from_specCreate from specAIdempotent
Build a whole SECTION in one call (one undo step): a header, hero, card, grid of cards or footer — frames with auto-layout, text, shapes (rectangle, ellipse, polygon, star, line, vector path), SVG icons, images by URL, components and instances. To build anything new: a wrapper frame, then one call per section into it by parentId; after each, figma_check_layout and one figma_export_node, then targeted fixes. Not a whole page in one payload: a section at a time keeps every step checkable. The full spec grammar: figma_get_guide { topic: "spec" }. Minimal shape: { "type": "frame", "name": "Card", "layout": "vertical", "gap": 16, "padding": 24, "children": [ { "type": "text", "content": "Title", "fontSize": 20 } ] }. A field a type does not take is refused, never dropped. A mid-way failure does not roll back: created[] and failedAt say what exists. Supply your own idempotencyKey for a large spec. An array of roots (a slide's content) needs parentId or pageId. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | The node tree to build, as a JSON object serialised to a string (the tool description gives its grammar), or a JSON array of 1–50 such roots when parentId or pageId is given. Serialising it keeps the schema portable across providers — see docs/reference/tools.md. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| pageId | No | The page to build on, at its top level, when no parentId is given. Not with parentId. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | Where to attach it: a frame, section, slide or page. Defaults to the current page (in Slides: the focused slide). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: one undo step, no rollback on mid-way failure, created[]/failedAt reporting, STALE-overwrite semantics reinforced via force, idempotencyKey retry behavior, and editor coverage (Design verified; FigJam/Slides unverified). Only the return payload shape is gestured at rather than described, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and workflow, and the grammar pointer and minimal example earn their space. It is dense and the mid-sentence enumeration is long, but nothing is clearly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description still tells the agent what a partial result looks like (created[], failedAt) and how to recover. Combined with workflow, grammar link, and editor caveats, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real value by pointing to the spec grammar doc and giving a minimal valid spec example with layout/gap/padding/children semantics. It reinforces parentId usage and idempotencyKey sizing advice beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Build a whole SECTION in one call', then enumerates exactly what it composes (frames with auto-layout, text, shapes, SVG, images, components). It also distinguishes itself from the granular siblings (figma_create_frame, figma_create_text, etc.) by emphasizing 'whole section', and from a whole-page build by 'Not a whole page in one payload'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow: create a wrapper frame, then one call per section by parentId, then figma_check_layout plus one figma_export_node, then targeted fixes. It also names the grammar source (figma_get_guide topic: spec) and states the array-of-roots constraint (needs parentId or pageId), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_grid_styleCreate grid styleAIdempotent
A local GRID style — a named layout grid (e.g. 12 columns, 24 gutter, 64 margin) that frames follow via figma_apply_style_to_node { type: "grid" }. Entries as in figma_set_layout_grids, which sets raw grids on frames instead. Editors: Design only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| grids | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| description | No | What the style is for — shown in Figma's style picker. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (non-read-only, non-destructive, idempotent), and the description adds genuinely new context: the style is 'local' (not a library asset) and creation is restricted to 'Design only' editors, a real permission constraint. It doesn't discuss what happens on name collisions or what the call returns, but the force/STALE behavior is documented in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the definition first and the disambiguation second — nothing wasted. The opening is a nominal fragment rather than a sentence, which is slightly less parseable but costs no length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with a nested grids array, no output schema, and annotations already covering safety, the description supplies the concept, an example, the sibling boundary, and the permission constraint. Remaining gaps (return value, retry/idempotency expectations) are handled by schema parameter descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 67% schema coverage the schema does most of the work, and the description adds a concrete worked example ('12 columns, 24 gutter, 64 margin') that maps directly onto the count/gutter/margin fields of the nested grids array, plus a cross-reference to figma_set_layout_grids for entry semantics. It doesn't add anything for name or pattern, which are the leftover uncovered fields.
Input schemas describe structure but not intent. Descriptions should explain 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 defines the resource precisely — a local GRID style, a named layout grid with concrete example values (12 columns, 24 gutter, 64 margin) — and distinguishes it from figma_set_layout_grids, which sets raw grids on frames. The only weakness is that the creating verb lives in the title rather than the description, but the referent is unambiguous and an agent can separate 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?
It explicitly names the alternative ('Entries as in figma_set_layout_grids, which sets raw grids on frames instead') and the downstream consumer (frames follow it via figma_apply_style_to_node). That gives a clear create-a-reusable-style vs. set-a-raw-grid routing rule. It stops short of stating the positive trigger condition ('use when the grid should be reusable across frames') outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_instanceCreate instanceAIdempotent
Place an instance of a component, of a component set's default variant, or of the variant of a set you name. Local ids come from figma_get_local_components. A library component is placed by componentKey or componentSetKey: imported first, then placed (figma_import_library_assets imports several at once). Give exactly one of componentId, componentKey, componentSetKey. To change which component an existing instance shows, use figma_swap_component. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| variant | No | For a set: which variant, e.g. "Size=Large, State=Hover". Default: the set's default variant. | |
| parentId | No | Defaults to the current page (in Slides: the focused slide). | |
| componentId | No | A COMPONENT or COMPONENT_SET id in this file. | |
| componentKey | No | A published library component's key. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| componentSetKey | No | A published library component set's key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly=false, destructive=false, idempotent=true), so the description needn't restate them. It adds genuinely non-obvious behavior: library components are imported first and then placed, which is a side effect on the file's asset list, plus a FigJam/Slides reliability caveat. It stops short of describing placement results or failure modes, but the stale/force behavior is carried by the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with no filler, front-loaded on the action, then prerequisites, then the alternative tool. The first sentence is slightly tangled with its three parallel cases, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter creation tool with no output schema, the description supplies everything an agent needs before calling: how to source identifiers, the mutual-exclusion constraint, default placement context (deferred to schema), library import side effects, and platform support. Remaining param details are covered by 82% schema coverage.
Complex tools with many parameters or behaviors need more documentation. 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 82%, so the baseline is 3; the description earns above that by explaining the semantics of the three identifier parameters and their exclusion rule, and by clarifying that `variant` takes a Figma-style string like "Size=Large, State=Hover" with a defined default. Coordinates, sizing, and idempotencyKey are left entirely to their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb ("Place an instance") and enumerates the three distinct resource cases: a component, a set's default variant, and a named variant. It is immediately distinguishable from siblings like figma_swap_component and figma_convert_to_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?
It explicitly routes the agent: local ids come from figma_get_local_components, bulk imports use figma_import_library_assets, and changing an existing instance's component requires figma_swap_component instead. It even states the mutual-exclusion rule ("Give exactly one of componentId, componentKey, componentSetKey") and the editor support matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_lineCreate lineAIdempotent
A straight line: dividers, connectors, arrows, underlines, decorative strokes. length in px from (x, y), turned by angle degrees (0 = to the right, 90 = up). cap decorates both ends: arrow, arrow-filled, triangle, circle, diamond, round, square. For a divider inside an auto-layout, a 1 px figma_create_rectangle with sizing: { horizontal: "fill" } stretches with the column; a line keeps its length. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| cap | No | ||
| name | No | ||
| angle | No | Degrees, default 0. | |
| color | No | Default #000000. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| length | Yes | ||
| weight | No | Stroke weight in px, default 1. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| dashPattern | No | Dash and gap lengths, e.g. [4, 4]. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false and closed-world, so the safety profile is covered. The description adds real value beyond them — geometry semantics for `length`/`angle` and the auto-layout resize behavior — but says nothing about the returned node identity, default placement when `parentId` is omitted, or whether the new line is selected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense — the use cases, then geometry, then the rectangle alternative, then environment caveats. Every sentence carries information, though the telegraphic fragment style ('A straight line: ...') costs a little readability and the auto-layout sentence is long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 13-parameter mutation tool with no output schema, the description covers the geometry that actually determines the result and the environment constraints. It could have closed the loop on what is returned and on default parenting, but the schema's descriptions plus annotations fill most of the remaining space.
Complex tools with many parameters or behaviors need more documentation. 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 only 54% schema coverage the description does meaningful work: `length` is quantified as px from (x, y), `angle` as degrees with 0=right and 90=up, and `cap` is enumerated with the fact that it decorates both ends. However `name` and `parentId` are documented in neither place, and gaps remain on whether x/y are absolute or parent-relative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete resource plus a list of canonical use cases (dividers, connectors, arrows, underlines, decorative strokes), which pins down the shape type immediately. It also names the sibling it competes with (figma_create_rectangle) and the condition that separates them, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use a rectangle instead: for a divider inside an auto-layout, a 1 px rectangle with `sizing: { horizontal: "fill" }` stretches while a line keeps its length. It also states environment coverage (Design supported; FigJam and Slides unverified), which is exactly the qualification an agent needs before committing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_link_previewCreate a link preview (FigJam)AIdempotent
Paste a web link onto a FigJam board as a card. Figma fetches the https URL and inserts an EMBED (a page that offers oEmbed, such as a video) or a LINK_UNFURL preview (title, description and image from the page's meta tags). The parent is checked before Figma fetches; a link Figma cannot preview is refused in Figma's own words. Returns { id, type, title?, provider? }. Editors: FigJam only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content. | |
| y | No | Top edge, in the parent's coordinates. | |
| url | Yes | An https:// link. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | A section or frame to put it in (id or Figma link). Default: the current page. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (non-read-only, non-destructive, idempotent), and the description adds real value beyond them: the remote fetch happens, previews can be refused with Figma's message, and the STALE/force interaction is spelled out. Minor tension: the description implies an external https fetch while openWorldHint=false, which an agent might read as "no network reach".
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences: what it does, how previews resolve, refusal behavior, and return shape, then a terse editor caveat. Dense but nearly every clause carries information; "in Figma's own words" is the only decorative touch.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter write tool with no output schema, the description covers outcome types, failure behavior, the return object shape, and the FigJam-only editor restriction. Notable omissions are fetch failure/timeout handling and whether a refused preview consumes anything, but the essentials 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 url, parentId, force, session, idempotencyKey and coordinates are all documented in the schema. The description reinforces the parent check and the STALE semantics of force but adds no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: paste a web link onto a FigJam board as a card, and explains the two resulting node kinds (EMBED vs LINK_UNFURL). No sibling tool creates link cards, so the agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Editors: FigJam only, unverified" plus the parent-check/refusal sentence give clear conditions and constraints for use, and the embed-vs-unfurl explanation tells the agent what it will get. It doesn't name an alternative tool, but no sibling competes for this action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_pageCreate pageCIdempotent
A new page. Note: a free Starter file is capped at 3 pages and Figma's own error is surfaced as-is when the cap is hit — that is a plan limit, not a bridge limit. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| activate | No | Switch to the new page. Default false. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotent, non-destructive), the description discloses a real behavioral constraint: free Starter files cap at 3 pages, and the resulting failure is Figma's own error surfaced as-is, not a bridge error. That distinction matters for error triage, and the app-availability caveat (Design verified, FigJam/Slides unverified) is useful operational 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?
It is short and the constraint note is dense with useful information, but the most important sentence — what the tool actually does — is a four-word fragment, while a plan-limit caveat leads the body. Front-loading favors the edge case over the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 create tool with no output schema, the description plus the detailed schema cover most of what an agent needs: what is created, plan cap behavior, environment support, idempotent retries, and the activate/force semantics. The only gap is that it never says what is returned (page id/name) or whether the new page is empty, but the schema does much of the load here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80% and the parameter descriptions are unusually rich (force/STALE semantics, idempotencyKey retry behavior, session selection, activate default). The description adds nothing about any of the five parameters, so it earns only the baseline for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the noun phrase "A new page." which essentially restates the tool name rather than stating a verb+resource action. It does identify the resource (page) as distinct from frames/sections, but there is no explicit statement that this creates a page, and no differentiation from the many other figma_create_* 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?
There is no when-to-use or when-not-to-use guidance and no named alternative (e.g., create_section, clone_node). The only usage-shaped information is the environment note ("Editors: Design; unverified: FigJam, Slides"), which tells the agent where the tool is available but not when to pick it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_paint_styleCreate paint styleAIdempotent
A local PAINT style: one color, or fills (several paints, gradients — entries as in figma_set_fills). variableId / variableName binds the first paint's colour to a COLOR variable, so a semantic colour style follows its token. Change it later in place with figma_update_style. A gradient style's angle is exact only on a square node — a style has no size; for an exact CSS angle on a known node use figma_set_fills, or give transform. Editors: Design only.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| color | No | A solid colour. Give this or `fills`. | |
| fills | No | Several paints or a gradient, entries as in figma_set_fills. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| opacity | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| variableId | No | Bind the first paint's colour to this COLOR variable. | |
| description | No | What the style is for — shown in Figma's style picker. | |
| variableName | No | Or the variable's full name, e.g. "color/bg/brand". | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the Design-only editor scope, the fact that a style has no size (so gradient angles are only exact on square nodes, with the 135→~163 on 1280×400 example), and that `variableId`/`variableName` binds the first paint's colour so the style tracks a token. Annotations already cover safety (destructiveHint=false, idempotentHint=true), so remaining gaps like return shape are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense — the core shape (color or fills, variable binding) comes first, then the gradient-angle caveat and the editor scope. Telegraphic fragments ('A local PAINT style: one `color`, or `fills`...') are efficient rather than confusing, though the angle caveat is lengthy relative to its importance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 10-parameter create-mutation with no output schema, the description covers mode selection, variable binding, editor scope, and the trickiest edge case (gradient angle on sizeless styles). It does not address name-collision behavior or what is returned on success, leaving the agent to infer the latter from the absence of an 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?
With 80% schema coverage the baseline is 3, and the description adds real meaning on top: how `variableId`/`variableName` bind the first paint, that `fills` entries follow figma_set_fills conventions, and the exactness caveat for gradient `angle`. It does not cover `force`, `session`, or `idempotencyKey`, but those are documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('A local PAINT style') and enumerates the two construction modes ('one `color`, or `fills`'). It implicitly but clearly separates itself from figma_create_text_style/figma_create_effect_style by naming the style type, and from figma_set_fills by clarifying that this creates a reusable style rather than node fills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent elsewhere in two situations: 'Change it later in place with figma_update_style' and 'for an exact CSS angle on a known node use figma_set_fills, or give `transform`.' It also names the editor restriction ('Editors: Design only') so the agent knows when this tool is not applicable at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_polygonCreate polygonAIdempotent
A regular polygon — triangle (pointCount 3), diamond (4, rotated 45 with figma_rotate_nodes), pentagon, hexagon… Badges, play buttons, decorative geometry. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| fill | No | ||
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | Yes | ||
| height | Yes | ||
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| stroke | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| pointCount | No | Sides, default 3. | |
| cornerRadius | No | Rounds the outer corners. | |
| strokeWeight | No | Default 1 when a stroke is given. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, openWorld=false, so the safety profile is covered. The description adds a genuine behavioral trait not in annotations: editor support ('Editors: Design; unverified: FigJam, Slides'), plus the multi-step note that a diamond requires a follow-up rotation. The force/STALE and idempotency behavior is delegated to schema descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource definition, then examples, then editor support, with no filler. The em-dash density is slightly compressed but every clause (pointCount mappings, rotation, editor scope) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter creation tool with a nested sizing object and no output schema, the description covers purpose and editor context but does not compensate for the many undocumented optional parameters (positions, fill, stroke, parent). Adequate but with clear gaps given the schema's 47% coverage.
Complex tools with many parameters or behaviors need more documentation. 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 47%, so the description must help but only partly does. It adds useful meaning to pointCount (side count, with 3/4 mapped to triangle/diamond and the rotation caveat), but leaves x, y, fill, name, stroke, and parentId undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what is created (a regular polygon) and disambiguates it from sibling shape tools by specifying the side-count mechanism (pointCount 3 = triangle, 4 = diamond via rotation) versus star/ellipse/rectangle. Concrete use cases (badges, play buttons, decorative geometry) reinforce the resource identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance through examples ('Badges, play buttons, decorative geometry') and even routes the diamond case through figma_rotate_nodes, an explicit alternative interaction. It lacks explicit when-not-to-use or named shape alternatives, keeping it at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_rectangleCreate rectangleCIdempotent
A rectangle with an optional fill, corner radius and stroke. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| fill | No | ||
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | Yes | ||
| height | Yes | ||
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| stroke | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| cornerRadius | No | ||
| strokeWeight | No | Default 1 when a stroke is given. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, non-destructive, idempotent creation operation, so the safety profile is covered. The description adds useful platform-availability context by naming Design and unverified FigJam/Slides, but it does not explain creation side effects, parent requirements, or return 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 only two sentences and contains no filler; the styling options and editor support are stated compactly. It is concise, though that concision contributes to its under-specification for such a large schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter creation tool with nested sizing, low schema coverage, and no output schema, the description is far too thin. It should clarify where the rectangle is created (parentId), sizing semantics, idempotency/force behavior, and how to choose among sibling shape creators.
Complex tools with many parameters or behaviors need more documentation. 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 low at 36%, so the description should compensate for undocumented parameters. It mentions fill, cornerRadius and stroke, but omits many important parameters including parentId, sizing, x, y, name, force and idempotencyKey, leaving substantial ambiguity for a 14-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource as a rectangle with optional fill, corner radius and stroke, but it is written as a noun phrase rather than stating the create action. It does not distinguish this tool from sibling shape creators such as figma_create_ellipse, figma_create_polygon or figma_create_shapes_with_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives editor availability (Design; unverified FigJam, Slides) but provides no guidance on when to use this tool versus other shape-creation tools. There are no exclusions, prerequisites, or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_sectionCreate sectionAIdempotent
A section — the container designers use to organise a page by flow, and on a FigJam board the structure itself: a white wrapper, zones inside it, cards inside those (parentId = another section). name: "" leaves it untitled when a title text inside carries the label. To fill a section and fit it to its content in one call, use figma_create_from_spec with a section's arrange and hug. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | In the parent's coordinates. | |
| y | No | ||
| fill | No | Background colour, e.g. #F5FBFF. | |
| name | No | Short and navigational, e.g. "Brainstorm"; "" for none. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | Default 800. | |
| height | No | Default 600. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | A page or a section. Defaults to the current page. | |
| contentsHidden | No | Hide what is inside, as FigJam's Hide contents. Default false. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, destructive, idempotent, and open-world behavior, and the description does not contradict them. It adds useful editor-support context ('Design; unverified: FigJam, Slides') and describes FigJam structural behavior, though it does not discuss return values or failure modes beyond what the schema already covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly compact and front-loads the section concept and nesting model. The first sentence is dense, but each part contributes to understanding the tool's domain and the key alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 11 parameters, no required fields, 91% schema coverage, and strong annotations, the description provides enough context to select and call the tool. A minor gap is that with no output schema, it does not say what a successful creation returns, but the essential creation and nesting semantics 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 description coverage is 91%, so the baseline is 3, but the description adds meaning for `name` by explaining when an empty name pairs with a title text, and for `parentId` by noting it can be another section. It does not add much beyond the schema for the other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as a section and explains its role as a page-organising container, including FigJam nesting. It distinguishes the tool from `figma_create_from_spec` for the fill-and-fit case, though the description itself does not explicitly say 'creates' and relies on the title/name for the verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete alternative: to fill and fit a section in one call, use `figma_create_from_spec` with `arrange` and `hug`. It also explains the `name: ""` untitled case and that `parentId` can be another section, but it does not broadly compare when to use a section versus a frame or page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_shapes_with_textCreate shapes with text (FigJam)AIdempotent
FigJam shapes with text — flowchart steps, decisions, databases, callouts — 1–200 in one call, each sized to fit its text unless width and height are given (fitted). shape: one of 30 types in kebab case (square, ellipse, rounded-rectangle, diamond, triangle-up, parallelogram-right, eng-database, eng-queue, eng-file, eng-folder, hexagon, chevron, speech-bubble, …) or label: a numbered or lettered circle marker of 1–2 characters at a fixed size. color is a preset that sets fill, stroke and text together: black, dark-gray, gray, light-gray, white, and green, teal, blue, violet, pink, red, orange, yellow each with a light- form (light-green, …); or give hex fill / stroke / textColor instead. Laid out like figma_create_stickies (columns, gap default 40). Join them with figma_create_connectors. Row and column data is figma_create_table, never a grid of shapes. Editors: unverified in FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content. | |
| y | No | Top edge, in the parent's coordinates. | |
| gap | No | Space between shapes, px. Default 40. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| shapes | Yes | ||
| columns | No | Items per row. Default: all in one row. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | A section or frame to put it in (id or Figma link). Default: the current page. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, idempotent, closed-world behavior, so the bar is lower; the description still adds real behavior: auto-fit sizing unless width/height are supplied, preset colors that set fill, stroke and text together versus hex overrides, and the FigJam/Slides verification caveat. Missing only the STALE/`force` overwrite semantics, which live in the schema rather than the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability, then structured by parameter in backticks, with sibling routing at the end. It is dense and occasionally elliptical ('…', trailing type lists), but almost every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter batch-creation tool with no output schema, the description covers sizing behavior, the shape/label vocabulary, color model, layout semantics, sibling hand-offs, and an environment caveat. There is nothing an agent needs to call it correctly that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 89%, but the description goes beyond it by enumerating shape types, defining `label` as a 1–2 character fixed-size marker, and listing the full preset color palette plus light- variants and the hex fill/stroke/textColor alternative. Container-level params (x, y, session, parentId, idempotencyKey, force) are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+surface: FigJam shapes with text, batchable 1–200 per call, with named shape types and a label variant. It also distinguishes itself from the three nearest siblings (stickies for layout, connectors for joining, table for row/column data).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Laid out like figma_create_stickies', 'Join them with figma_create_connectors', and 'Row and column data is figma_create_table, never a grid of shapes'. It also states when fixed sizing applies ('unless width and height are given') and warns editors are 'unverified in FigJam, Slides'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_slidesCreate slidesAIdempotent
Add 1–20 empty 1920×1080 slides to a Figma Slides deck, in list order. Then give each its content with one figma_create_from_spec (parentId = the slide id), and check the batch with figma_check_layout — 3–5 slides per call. Per item: name, background (hex; it goes on the slide, since rows and the grid have no fill), skipped, and where: row + col, counted against the grid the earlier items left (row = the current row count opens a new last row), or neither for the end of the deck. On an empty deck the first slide makes row 0. Every position is checked before the first slide exists. Returns each slide's id, row, col and index as read back. Not for frames on a page (figma_create_frame); to reorder use figma_move_slides, to regroup figma_set_slide_grid. Do not delete and rebuild slides to restyle a deck: edit them in place. Editors: Slides only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| slides | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the description needn't restate safety. It instead adds non-obvious behavior: 'Every position is checked before the first slide exists' (all-or-nothing validation, no partial writes), the returned fields ('id, row, col and index as read back'), and an editor scope caveat ('Editors: Slides only, unverified'). The concurrency/STALE behavior lives in the schema's force param rather than the description, which is the only minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, and every sentence carries information. The middle section cramming per-item fields, placement rules and cross-tool workflow into one dense passage is harder to parse than it needs to be, but nothing is disposable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no output schema, the description covers what it creates, the batch limits, placement semantics, validation timing, the return shape, follow-up tools, alternatives and environment requirements. An agent has everything needed to call it correctly and to know what comes next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Well beyond the 75% schema coverage: it explains that `row` is counted against the grid left by earlier items and that 'the current row count opens a new last row', that omitting both row and col appends to the end of the deck, and that on an empty deck the first slide makes row 0. It also justifies `background` placement ('it goes on the slide, since rows and the grid have no fill'), which the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with hard scope: 'Add 1–20 empty 1920×1080 slides to a Figma Slides deck, in list order.' It also explicitly distinguishes itself from figma_create_frame (frames on a page), figma_move_slides (reorder) and figma_set_slide_grid (regroup), so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the full workflow: create the empty slides here, then fill each via figma_create_from_spec with parentId = slide id, then verify with figma_check_layout at 3–5 slides per call. It also names exclusions ('Not for frames on a page') and a negative pattern ('Do not delete and rebuild slides to restyle a deck: edit them in place'), which is exactly the when/when-not guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_slotCreate slotAIdempotent
Add a slot to a component: a frame that each instance fills with its own layers, plus the SLOT property that goes with it. Pass a component or one variant, not a set. layout horizontal or vertical (Figma refuses a grid on a slot). Fill it in an instance by creating content with parentId = the slot inside that instance; figma_reset_slot empties it again. figma_set_instance_properties cannot set a slot. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | e.g. "Content", "Actions". | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | ||
| height | No | ||
| layout | No | Auto-layout direction of the slot. | |
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| componentId | Yes | A COMPONENT, or one variant of a set. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly false, destructive false, idempotent true), and the description adds meaningful behavioral context beyond them: the slot-property relationship, instance fill mechanics, the grid refusal, the inability for figma_set_instance_properties to set a slot, and editor/platform availability including unverified platforms.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it starts with the core create action, then adds constraints and alternatives without redundant restatement. Each sentence contributes a distinct operational 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?
For a 9-parameter create tool with no output schema, the description covers the essential invocation semantics, constraints, sibling alternatives, and platform availability. The only minor gap is that it does not describe the return value, but the schema and annotations together make the definition sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, so the schema already carries substantial parameter documentation. The description still adds operational meaning for key parameters, especially that componentId must be a component or one variant (not a set) and that layout accepts horizontal or vertical because Figma refuses a grid on a slot.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: add a slot to a component, defining what a slot is (a frame filled per instance) and the associated SLOT property. It also distinguishes the tool from related operations by noting a component or one variant must be passed, not a set, and that figma_set_instance_properties cannot set a slot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage conditions: pass a component or one variant rather than a set, use horizontal or vertical layout because Figma refuses a grid on a slot, fill it in an instance via parentId, and use figma_reset_slot to empty it again. These are explicit when-to-use and when-not-to-use constraints with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_starCreate starAIdempotent
A star or burst: pointCount spikes, innerRadius 0–1 (low = spiky, near 1 = almost a polygon). Rating stars, sale bursts, sparkles, decorative shapes. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| fill | No | ||
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | Yes | ||
| height | Yes | ||
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| stroke | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| pointCount | No | Spikes, default 5. | |
| innerRadius | No | Default Figma's 0.38. | |
| cornerRadius | No | Rounds the outer corners. | |
| strokeWeight | No | Default 1 when a stroke is given. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a non-destructive, idempotent write, and the description adds useful context about editor support and shape semantics. However, it does not explain creation behavior such as where the node is inserted, what is returned, or permission/session implications beyond what the schema already provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core shape concept, and then supplies use cases and editor caveats without wasted wording. Every sentence contributes either shape semantics or applicability context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 robust annotations and partial schema descriptions, the description is adequate for selecting the tool and understanding its core geometry. It remains thin for a 16-parameter creation tool with no output schema: it does not cover return values or several creation-context parameters such as parent, session, and required sizing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds real meaning to `pointCount` and `innerRadius`, especially the 0–1 inner-radius behavior and the spiky-to-polygon continuum. With 16 parameters and only 50% schema description coverage, many parameters such as `x`, `y`, `parentId`, `fill`, and `stroke` receive no description-level clarification, so the added parameter guidance is useful but partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource precisely as a star or burst and explains its defining geometry via `pointCount` and `innerRadius`, which separates it from a generic polygon. It does not explicitly say 'creates' or name sibling alternatives, but the tool name/title and shape-specific language make the purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete use cases such as rating stars, sale bursts, sparkles, and decorative shapes, giving an agent clear situations for selection. It also notes Design is supported while FigJam and Slides are unverified, but it stops short of naming when to use `figma_create_polygon` or `figma_create_vector` instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_stickiesCreate stickies (FigJam)AIdempotent
FigJam sticky notes, one idea each, 1–200 in one call, laid out as a grid from their REAL sizes: a sticky is 240 wide (416 with wide) and grows taller with its text, so rows are placed after the text is in and never overlap. color: white, gray, green, teal, blue, violet, pink, red, orange, yellow, or a hex — names land on FigJam's exact swatches. The size is fixed: no width or height; use wide for about 100 words or more. columns per row (default one row), gap (default 64). Prompts, labels and instructions are text, not stickies. The parent is never resized: parentOverflow says how far the block runs past it (then figma_fit_sections). Returns created [{ index, id, x, y, width, height }] and bounds. Editors: FigJam only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content. | |
| y | No | Top edge, in the parent's coordinates. | |
| gap | No | Space between stickies, px. Default 64. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| columns | No | Items per row. Default: all in one row. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | A section or frame to put it in (id or Figma link). Default: the current page. | |
| stickies | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it explains layout behavior: grid placement from real sticky sizes, no overlap because rows are placed after text is applied, fixed size with no width/height, and the parent is never resized. It also discloses the return shape (`created [{ index, id, x, y, width, height }]` and bounds), which annotations alone do not cover.
Agents need to know what a tool does to the 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 key constraints are front-loaded and the dense prose is mostly information-bearing. It is longer than necessary because it repeats some schema-provided defaults, but it remains structured and 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?
There is no output schema, so the description appropriately explains the return value and bounds. It also covers the important parent-overflow behavior, FigJam-only scope, layout rules, and size constraints, making it complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 89%, so the schema carries most parameter meaning. The description adds useful semantics beyond the schema, such as color names landing on exact FigJam swatches and `wide` being for about 100 words or more, while also repeating some schema defaults like `columns` and `gap`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create FigJam sticky notes, one idea each, 1–200 per call, laid out as a grid. It also distinguishes stickies from text-based annotations by saying prompts, labels, and instructions are text, not stickies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit context: FigJam only, use `wide` for about 100 words or more, and use `figma_fit_sections` when `parentOverflow` occurs. It also says prompts/labels/instructions should be text rather than stickies, but does not name the specific text-creation sibling, so the alternative routing is slightly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_storyboardCreate a storyboardAIdempotent
Lay out a motion piece's storyboard before animating it: a board of cards in rows, one per panel, each a thumbnail frame at aspect above caption rows (time, duration, story beat, on-screen copy, action, camera, transition, audio, notes). Timing is derived from each panel's durationS, snapped to whole frames by default: start and end in seconds and frames at fps, and bar.beat with bpm. The result lists panels that start off the beat (offBeat) and copy on screen too briefly to read (readTime): fix both before building. A panel can snapshot a frame of this file (source), show an image already in it (image), or get an empty full-size styleframe beside the board (styleframe). Sketch into a thumbnail with figma_create_from_spec { parentId: thumbId }. The duration caption is the plan: edit its text to retime a panel. A plan, not an animation: figma_set_keyframes animates. Skill: storyboard (figma_get_guide). One undo step. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Default: right of everything on the page. | |
| y | No | ||
| bpm | No | Tempo: adds bar.beat per panel and lists panels that start off the beat. | |
| fps | No | Frame rate the frame numbers use. Default 30. | |
| snap | No | Round each duration to whole frames (default), whole beats (needs bpm), or not at all. Changes are listed in `snapped`. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| title | Yes | The piece's name; the board is named Storyboard / <title>. | |
| aspect | Yes | Of every thumbnail and styleframe. | |
| pageId | No | The page to build on, at its top level. Default: the current page. | |
| panels | Yes | ||
| columns | No | Cards per row. Default 6 (9:16), 5 (4:5, 1:1), 4 (16:9). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| captions | No | Caption rows on every card, always in this order. Default: timecode, duration, and every row any panel fills. | |
| thumbWidth | No | Thumbnail width in px; height follows the aspect. Default 216 / 288 / 300 / 384 by aspect. | |
| beatsPerBar | No | Default 4. Needs bpm. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| styleframeWidth | No | Styleframe width in px. Default 1080 (1920 for 16:9). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a write (readOnlyHint=false) that is idempotent and non-destructive; the description adds value beyond them by noting "One undo step" and disclosing that the result flags offBeat panels and readTime issues to fix before building. It doesn't spell out return structure or failure modes, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and artifact structure, then timing rules, then alternatives. It is dense but every sentence (snapping, offBeat/readTime warnings, sketch/retime workflow) carries operational information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with no output schema, the description covers when to use it, how timing is computed, what the result flags (offBeat, readTime), and the follow-up path. Return-value detail is partial and the `source`/`image`/`styleframe` panel modes are only lightly sketched, leaving minor 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 high (88%), so the schema carries most parameter documentation. The description nevertheless adds semantics the schema doesn't: timing is derived from each panel's `durationS` and snapped to whole frames by default, with start/end expressed in seconds and frames at `fps` and bar.beat via `bpm`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lay out a motion piece's storyboard") and immediately defines the artifact: a board of card rows, one per panel, thumbnail at `aspect` above caption rows. It explicitly contrasts with the animation sibling ("figma_set_keyframes animates"), so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (before animating), routes to concrete alternatives (figma_create_from_spec for sketching thumbnails, figma_set_keyframes for animation, figma_get_guide for the skill), and states the retiming workflow (edit the duration caption). It also names supported environments (Design) versus unverified ones (FigJam, Slides).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_tableCreate a table (FigJam)AIdempotent
A FigJam table — the tool for any row-and-column data, never a grid of shapes. Give rows (text, 1–100 rows of 1–20 cells, every row the same length; all of the user's data, no placeholders) or numRows + numColumns for an empty one: exactly one form. header (default true with rows) colours row 0 with headerColor, a table preset (default black: dark fill, white text): black, dark-gray, gray, light-gray, white, and green, teal, blue, violet, pink, red, orange, yellow each with a light- form (light-green, …), or a hex. fill colours the table; a fill is never removed ("" is refused). columnWidths / rowHeights resize; a column cannot shrink below its minimum, so the real widths come back. fontFamily, weight, fontSize apply to every cell. Cells have no ids: change them with figma_edit_table. Editors: unverified in FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content. | |
| y | No | Top edge, in the parent's coordinates. | |
| fill | No | Table preset or hex. | |
| name | No | Layer name. | |
| rows | No | The data, row by row; row 0 is the header. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| header | No | Style row 0 as a header. Default true with rows, false for an empty table. | |
| weight | No | Font weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold"). | |
| numRows | No | An empty table: with numColumns, not with rows. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| fontSize | No | ||
| parentId | No | A section or frame to put it in (id or Figma link). Default: the current page. | |
| fontFamily | No | ||
| numColumns | No | ||
| rowHeights | No | One height per row, px. | |
| headerColor | No | Header preset or hex. Default black. | |
| columnWidths | No | One width per column, px. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (non-destructive, idempotent, closed-world), yet the description still adds real behavioral detail: fills are never removed and "" is refused, columns cannot shrink below a minimum so actual widths are returned, header styling defaults differ between rows and empty forms, and editors are unverified in FigJam/Slides. That is context the agent could not derive from the structured fields alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that is front-loaded with the identity claim and the mutually exclusive input forms before moving to optional styling. Every clause carries information, though the preset colour enumeration is long enough to slightly crowd the rest.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter creation tool with no output schema, the description covers input forms, defaults, styling, and resize behavior well. The one real gap is what the call returns (presumably the created node/id), which the agent must infer because no output schema exists to cover it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 83% the baseline is 3, and the description earns above that by listing the full preset colour vocabulary (black, dark-gray, …, light- variants, hex) that the schema only summarizes as 'Table preset or hex', by explaining the rows/numRows exclusivity, and by noting font settings apply to every cell. It leaves x/y/name/parentId/force/idempotencyKey untouched, but those carry their own schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (a FigJam table) and immediately differentiates it from the nearest lookalike — 'never a grid of shapes' — which an agent can act on without comparing schemas against create_shapes_with_text. It also names the sibling that handles subsequent cell edits (figma_edit_table).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules: use a table rather than a grid of shapes for row-and-column data, and supply either `rows` or `numRows`+`numColumns` — 'exactly one form' — not both. It further routes the agent to figma_edit_table for changes because cells have no ids.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_textCreate textAIdempotent
A text node, placed into a frame by parentId. Inside a vertical auto-layout it fills the column and wraps (and follows the column's centre/right alignment unless align is given); elsewhere give width for text that should wrap — text without one stays on a single line and can overflow. The font is loaded with the documented fallback chain; the result names the font used and flags fellBack: true when it is not the one requested. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| name | No | Layer name, e.g. "Title". Default: the text itself. | |
| align | No | ||
| color | No | Default #000000 (in FigJam: #1E1E1E, the board's own text colour). | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | Fixed width in px; the text wraps inside it. | |
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| weight | No | Default Regular (in FigJam: Medium, the board's own default). | |
| content | Yes | The text. Newlines are allowed. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| fontSize | No | ||
| parentId | No | Defaults to the current page (in Slides: the focused slide). | |
| fontFamily | No | Default Inter. | |
| lineHeight | No | "auto", px ("24" or "24px") or percent ("150%"), as in figma_set_text_properties; above 0. A unitless value is px, never a multiplier. | |
| letterSpacing | No | px ("0.5") or percent ("-1%"), as in figma_set_text_properties. A unitless value is px. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (idempotent, non-destructive, closed-world), yet the description still adds real behavior: the documented font fallback chain and a `fellBack: true` flag in the result, plus the overflow consequence of omitting `width`. It omits the STALE-write refusal and the retry-key semantics, which live only in the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly three dense sentences for a 17-parameter tool, with the placement/wrapping rule front-loaded and the font-fallback note last. The parenthetical asides make individual sentences long but nearly every clause carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter mutation with a nested `sizing` object and no output schema, the description covers layout and font behavior but leaves the write-safety story (STALE refusal, `force`, `idempotencyKey`) and multi-file `session` selection entirely to the schema. It is adequate to call the tool, but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. 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 76%, so the baseline is around 3, but the description genuinely adds meaning beyond the schema: `width` absence implies single-line overflow, `align` is conditional on auto-layout inheritance, and `parentId` defaults matter for placement context. Many of the 17 parameters (force, session, idempotencyKey, lineHeight, letterSpacing) are unmentioned, relying entirely on their schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause, 'A text node, placed into a frame by parentId', makes clear this creates a text node and where it lands, and the wrapping/alignment discussion reinforces that. However, it never uses an explicit verb, and it does not differentiate from near-siblings like figma_create_shapes_with_text, figma_set_text, or figma_create_text_style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete conditional guidance: inside a vertical auto-layout the node fills and wraps automatically, elsewhere you should supply `width` or risk single-line overflow, and `align` overrides inherited column alignment. It also scopes environment applicability ('Editors: Design; unverified: FigJam, Slides'). It stops short of naming an alternative tool when this one is the wrong choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_text_styleCreate text styleAIdempotent
A local TEXT style. lineHeight and letterSpacing are STRINGS, as in figma_set_text_properties: "auto", "32" (px) or "150%"; "0.5" or "-2%" — a bare JSON number is no longer accepted here. case (e.g. upper for labels), decoration, paragraph spacing and indent are set on the style too. Change it later in place with figma_update_style. Editors: Design only.
| Name | Required | Description | Default |
|---|---|---|---|
| case | No | ||
| name | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| weight | No | Font weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold"). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| fontSize | Yes | Required: a text style with no size is not usable. | |
| decoration | No | ||
| fontFamily | No | Default Inter (create); the style's own family (update). | |
| lineHeight | No | "auto", px ("32") or percent ("150%"). A string, not a number. | |
| description | No | What the style is for — shown in Figma's style picker. | |
| letterSpacing | No | px ("0.5") or percent ("-2%"). A string, not a number. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| paragraphIndent | No | px of first-line indent. | |
| paragraphSpacing | No | px between paragraphs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the description earns credit for adding what annotations cannot: the style is local (not a library/published style) and requires a Design-seat editor. It also flags a hard input constraint — lineHeight/letterSpacing must be strings, bare JSON numbers are rejected — which would otherwise cause a failed call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and mostly front-loaded: the resource and the highest-risk parameter formats come first, then the update path, then the editor constraint. A few clauses restate schema facts (case, decoration, paragraph spacing) and the leading noun fragment is slightly awkward, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter creation tool with no output schema and strong annotations, the description covers the things most likely to break a call: the string-encoded metrics, the editor-seat requirement, and the mutation follow-up path. It does not say what the call returns (e.g. the new style's id) or whether styles are file-scoped via the session parameter, which is a modest remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 79%, so the baseline is 3; the description exceeds it by spelling out the exact accepted string grammar for lineHeight ('auto', '32', '150%') and letterSpacing ('0.5', '-2%') and by flagging the breaking change that numbers are no longer accepted. It also enumerates the secondary properties (case, decoration, paragraph spacing/indent) so an agent knows the style carries more than size and weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening fragment 'A local TEXT style' plus the enumeration of typography properties makes clear this defines a text style, and the sibling differentiation from figma_update_style ('Change it later in place with figma_update_style') and from paint/effect styles is implicit in 'TEXT style'. It stops short of an explicit creation verb, so the reader infers 'create' from the title/name rather than the sentence itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names one alternative and its condition ('change it later in place with figma_update_style') and states an access constraint ('Editors: Design only'), which is real guidance. But it gives no criteria for choosing a reusable style here versus setting text properties directly with figma_set_text_properties or placing text via figma_create_text, and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_variableCreate variableAIdempotent
One design token. value is a string for every type: "#1a2b3c" for COLOR, "16" for FLOAT, text for STRING, "true"/"false" for BOOLEAN, or "alias:" of the same type. Set scopes (which pickers offer it; [] for a primitive only aliased) and a WEB codeSyntax on every token. A name the collection already has is refused. For a whole token set in one call use figma_create_variables. Bind one to nodes with figma_bind_variable_to_node; extra modes (figma_add_variable_mode) need a paid plan. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| type | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| value | Yes | The value for the declared type: "#1a2b3c" for COLOR, "16" for FLOAT, "Inter" for STRING, "true" for BOOLEAN. | |
| modeId | No | Mode id or name. Defaults to the collection's first mode. | |
| scopes | No | Which property pickers offer it. [] hides a primitive that is only aliased; semantic tokens name their fields, e.g. ["FRAME_FILL","SHAPE_FILL"] or ["GAP"]. Checked against the type; ALL_SCOPES stands alone. Default (omitted): Figma's ALL_SCOPES. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| codeSyntax | No | The name in code per platform, e.g. { "WEB": "var(--color-bg-brand)" }. "" removes that platform. | |
| description | No | ||
| collectionId | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| hiddenFromPublishing | No | Hide it when the file is published as a library. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true, destructive=false), the description discloses that duplicate names are refused, that extra modes require a paid plan, and where the tool is verified versus unverified at the editor level. It does not say what comes back (e.g. the new variable id needed for later aliasing/binding), which is the main remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The passage is dense and front-loads the value encoding, then scopes/codeSyntax guidance, then sibling routing. The telegraphic, fragment-heavy style ('A name the collection already has is refused.') is efficient but slightly harder to parse than flowing prose, so not a full 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation with no output schema, the description covers the highest-risk semantics (value encoding, aliasing, scopes, duplicate refusal, editor support) and the schema documents most remaining parameters. The absence of any statement about the return value—important since aliasing another token requires the new variable's id—is the notable omission.
Complex tools with many parameters or behaviors need more documentation. 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 67% schema coverage, the description adds real meaning: it explains that `value` is always a string per type and introduces the 'alias:<variable name or id>' syntax not documented in the schema, plus the `scopes` convention of [] for an aliased-only primitive. It repeats some schema text for `value` and leaves `force`, `modeId`, `session`, and `idempotencyKey` entirely to their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'One design token' and details the exact value encodings, making it clear this creates a single variable/token, and it explicitly contrasts with figma_create_variables for bulk creation and figma_bind_variable_to_node for binding. The core verb is only implied by the name, not stated in prose, which keeps it just shy of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use figma_create_variables for a whole token set in one call, figma_bind_variable_to_node to attach one to nodes, and figma_add_variable_mode for extra modes (noting the paid-plan requirement). It also states a constraint (duplicate names in the collection are refused) and platform availability (Design editors; unverified in FigJam/Slides), leaving little ambiguity about when this is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_variable_collectionCreate variable collectionAIdempotent
A new variable collection (a token group). Its first mode is named after modes[0], or "Default" — never Figma's "Mode 1". Extra modes beyond the first are paid-plan only — if Figma refuses one, the result carries a warnings entry rather than dropping it silently. Rename or remove modes later with figma_update_variable_collection. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| modes | No | Mode names, first is the default. Default ["Default"]. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no output schema, the description carries the return-value burden and does: it discloses that a refused mode surfaces as a `warnings` entry instead of a silent drop — exactly the partial-success semantics an agent needs. It also documents the first-mode naming rule (never 'Mode 1') and the editor surface (Design; unverified FigJam, Slides), which goes meaningfully beyond the idempotent/non-destructive annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each carrying distinct information (naming, plan limits, follow-up tool, editor availability) with no filler. The opening fragment lacks its verb, which makes the front-load slightly weaker than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-destructive, idempotent creation tool with no output schema and 80% parameter coverage, the description supplies the missing result-contract detail (warnings) and platform reach. It stops short of describing the returned collection identifier/shape or duplicate-name behavior, which an agent would still need to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the bar is baseline-3, and the description earns above it by explaining the `modes[0]` default-name rule and the paid-plan ceiling on extra modes, which the schema's 'first is the default' note does not convey. The `name` parameter is undocumented anywhere, but it is self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It establishes the resource precisely by glossing 'variable collection' as a token group and describes the mode-naming behavior, which no sibling does. The verb is only implied — the sentence is a fragment ('A new variable collection...') rather than 'Creates...' — but combined with the title and the pointer to figma_update_variable_collection, an agent can tell it apart from figma_create_variable, figma_create_variables, and figma_add_variable_mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage context: extra modes beyond the first are paid-plan only, so multi-mode creation may partially fail, and later mode changes belong to figma_update_variable_collection. It does not explicitly contrast with figma_add_variable_mode or figma_create_variables for bulk creation, so the alternative routing is only partly covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_variablesCreate variablesAIdempotent
A token set in ONE call (one undo step): primitives first, then semantic tokens that alias them, each with a value per mode, scopes and code syntax. Values are strings: "#1a2b3c" / "#1a2b3c80", "16", text, "true", or "alias:" — the target must exist already or come EARLIER in this call, with the same type. Everything is checked before the first variable exists, so a refusal creates nothing. ifExists decides what a name the collection already has does: "error" (default), "skip" (keep it; aliases resolve to it), or "update" (set the given values and properties). Up to 200 per call, paced so Figma stays responsive. For one variable figma_create_variable is enough; to change properties later use figma_set_variable_properties. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| ifExists | No | Default "error". | |
| variables | Yes | ||
| collectionId | Yes | The collection, from figma_get_variable_defs or figma_create_variable_collection. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that everything is validated before the first variable exists so a refusal creates nothing, the 200-per-call cap, pacing for Figma responsiveness, alias target ordering with type matching, and editor availability (Design; unverified FigJam/Slides). The only reason it is not a 5 is that it does not describe what the response contains on partial or refused runs, which matters for a batch write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core (token set, one call, one undo step) and every sentence carries load-bearing information. Slightly dense in the values/alias sentence, where the em-dash chains pack three constraints together, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex batch mutation with no output schema, the description covers atomicity, validation timing, ordering dependencies, size limits, idempotent existence handling, editor support and escape hatches to sibling tools. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 83%, but the description adds real meaning: the string literal formats for values ('#1a2b3c', '16', text, 'true', 'alias:<name or id>'), the constraint that alias targets must exist earlier in the same call with the same type, and the full behavior of ifExists. It does not add anything for force, session or idempotencyKey, which the schema already covers well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a whole token set / variable collection entries in one call), plus the atomicity promise (one undo step) and the primitives-then-aliases ordering. It names the sibling it is not (figma_create_variable for a single variable), so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'For one variable figma_create_variable is enough; to change properties later use figma_set_variable_properties.' It also gives the decision rule for name collisions via ifExists (error/skip/update) and the ordering rule for aliases, so the when and the how are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_vectorCreate vectorAIdempotent
Draw any shape from SVG path data — a blob, a wave divider, a custom arrow, a logo mark, a chart line. path is the d of an SVG (M L H V C S Q T A Z, absolute or relative). width/height scale it (one keeps its proportions). Give stroke without fill for an open line. For a whole SVG file (an icon) use figma_import_svg. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| fill | No | ||
| name | No | ||
| path | Yes | e.g. "M0 40 C 60 0, 120 80, 180 40 L180 80 L0 80 Z". | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | ||
| height | No | ||
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| stroke | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| strokeWeight | No | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, idempotent=true, so safety is covered; the description adds genuinely new context the annotations can't carry — editor availability (Design verified, FigJam/Slides unverified) and scaling behavior ("one keeps its proportions"). It does not restate the STALE/force overwrite protocol, but that lives in the `force` schema description, so the remaining gap is small.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability, then parameter semantics, then the sibling routing rule, then editor availability — a deliberate most-to-least-important order. Every sentence is a distinct, load-bearing fact; even the example list ("a blob, a wave divider, a custom arrow") disambiguates the tool's purpose rather than decorating it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with no output schema and 36% schema coverage, the description leaves the agent guessing about placement parameters (x, y, parentId), what the tool returns (a node id?), and whether it defaults into the current page or a parent. With annotations covering safety and idempotency, it is adequate but not complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 36% across 14 params, so the description carries real burden — and it does explain `path` (the `d` attribute, with the command alphabet M L H V C S Q T A Z, absolute or relative), `width`/`height` scaling, and the stroke-without-fill interaction. But x, y, name, parentId, fill, and strokeWeight get no semantic treatment in either place, so the compensation is partial rather than complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Draw any shape from SVG path data") and immediately distinguishes itself from the primitive shape tools (rectangle/ellipse/polygon/star) by naming concrete use cases — blob, wave divider, custom arrow, logo mark, chart line. An agent can tell this apart from figma_import_svg and the shape primitives without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For a whole SVG file (an icon) use figma_import_svg" is an explicit, actionable routing rule, and "Give `stroke` without `fill` for an open line" gives a usage recipe. It stops short of naming the closest sibling alternatives (figma_create_rectangle, figma_create_ellipse, figma_create_shapes_with_text) as when-not cases, so the agent must still infer the boundary with the primitive shape tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_delete_component_propertyDelete component propertyADestructiveIdempotent
Delete a TEXT, BOOLEAN, INSTANCE_SWAP or SLOT property from a component or component set: every instance loses it, overrides included. A VARIANT property cannot be deleted — it comes from the variant names, so rename the variants instead. To rename or rewire a property use figma_edit_component_property. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| property | Yes | Its name ("Label") or full key ("Label#2:0"). | |
| componentId | Yes | The COMPONENT or COMPONENT_SET (a variant id is redirected to its set). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known; the description goes further and describes the blast radius concretely ('every instance loses it, overrides included'), which is the detail an agent needs before a destructive call. It also discloses editor availability (Design; unverified FigJam/Slides), a caveat annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler: the destructive consequence is front-loaded, then the exclusion, then the alternative, then environment caveats. Every clause carries decision-relevant 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?
With no output schema and full schema coverage, the description supplies exactly the missing layer: consequences, type restriction, sibling routing, and platform support. Nothing an agent needs to call this destructive tool safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (including force, idempotencyKey, and the stale-write semantics) are already documented in the schema. The description adds no parameter-level detail beyond the general rule about which property types are eligible, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (delete) plus resource (component property) and an explicit enumeration of the deletable property types. It also names the sibling it is not (figma_edit_component_property) and the one type it refuses (VARIANT), so an agent can distinguish it from nearby tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the use case, states an explicit exclusion ('A VARIANT property cannot be deleted — it comes from the variant names, so rename the variants instead'), and routes renaming/rewiring to figma_edit_component_property. When-to-use, when-not, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_delete_nodesDelete nodesADestructiveIdempotent
Delete nodes by id. This is the correct way to undo agent work: pass the ids the create call returned. One Ctrl+Z reverts the whole original call. In a deck a slide row that still holds slides is refused (delete its slides first); a row its last slide left is reported in emptiedRows. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint/idempotentHint annotations: partial-failure semantics ("one node failing does not fail the call"), the refusal rule for non-empty slide rows, the `emptiedRows` report channel, undo granularity ("One Ctrl+Z reverts the whole original call"), and editor support scope (Design verified, FigJam/Slides unverified). These are exactly the operational traits an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then undo framing, then edge cases, then return shape, then editor scope. Six short clauses with no filler; the semi-colon and parenthetical usages are used to compress caveats rather than pad.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies the return contract itself (`items: [{ id, ok, error? }]`, `emptiedRows`). Combined with the refusal rules and editor-coverage caveat, an agent has everything needed to invoke and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%; `force`, `session`, and `idempotencyKey` are already documented in the schema. The description compensates for the one bare parameter, `nodeIds`, by specifying its provenance ("the ids the create call returned") and the 500-item batch behavior implied by per-item results. It adds real meaning rather than restating fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Delete nodes by id") and immediately disambiguates the intent by framing it as the undo path for agent work. An agent can distinguish it from figma_undo_step or figma_clone_node without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ("the correct way to undo agent work: pass the ids the create call returned") and gives a concrete prerequisite for the deck/slides case ("delete its slides first"). It stops short of naming sibling tools such as figma_undo_step or figma_delete_variable, so the alternative-selection guidance is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_delete_styleDelete stylesADestructiveIdempotent
Delete local styles (paint, text, effect, grid) by id. Nodes that used one keep the values it gave them. figma_get_styles lists ids. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| styleIds | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint, idempotentHint) by disclosing the key semantic consequence: 'Nodes that used one keep the values it gave them.' It also documents partial-failure behavior and the exact per-item result shape, and flags unverified editors — exactly the context an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the verb and resource, then consequences, then id source, then return shape, then environment. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return contract ('items: [{ id, ok, error? }]') and the important partial-failure rule, plus the data-retention consequence for previously styled nodes. Nothing an agent needs to call this destructive tool safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema already fully documents force, session, and idempotencyKey; the description adds only that ids come 'by id' and can be sourced from figma_get_styles. The styleIds parameter's array shape and 500-item cap are left entirely to the schema, so this is baseline territory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific verb and resource with scope: 'Delete local styles (paint, text, effect, grid) by id.' It explicitly enumerates the style types, which separates it from figma_delete_variable_collection, figma_delete_nodes, and mutation siblings like figma_update_style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points to figma_get_styles as the source of ids, giving a clear prerequisite path, and states environment applicability ('Editors: Design; unverified: FigJam, Slides'). It stops short of explicitly naming a when-not-to-use case (e.g., removing a style from a node vs. deleting it), so it lands at 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_delete_variableDelete variablesADestructiveIdempotent
Delete variables (design tokens) by id. Nodes bound to one keep its last resolved value. figma_get_variable_defs lists ids. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| variableIds | Yes | e.g. ["VariableID:1:2"]. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructive=true, but the description adds materially: "Nodes bound to one keep its last resolved value" describes the post-deletion effect, and the per-item results contract explains that one node failing does not fail the call (partial-success semantics). It also adds editor-support scope (Design vs unverified FigJam/Slides), which no annotation covers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and then packs consequence, id source, return shape, and editor support into a couple of tight sentences with no filler. It is somewhat telegraphic, but every clause carries distinct information an agent would otherwise lack.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description defines the return shape (`items: [{ id, ok, error? }]`) and partial-failure behavior, covers the destructive side effect, and scopes editor availability. For a 4-param destructive mutation, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so force, session, variableIds, and idempotencyKey are all documented in the schema itself. The description reinforces the id-based semantics and cross-references where to get ids, but adds no syntax or format detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Delete variables (design tokens) by id." This is clearly distinct from sibling figma_delete_variable_collection (collection-level) and figma_delete_style, and the parenthetical gloss '(design tokens)' removes ambiguity about what a variable is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points the agent to figma_get_variable_defs for obtaining ids, which is the key prerequisite. It does not explicitly contrast with figma_delete_variable_collection or explain when to prefer deleting a whole collection, so the when-not guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_delete_variable_collectionDelete variable collectionADestructiveIdempotent
Delete a variable collection together with every variable in it. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| collectionId | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the bar is lower; the description still earns credit by disclosing that all contained variables are destroyed with the collection — the single most important thing an agent must know before calling. It stops short of saying whether the deletion is undoable or how force/STALE applies to this 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?
Two short sentences, no filler, with the destructive cascade front-loaded before the editor-availability caveat. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, four-parameter mutation with no output schema, the description plus annotations cover the essential risk (cascading loss of variables) and platform support. A note on reversibility/undo or on expected return would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, near the threshold where the schema does the heavy lifting, and force, session and idempotencyKey are well documented there. The description adds nothing about parameters, and the required collectionId has no schema description at all, which the description could have compensated for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a variable collection) and immediately clarifies the cascade: every contained variable goes too. That scoping detail distinguishes it in effect from figma_delete_variable, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Editors: Design; unverified: FigJam, Slides' note gives a useful eligibility boundary, but there is no explicit when-to-use guidance or pointer to alternatives such as figma_delete_variable for a single variable or figma_update_variable_collection for fixing rather than removing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_detach_instanceDetach instanceADestructiveIdempotent
Detach instances into plain frames that no longer follow their component. The frame gets a new id, reported per item as frameId. Cannot be re-attached. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, but the description adds real context beyond them: irreversibility, that a new frame id is generated, and that per-item failures are tolerated ('one node failing does not fail the call'). That partial-failure semantics is not recoverable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the transformation and its consequence, followed by the irreversibility warning and result contract. 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?
No output schema exists, yet the description supplies the return contract (`items: [{ id, ok, error? }]`, `frameId`) and the partial-failure behavior. Combined with irreversibility and platform scope, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema already documents force, session, and idempotencyKey well, so the baseline is 3. The description's mention of `frameId` and the items result shape is output information rather than added meaning for the input parameters, which it leaves untouched.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Detach instances') plus the concrete outcome ('into plain frames that no longer follow their component'). It is clearly distinguishable from siblings like figma_create_instance and figma_swap_component, though it doesn't name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives meaningful usage context: irreversible ('Cannot be re-attached') and editor support scope ('Design; unverified: FigJam, Slides'). It does not articulate when to prefer a detach over e.g. swap_component or clone, so it stops short of explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_download_assetsDownload assetsARead-only
Write a design's ASSETS to disk for implementing it in code: per node, its export presets as the designer set them (format and suffix each), or one render in format at scale when it has none; plus the ORIGINAL bytes of every image fill in its subtree (deduplicated by hash, at most 20 per call, rawImagesTruncated when there were more) — the photo under a hero's headline without the headline baked in. Re-runs overwrite the same files. Paths follow figma_export_node's saveTo rules. To SEE a design use figma_export_node; this one is for files the code ships.
| Name | Required | Description | Default |
|---|---|---|---|
| dir | No | Directory for the files. Defaults to the export directory. | |
| scale | No | Raster scale for those renders, default 2. Ignored for SVG/PDF. | |
| format | No | Render format for nodes with no export presets. Default PNG. | |
| nodeIds | Yes | Nodes (ids or Figma links) whose assets to write. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| rawImages | No | Also write the original bytes of image fills. Default true. | |
| useExportSettings | No | Use each node's own export presets when it has any. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing rate/volume limits ('at most 20 per call, `rawImagesTruncated` when there were more'), idempotency ('Re-runs overwrite the same files'), dedup-by-hash behavior, and where paths come from (figma_export_node's saveTo rules). The description does explicitly describe writing and overwriting files on disk while annotations declare readOnlyHint=true; this is defensible as 'does not modify the Figma document', and because the write behavior is fully disclosed the agent is not misled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and resource, and every sentence carries information (presets, raw images, overwrite caveat, path rules, sibling routing). The first sentence is a dense mega-sentence packing three distinct behaviors, which slightly taxes scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still conveys what lands on disk, the truncation flag, and where files go, which is most of what an agent needs. It does not describe the return payload itself (e.g. any list of written paths), so the response shape remains partly implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds combination semantics the schema omits: export presets win when present, and format/scale only apply to nodes without presets. It also explains rawImages' effect on the output (original bytes, dedup, truncation) rather than just restating the boolean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Write a design's ASSETS to disk for implementing it in code'. It also explicitly distinguishes itself from the sibling figma_export_node ('To SEE a design use figma_export_node; this one is for files the code ships'), so an agent can pick between them without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tool and the condition that selects it: seeing/inspecting a design routes to figma_export_node, while shipping assets in code routes here. The preset-vs-render logic further clarifies when each code path applies, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_edit_component_propertyEdit component propertyAIdempotent
Change a component property that already exists: rename it (name — the key changes and is returned), change its default, set an instance swap's preferred components, or wire / unwire layers (bindNodeIds / unbindNodeIds, matched by name path in every variant of a set). A variant id is redirected to its set. Figma's rules are checked before anything changes: no default for VARIANT or SLOT, preferredValues only on INSTANCE_SWAP and SLOT. To add a property use figma_add_component_property; to change one instance's value, figma_set_instance_properties. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A new name. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| property | Yes | Its name ("Label") or full key ("Label#2:0"). | |
| bindNodeIds | No | Layers inside the component to drive with this property. | |
| componentId | Yes | The COMPONENT or COMPONENT_SET (a variant id is redirected to its set). | |
| defaultValue | No | Text, "true"/"false" for BOOLEAN, a component id for INSTANCE_SWAP. | |
| unbindNodeIds | No | Layers to stop driving. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| preferredValues | No | INSTANCE_SWAP / SLOT: component or component-set ids offered first. [] clears them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false): it discloses the pre-flight validation rules (no default for VARIANT or SLOT, preferredValues only on INSTANCE_SWAP/SLOT), variant-id redirection to the set, name-path matching across every variant, and that renaming changes the key and returns it. It also declares editor support scope (Design verified; FigJam/Slides unverified), which is real operational 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?
Front-loaded with the mutation modes and ends with sibling routing and platform scope — no filler sentences. It is dense with parentheticals and conditional rule clauses, which costs some readability, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with full schema coverage and annotations present, the description covers purpose, alternatives, validation constraints, and platform support. The remaining gap is return shape: it mentions the new key is 'returned' but does not say what the overall result looks like, and there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines all 10 parameters — baseline 3. The description still adds semantics the schema lacks: bindNodeIds/unbindNodeIds are 'matched by name path in every variant of a set', and `name` changes the key rather than just labeling it. `force` and `idempotencyKey` semantics live only in the schema, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Change a component property that already exists') and then enumerates the concrete mutation modes: rename, default change, preferred components, bind/unbind layers. It distinguishes itself from the two closest siblings by name, so an agent can pick it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes adjacent intents elsewhere: 'To add a property use figma_add_component_property; to change one instance's value, figma_set_instance_properties.' It also states the precondition that Figma's rules are validated before any write, which is a usage constraint rather than mere description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_edit_connectorsEdit connectors (FigJam)AIdempotent
Change existing FigJam connectors in place, 1–200 per call: re-point from / to (the endpoint strings of figma_create_connectors), or set label, lineType, caps, color, weight, dash, labelBackground. The ids stay, so it runs inside figma_batch. Every item is parsed, and every end checked, before the first change; a missing node or one that is not a connector is a per-item error. Returns per-item results. Editors: FigJam only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| connectors | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the whole batch is parsed and every endpoint checked before the first change, a missing node or non-connector node is a per-item error, and per-item results are returned. It also flags the FigJam-only and 'unverified' support status, which no structured field carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and batch size, then the batch atomicity guarantee, then the return shape and scope caveat. Every clause carries information; nothing restates the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description states per-item results and the per-item error model, which is the key return contract. For a 4-parameter mutation tool with rich schema descriptions, the remaining gap (error codes, what happens to items that fail validation) is small and largely covered by the schema's force/STALE documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and already documents force, session, idempotencyKey and the endpoint grammar in detail. The description still adds value by collecting the editable surface (re-point from/to or set label, lineType, caps, color, weight, dash, labelBackground) and by tying from/to back to the figma_create_connectors string format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: 'Change existing FigJam connectors in place'. It explicitly contrasts with creation and names the sibling figma_create_connectors as the source of the endpoint-string format, so an agent can distinguish the two immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes the edit-vs-create split clear and adds a concrete runtime condition: 'The ids stay, so it runs inside figma_batch'. It states the 1–200 batch bound and the 'FigJam only, unverified' scope caveat. It never explicitly says when NOT to reach for this tool beyond implying create is the alternative, so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_edit_tableEdit a table (FigJam)ADestructiveIdempotent
Change a FigJam table's structure and cells. Cells have no ids: they are { row, column }, 0-based. Applied in this order, every index checked against the table's size before anything changes: removeRows / removeColumns (their content is lost), then insertRowsAt / insertColumnsAt (positions in the table after removals; each adds one before that index, the count appends), then moveRow / moveColumn { from, to }, then columnWidths / rowHeights [{ index, width | height }], then cells (up to 2000, in the final table): text, fill (table preset or hex; "" is refused — give "#FFFFFF" to reset), textColor. Removing every row or column is refused. Returns the new size and per-cell results. Editors: unverified in FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| cells | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | The TABLE. | |
| moveRow | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| moveColumn | No | ||
| removeRows | No | ||
| rowHeights | No | ||
| columnWidths | No | ||
| insertRowsAt | No | ||
| removeColumns | No | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| insertColumnsAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses the atomic index-validation guarantee ('every index checked against the table's size before anything changes'), that removed rows/columns lose content, the 2000-cell cap, that empty-string fill is refused, and what is returned. The closing note 'Editors: unverified in FigJam, Slides' adds platform caveat context, though it is vague about what 'unverified' actually means for the caller.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose before the dense ordering sentence, and every clause (ordering, atomicity, remove-everything refusal, empty fill refusal, return shape) carries non-redundant information. The operation-order sentence is a long chain of 'then ... then' that takes effort to parse, but nothing in it is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, nested-object mutation tool with no output schema, the description covers execution ordering, atomicity, limits, refusal conditions and return shape. The main remaining ambiguity is the trailing 'Editors: unverified in FigJam, Slides' note, which leaves unclear whether the tool is supported in Slides tables at all.
Complex tools with many parameters or behaviors need more documentation. 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 only 31% schema description coverage across 13 parameters, the description carries the load and does so: it explains that cells have no ids and are 0-based {row, column}, that insert positions refer to the table *after* removals and append at the row count, the {from, to} shape for moves, and the {index, width|height} shape for sizing. force, session and idempotencyKey are already documented in the schema, so the remaining gap is minimal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Change a FigJam table's structure and cells') and then enumerates exactly which structural operations are supported, which cleanly separates it from the create-side sibling figma_create_table. It never names the create/delete alternatives explicitly, but the scope is unambiguous from the first sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the operation list and refusal rules ('Removing every row or column is refused'), so an agent can infer the domain of valid edits. However, there is no guidance on when to prefer this tool over figma_create_table or figma_set_text for cell content, and no statement of prerequisites (must be a FigJam table node).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_export_frames_to_pdfExport frames to PDFARead-only
Export frames to one multi-page PDF, one frame per page, in the order of nodeIds. In a Figma Slides file, deck: true instead exports every slide in presentation order, leaving out skipped slides unless includeSkipped; the result lists slideIds in page order. Each frame is rendered by the plugin and the pages are merged by the bridge. A frame that cannot be rendered is reported in failed[] and the rest still merge — an unreadable page is worse than a missing one, so nothing is silently substituted. final: true marks the delivery: under BRIDGE_PROCESS=strict every page that belongs to a brief needs a passing figma_sign_off newer than its last change.
| Name | Required | Description | Default |
|---|---|---|---|
| deck | No | Figma Slides: true exports every slide of the deck, in order, instead of nodeIds. | |
| final | No | The delivery. Under BRIDGE_PROCESS=strict a node that belongs to a brief needs a passing figma_sign_off newer than its last change. Default false: a render to judge, never gated. | |
| nodeIds | No | Frames to export, in page order. Not with `deck`. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| outputPath | Yes | Where to write the merged PDF. Same path rules as `figma_export_node`'s `saveTo`. | |
| includeSkipped | No | With deck: also the slides skipped in the presentation. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: rendering is split between plugin and bridge, partial failures land in `failed[]` and the rest still merge, and `final: true` is gated by figma_sign_off under BRIDGE_PROCESS=strict. This tells the agent exactly what happens on partial failure and what the strict-mode precondition is, which annotations alone could not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core export behavior, then deck mode, then failure handling, then delivery gating. Dense em-dash clauses make it harder to skim, but every sentence carries real information rather than restating the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fills the gap by describing the returned `failed[]` and `slideIds` fields and their ordering. For a 6-param export tool with a partial-failure model, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema lacks: nodeIds defines page order, deck enumerates slides in presentation order, and the result reports `slideIds` in page order. The `final` and `session` params get slightly weaker treatment in the prose, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the output shape: 'Export frames to one multi-page PDF, one frame per page, in the order of `nodeIds`.' The deck-mode clause further scopes the Slides variant, which clearly separates it from single-node siblings like figma_export_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?
Gives concrete routing rules: nodeIds for frames, `deck: true` for Slides files, `includeSkipped` only with deck, and `final: true` reserved for delivery. It never explicitly names a required alternative tool (e.g. 'for a single node use figma_export_node'), only nodding at it via the outputPath path-rule reference, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_export_nodeExport / screenshot a nodeARead-only
Render a node so you can see it — the screenshot to compare against. No nodeId: the one selected layer. Without saveTo, PNG/JPG come back as an image (≤ 5 MB) with its bounds and pixel size, and SVG as markup; an inline PNG/JPG with no scale is held to 1024 px on its longest side (maxSize changes that; capped says it happened; scale asks for an exact size instead). With saveTo, or for PDF, or when larger than 5 MB, the file is written and its path returned. A relative saveTo lands in the export directory; other folders must be listed in BRIDGE_EXPORT_ROOTS. If format is omitted, the saveTo extension decides, else PNG. An animated frame renders at rest: see its motion with figma_export_video, then figma_review_video. final: true marks the delivery: under BRIDGE_PROCESS=strict a node of a brief needs a passing figma_sign_off newer than its last change. Skill: critique (figma_get_guide). For files a codebase ships (presets, original images), use figma_download_assets.
| Name | Required | Description | Default |
|---|---|---|---|
| final | No | The delivery. Under BRIDGE_PROCESS=strict a node that belongs to a brief needs a passing figma_sign_off newer than its last change. Default false: a render to judge, never gated. | |
| scale | No | Exact pixel scale for PNG/JPG; bypasses the size cap. | |
| format | No | PNG (default), JPG, SVG or PDF. | |
| nodeId | No | The node to render: an id ("12:34") or a Figma link. Default: the one selected layer. | |
| saveTo | No | Write to this file instead of returning the render inline. | |
| maxSize | No | Longest side in pixels for PNG/JPG (never upscales). Default 1024 inline. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read, and the description adds substantial context beyond them: a 5 MB inline ceiling, a 1024 px cap on inline PNG/JPG, the `capped` flag, relative-path resolution into the export directory, the BRIDGE_EXPORT_ROOTS allowlist, and the fact that animated frames render at rest. That is exactly the kind of operational detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the output-mode rules, and nearly every clause carries information. It is dense to the point of stacking parentheticals ('maxSize changes that; capped says it happened; scale asks for an exact size instead'), which costs some scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates fully: it describes inline image returns with bounds and pixel size, SVG as markup, and file-path returns for saveTo/PDF/oversized cases. Edge cases (animated frames, strict mode, export roots) are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning not in the schema: `format` inferred from the `saveTo` extension with PNG fallback, `scale` bypassing the size cap, `maxSize` overriding the 1024 default, and the strict-mode consequence of `final: true`. These are behavioral semantics, not restatements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Render a node') and frames the intent ('the screenshot to compare against'). It explicitly distinguishes itself from siblings figma_export_video, figma_review_video and figma_download_assets, so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (compare a rendering), when-to-use-something-else (motion → figma_export_video then figma_review_video; shipped assets → figma_download_assets), and when the output mode changes (saveTo, PDF, >5 MB). It also flags the `final: true` gating condition under BRIDGE_PROCESS=strict.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_export_videoExport an animation as videoARead-only
Render the animation of a top-level frame to MP4, GIF or WEBM — the way to SEE motion; figma_export_node renders only the rest state. A layer exports its top-level frame (exportedNodeId). Always writes a file (saveTo, else the export directory). Waits up to wait s (default 40, at most 45); a longer render answers status "rendering" with a jobId, and figma_export_video { jobId } collects it. Name your own jobId for long renders and start no second export meanwhile; cancel + jobId drops one. frameIndices (or frames, seconds) return those frames as PNG (long side ≤ 1024), frame-exact, with ffmpeg; ones not cut in time come back as framesPending. A render is a preview; final: true is the delivery, refused under BRIDGE_PROCESS=strict until figma_check_motion passed on the frame at this fps, the file unchanged since. Meanwhile other Figma calls answer BUSY. fps: MP4/WEBM 12|24|30|60, GIF 8|12|15|24|30. Skills: motion, critique. Editors: Design only.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | MP4/WEBM 12, 24, 30 (default), 60; GIF 8, 12, 15 (default), 24, 30. | |
| wait | No | Seconds this call waits for the render (default 40; at most 45 unless the server allows more). Lower it if your client cuts calls sooner; 0 starts and returns. | |
| final | No | true for the delivery render: needs a passing figma_check_motion on the frame at this fps, with no change to the file since. Default false: a preview. | |
| jobId | No | Letters, digits, . _ -. With `nodeId`: your name for this render. Alone: collect or poll that render. | |
| scale | No | 0.5, 0.75, 1 (default), 1.5, 2, 3 or 4. | |
| width | No | Output width in px; height follows the aspect ratio. | |
| cancel | No | With `jobId` only: drop that render. Figma finishes a render it has begun; its result is discarded. | |
| format | No | Default MP4, or what the saveTo extension implies. | |
| frames | No | Seconds to return as PNG stills, each mapped to its nearest frame, e.g. [0, 0.4]. | |
| height | No | Output height in px; width follows the aspect ratio. | |
| nodeId | No | The animated top-level frame, or any layer inside it (id or Figma link). Starts a render; omit it to collect one by `jobId`. | |
| saveTo | No | File to write, .mp4 / .gif / .webm. Same path rules as figma_export_node's saveTo. | |
| quality | No | MP4/WEBM only. Default HIGH. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| loopCount | No | GIF only: 0 loops forever (default). | |
| frameIndices | No | Frames to return as PNG stills, exactly: frame k is the timeline at k / fps. Not with `frames`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnly/destructive=false, the description still adds substantial context: other Figma calls answer BUSY during a render, `wait` is capped at 45s and a longer render returns status 'rendering' plus a jobId, and `final: true` is refused under BRIDGE_PROCESS=strict until figma_check_motion passes. It does not, however, address whether saveTo overwrites an existing file, which is the one destructive-adjacent risk left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the sibling contrast are front-loaded, and every sentence carries information for a 16-parameter job-lifecycle tool. It is nonetheless a dense, telegraphic wall of backticked tokens that is harder to parse than it needs to be; some sentences chain three or four separate behaviors.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining the return states (file always written, 'rendering' + jobId for long jobs, framesPending for uncut stills, BUSY for other calls). What a successful terminal response actually contains (path, duration, size) is never spelled out, so it stops just short of fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine cross-parameter semantics the schema cannot: frames vs frameIndices mutual exclusion and frame-exact PNG semantics, jobId's dual role (name-with-nodeId vs collect-alone), saveTo's extension implying format, and the per-format fps tables. This exceeds restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Render the animation of a top-level frame to MP4, GIF or WEBM') and immediately differentiates itself from the sibling figma_export_node, which 'renders only the rest state.' An agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing against figma_export_node, the long-render workflow ('figma_export_video { jobId } collects it'), the cancel path, the preview-vs-final distinction, and the frames/frameIndices alternative. When-not conditions are stated too ('start no second export meanwhile', 'Not with `frames`').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_find_replace_textFind and replace textAIdempotent
Find and replace across text: TEXT nodes and, on a board, stickies, shapes, connector labels and table cells (an item names the node, plus cell "row,column"); code blocks with includeCode. Other styled runs in a text are kept. Scope it to the page (default), the selection, or a subtree by nodeId. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| regex | No | Treat `find` as a regular expression. Default false. | |
| scope | No | Default "page". | |
| nodeId | No | Subtree root when scope is "subtree". | |
| replace | Yes | The new text; "" deletes each match. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| includeCode | No | Also replace inside code blocks' code. Default false. | |
| caseSensitive | No | Default true. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly=false, idempotent=true, destructive=false; the description adds real value beyond them by disclosing partial-failure semantics ('one node failing does not fail the call'), the per-item result shape, and that non-matching styled runs are preserved. It also warns about unverified editor support, though it doesn't discuss undo/reversibility or the STALE-refusal flow (that lives in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and node coverage, then scope, then return shape, then editor caveat — a logical ordering. It is dense and slightly run-on in the first sentence, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters and no output schema, the description compensates by explaining the return shape (`items: [{ id, ok, error? }]`) and partial-failure behavior. Editor-platform caveats are included; only minor things like undo/recovery expectations are left implicit.
Complex tools with many parameters or behaviors need more documentation. 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 90%, so the schema already documents force/regex/scope/includeCode/caseSensitive/idempotencyKey. The description only marginally extends this, notably the table-cell item format `cell` "row,column" and confirmation that scope options are page/selection/subtree. 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?
Specific verb+resource (find and replace across text) with explicit coverage of which node kinds are affected — TEXT nodes, stickies, shapes, connector labels, table cells, code blocks. It is clearly distinguishable from siblings like figma_set_text (single-node text set) and figma_batch_rename_nodes (names, not content).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent how to bound the search (page default, selection, or subtree by nodeId) and flags editor support ('Editors: Design; unverified: FigJam, Slides'). It stops short of explicitly naming an alternative tool or stating when *not* to use it (e.g. vs. figma_set_text for single-node replacement).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_fit_sectionsFit sections to their contentAIdempotent
Resize sections to hug what they hold plus padding ("32" by default, or "top,right,bottom,left" — a board wrapper often takes "68,60,100,80"), never below minWidth / minHeight. Sections listed together are fitted inner-first, so an outer one fits its inner ones' final size. Children move only when they reach into the top or left padding; connectors never move — they follow their ends. An empty section is left as it is, with a note. Do not fit a participatory zone sized for the activity, or one of a grid of equal sections. Works on Figma Design sections too. A size you choose: figma_resize_nodes. Returns per-section results with the new size. Editors: unverified in Design, FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | SECTION ids. | |
| padding | No | Padding: one number for all sides ("24"), or four comma-separated ("48,48,32,32") for top,right,bottom,left. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| minWidth | No | ||
| minHeight | No | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-destructive, idempotent write, so the safety profile is covered. The description then adds genuinely useful behavior beyond that: inner-first fitting order, that children move only when inside top/left padding, that connectors follow their ends, that empty sections are skipped with a note, and per-section results. The one real weakness is editor support, which is hedged as 'unverified in Design, FigJam, Slides' rather than stated as a constraint. Strong on disclosure but not fully resolved on support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core action is front-loaded in the first clause, with edge cases and exclusions following in a sensible order. The single dense paragraph carries a lot of parenthetical detail (padding format, editor caveat) that slows scanning, but no sentence is truly 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?
There's no output schema, and the description compensates by stating the return shape ('per-section results with the new size'). Combined with edge-case handling for empty sections, connectors, and nested sections, an agent has everything needed to call this correctly on a 7-parameter write 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?
Adds meaning beyond the 71%-covered schema: the default padding of 32, a realistic board-wrapper example, and the floor semantics of minWidth/minHeight, which have no schema descriptions at all. It doesn't explain the interplay between force/STALE and section fitting, but the schema already documents force thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Resize sections to hug what they hold plus padding'), which is a distinct operation from plain resizing. It explicitly names the sibling that does the other thing ('A size you choose: figma_resize_nodes'), so an agent can separate the two without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-nots ('Do not fit a participatory zone sized for the activity, or one of a grid of equal sections') and an alternative for the opposite case (figma_resize_nodes). It also states ordering behavior for co-listed sections, so an agent knows how to batch the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_flatten_nodesFlattenAIdempotent
Flatten nodes into one editable vector (Ctrl+E) — for a finished icon or a boolean shape that should become a single path. They must share a parent. Cannot be undone except with Ctrl+Z. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: the parent-sharing precondition, the reversibility caveat ("Cannot be undone except with Ctrl+Z"), and per-editor availability (Design verified; FigJam/Slides unverified). Annotations only declare the safety/idempotency flags, so this is genuine added value. It does not say what happens to child layers, fills, or effects after the merge.
Agents need to know what a tool does to the 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, front-loaded with the action and keyboard shortcut, then precondition, then risk, then editor support. No filler and nothing misplaced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive-ish structural mutation with no output schema, the description covers the prerequisite, reversibility, and platform availability, which is most of what an agent needs. It leaves open what the resulting node looks like (name, id, whether the merge preserves effects) and why one would pass `force` here.
Complex tools with many parameters or behaviors need more documentation. 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 60% and the description adds nothing about any of the five parameters — no word on the optional `name` (undocumented in the schema), on `force`/`idempotencyKey` semantics, or on batching 200 node IDs. Baseline 3 is appropriate since the schema already documents force, session, and idempotencyKey thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ("Flatten nodes into one editable vector") and states the resulting artifact plus the shortlist of use cases (finished icon, boolean shape becoming one path). An agent can distinguish this from figma_boolean_nodes or figma_group_nodes without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use condition ("a finished icon or a boolean shape that should become a single path") and a hard prerequisite ("They must share a parent"). It does not name the sibling alternatives (group/boolean/combine) or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_annotationsGet annotationsARead-only
Annotations on a node or subtree — the notes designers leave for developers — each with its category (label, colour), plus the subtree's dev resources (links to code, tickets, docs) where Figma provides them. Empty is a normal answer, not an error. The result's scope names the root that was read. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | No | Subtree root: node id or a Figma link. Defaults to the one selected layer, then the current page. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered structurally. The description adds genuinely useful behavior beyond that: an empty result is 'a normal answer, not an error', the editor support matrix, and the presence of a `scope` field naming the root that was read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no waste: the resource and its payload lead, the empty-result expectation follows, and the environment note closes. Every sentence earns its place and the most decision-relevant fact is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully sketches the return shape (per-annotation category/label/colour, dev resources, a `scope` root name), so an agent can interpret results. It stops short of covering failure modes other than empty results or behavior on very large subtrees.
Complex tools with many parameters or behaviors need more documentation. 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 nodeId's defaulting chain (selected layer, then current page) and the session/file-selection logic are already documented in the schema. The description adds no parameter-level detail, which is the correct baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (annotations on a node or subtree), defines what annotations are ('the notes designers leave for developers'), and adds the dev-resources payload in the same breath. It never mentions a sibling such as figma_get_metadata or figma_get_design_context, so an agent must still guess which read tool to reach for when several return node data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 line 'Editors: Design; unverified: FigJam, Slides' functions as an environment constraint on when this call is reliable, and the empty-result note heads off a common false failure. However, there is no guidance on when to prefer this over sibling read tools (metadata, design context, node info), and no prerequisites for the session parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_briefGet a briefARead-only
Read the brief a frame was made from — role, gear, lines, directions, system, status — with its last sign-off (and whether the frame changed since) and its motion plan; with no node, every open brief in the file. For an open brief, next: the stage the record shows (brief, directions, choice, system, build, critique, sign-off), what it lacks to move on, the call that supplies it, and what sign-off still asks for. Reading an open brief adopts it for this session, so a second agent can continue the work. Reads only.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | No | A node: its own brief, else its top-level frame's, else the brief listing it, else its page's. | |
| target | No | The facts the process gate reads: the target's type, whether it is top level, its child count. | |
| briefId | No | The node the brief is stored on (figma_set_brief's briefId). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| fingerprint | No | With nodeId: compare the node now with its last sign-off (`fresh`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and 'Reads only' is consistent with that. The description adds genuinely non-obvious behavior beyond annotations: reading an open brief adopts it for the session so a second agent can continue the work, and the fingerprint option compares the node against its last sign-off. That side-effect/concurrency disclosure is the kind of addition that earns credit over the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose comes first, followed by the no-node fallback and then the `next` payload description. It is dense and jargon-heavy with long em-dash chains ('role, gear, lines, directions, system, status'), but each clause carries distinct information and nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with no output schema, the description does a good job explaining the returned brief record, the `next` fields, and sign-off comparison. However, the nested `target` parameter (described only vaguely in the schema as 'the facts the process gate reads') and the `session` file-selection parameter are left unexplained, which is a real gap for an otherwise complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, including the nodeId resolution chain. The description reinforces fingerprint's comparison semantics but says nothing about `target` (the process gate) or `session`, so it does not add meaning beyond the schema for those. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the brief a frame was made from') and enumerates exactly what the record contains (role, gear, lines, directions, system, status, sign-off, motion plan), plus the no-node fallback ('every open brief in the file'). It never names a sibling tool (e.g. figma_set_brief or figma_get_guide) to draw the read-vs-write line, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For an open brief, `next`: the stage the record shows ... what it lacks to move on, the call that supplies it' implies the use case of finding the next step, and the no-node form implies a listing use case. But there is no explicit when-to-use / when-not statement and no alternative tool is named, so the agent must infer which tool to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_changesWhat changed in this fileARead-only
What changed in this file: what you report at the end of an instruction, and what a person reads to review your work. journal: the write calls this server sent to the file, newest last, each { seq, at, tool, summary, ok, error?, created? (nodes it made), targets? (nodes it named), rolledBack? }, with each savepoint as its own entry. From the plugin: changes (the latest change per node by a person here or a collaborator; one that leaves a node as you last wrote or read it is yours, however late), conflicts (such a change to a node you had read or written), pageSwitches, watchedPageId (only that page is watched). since: the calls after a seq ("12") or after a savepoint ("sp-3"); limit: the newest calls (default 100). savepoints lists this file's. The journal lives in this server process: a restart starts it empty. Reads only. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | The newest calls to return, at most. Default 100. | |
| since | No | Only what came after: a journal seq as a string ("12") or a savepoint id ("sp-3"). Default: everything kept. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive=false, and the description repeats 'Reads only'. It earns credit for genuinely new behavior: the journal lives in this server process and 'a restart starts it empty' (volatility), how a change counts as 'yours' versus a collaborator's, what a conflict is, and which editors are verified (Design) versus unverified (FigJam, Slides). Return-shape detail is also given where no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, and most sentences carry real information, but it collapses the journal entry shape, plugin fields, parameter notes, volatility, and editor support into one dense paragraph. Clauses like 'one that leaves a node as you last wrote or read it is yours, however late' take effort to parse and would read better as structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return contract – and it does, enumerating journal entry fields (seq, at, tool, summary, ok, error, created, targets, rolledBack) and the plugin payload. Combined with volatility disclosure and editor coverage, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description restates the same semantics the schema already carries – `since` accepts a seq ("12") or a savepoint id ("sp-3"), `limit` is the newest calls defaulting to 100 – rather than adding new meaning. The `session` parameter is not addressed at all in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource: the change view of a file, split into the server-side write `journal` and the plugin-side `changes`/`conflicts`/`pageSwitches`. That is well beyond a restatement of the name, and it is distinguishable from `figma_savepoint`/`figma_rollback`. It never explicitly contrasts itself with those siblings, which keeps it out of the 5 tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: 'what you report at the end of an instruction, and what a person reads to review your work' – an agent knows this is the wrap-up/reporting call. It also implicitly routes `since`/`limit`/`savepoints` to their purposes. No explicit when-not-to-use or named alternative is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_componentGet one componentARead-only
One component's API, as code or an instance needs it: its property definitions (key, name, type, default, variant options, preferred swap targets), its variants with their values, the default variant, and which layers each property drives. Pass a component, a component set, a variant (answered from its set, where Figma keeps the definitions) or an instance (answered from its main component — library ones too, read-only). key is what figma_import_library_assets and figma_create_instance componentKey take. figma_get_local_components lists components; figma_get_design_context shows an instance's current values. references is paginated with limit + cursor. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max layer references returned. Default 200. | |
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| nodeId | Yes | A COMPONENT, COMPONENT_SET, variant or INSTANCE id. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false. The description adds substantial context beyond that: responses for library instances are read-only, variants are answered from their set, references are paginated with limit and cursor, and editor support is noted as Design only with FigJam and Slides unverified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense and front-loads what the tool returns. The first sentence is long and packed, but every sentence carries useful routing or behavioral detail, 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?
There is no output schema, so the description must explain return values, and it does: property definitions, variants with values, default variant, driven layers, and paginated references. Combined with annotations covering the safety profile and editor availability, nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema: it clarifies that nodeId can be a COMPONENT, COMPONENT_SET, variant, or INSTANCE and how each is handled, notes that the returned key is what figma_import_library_assets and figma_create_instance componentKey take, and explains that references is paginated via limit and cursor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('One component's API') and enumerates the exact return content: property definitions, variants, default variant, and driven layers. It distinguishes itself from siblings by naming figma_get_local_components and figma_get_design_context, so an agent can select it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains which node types are accepted (component, component set, variant, instance) and how each is resolved. It also routes the agent to alternatives: figma_get_local_components for listing components and figma_get_design_context for an instance's current values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_design_contextGet design contextARead-only
READ THIS BEFORE YOU BUILD OR CODE. The design as a designer sees it: one tree with, per node, size, position, auto-layout (gap, padding, alignment, wrap row gap, grid tracks, hug/fixed/fill, min/max), constraints, fills (gradient angles, image hashes) / strokes / effects / radius, text with its styled runs and links, styles and variables BY NAME, explicit variable modes, and an instance's component with its keys. stylesUsed / variablesUsed / componentsUsed list the tokens and components met, with ids and keys. FigJam: sticky, shape, connector (endpoints as the connector tools write them), table cells and code blocks, plus connectors, the board's edges. Slides: each slide's row, column and index. No nodeId: every selected layer (roots), else the page — in a deck the focused slide, else its outline; scope says which. Bounded by maxNodes: truncated: true and nextCursor return the rest. Text is cut at maxTextChars.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Levels to descend: 0 is the node alone. Default 8 (a whole screen). | |
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| nodeId | No | Subtree root: node id or a Figma link. Defaults to the selection, then the current page (in Slides the focused slide). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| absolute | No | Add `abs` per node: its box on the page (x/y are relative to the parent). Default false. | |
| maxNodes | No | Stop after this many nodes. Default 500. | |
| includeCss | No | Per-node CSS from Figma's inspect panel (getCSSAsync). Default false; slower. | |
| maxTextChars | No | Characters of text shown per node. Default 400. | |
| includeStyles | No | Style names, text runs and instance components. Default true. | |
| maxTableCells | No | FigJam table cells read per table before it is cut (tableNote). Default 500. | |
| includeGeometry | No | Size, position, auto-layout, constraints, radius, opacity. Default true. | |
| includeVariables | No | Bound variable names and values, explicit modes. Default true. | |
| includeAnnotations | No | Per-node annotations (label, category). Default true. | |
| maxChildrenPerNode | No | Cap on children per node. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the lower bar applies. The description nonetheless adds real operational context: truncation with truncated:true plus nextCursor to resume, maxNodes/maxTextChars/table-cell cutoffs, and that includeCss is slower. However the calibration for read-only annotated tools topped out at 3 when return-format and pagination behavior were absent; here truncation is covered but the description remains a payload inventory rather than disclosing limits such as rate, file-size, or permission requirements. A 3 is the honest landing point.
Agents need to know what a tool does to the 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 imperative warning is front-loaded and virtually every clause carries distinct facts about scope, payload, or truncation. The cost is readability: a single unbroken paragraph of semicolon-separated inventories makes it hard to scan for one specific behavior, so it falls short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with no output schema, the description effectively serves as the return contract, enumerating node fields, token/component use lists, FigJam and Slides specifics, and the scope flag. Combined with truncation and cursor semantics, an agent has everything needed to call it correctly without further reference.
Complex tools with many parameters or behaviors need more documentation. 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 description coverage the baseline is 3, but the description earns an extra point by explaining cross-parameter behavior the schema cannot: maxNodes produces truncated:true and nextCursor, and cursor is "the nextCursor of a truncated call, unchanged," which is the resumption contract. It does not add meaning for depth, absolute, session, or the include* toggles beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource and enumerates the exact payload (per-node geometry, auto-layout, fills/strokes/effects/radius, styled text runs, styles and variables by name, FigJam/Slides structures), so an agent knows exactly what it will get. It never explicitly disambiguates from the many overlapping read siblings (figma_get_node, figma_get_nodes_info, figma_get_metadata), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"READ THIS BEFORE YOU BUILD OR CODE" is a clear, front-loaded directive on when to reach for this tool. It also explains default scope resolution (selection → page → focused slide) which tells the agent what it will get without arguments. It names no alternative or when-not condition, so no 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_fontsList fontsARead-only
Fonts used by text on the current page (scope: "page", default) — every run of mixed-style text counted, and the text of stickies, shapes, connectors and table cells on a board — with how many nodes use each, missingFonts when the file uses a font this machine lacks, and missing: true on each such font. scope: "available": the families this Figma can load, each with its exact style names, 50 per call (limit up to 500; total, truncated and nextCursor say what is left). query keeps names containing a word ("serif", "grotesk"); families checks exact names and lists the ones not found in missing. query, families, limit and cursor imply scope "available".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Families per call. Default 50. | |
| query | No | Available families whose name contains this, case-insensitive, e.g. "mono". | |
| scope | No | Default "page", or "available" when a filter below is given. | |
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| families | No | Exact family names to check, e.g. ["Inter", "Playfair Display"]: each found one with its styles; the rest in `missing`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds substantial behavior beyond that: usage counts per font, missingFonts/missing flags, the 50-per-call pagination with limit up to 500, and the total/truncated/nextCursor contract. No auth or error behavior is discussed, keeping it just short of top marks.
Agents need to know what a tool does to the 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 dominant default mode is front-loaded and every clause carries information, but it is a single very dense paragraph that mixes input behavior and return values. Slightly dense for a six-parameter tool, though little of it is waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing returns and it does: usage counts, missingFonts, per-font missing:true, and the pagination fields. Both modes, all filters, and the pagination contract are covered, leaving nothing essential for a correct call unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description clarifies the cross-parameter coupling (query, families, limit and cursor imply scope "available") and gives concrete examples of query ("serif", "grotesk") and families semantics (exact names, not-found returned in missing). This goes meaningfully beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list fonts) and splits it into two well-defined modes: fonts used by text on the current page versus families this Figma can load. An agent can immediately tell this apart from text-inspection siblings like figma_scan_text_nodes and from figma_suggest_fonts by the emphasis on enumeration and availability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains that "page" is the default, that query/families/limit/cursor flip the call to "available", and what each filter does. It gives strong contextual usage rules but never names an explicit alternative (e.g. figma_suggest_fonts) or states when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_guideHow to work in Figma (skills)ARead-only
Read this before a design, motion or review task. Returns a skill — the playbook for one kind of work — as Markdown. No arguments gives workflow (the designer's loop). State the role and the gear first: screens and flows read ux, posters, ads, print and icons graphic, logos brand; a page or more also runs design. A motion piece starts with storyboard, keyframes with motion, and a review with critique. topic names a skill (workflow, design, storyboard, motion, critique, design-system, design-to-code, code-to-design, prototype, figjam, slides, brand, graphic, ux) or one of its sections (spec is the figma_create_from_spec grammar); section picks a section of that skill; "skills" lists every skill with what it is for and its sections. Every answer ends with the exact calls for the skill's other sections and for the other skills. Works without the plugin. Under BRIDGE_PROCESS=strict new work waits for its role skill and figma_set_brief, keyframes for the motion skill.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | A skill, one of its sections, or "skills". Default "workflow". | |
| section | No | A section of the skill named by topic; every answer's footer lists them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The read-only annotations already establish safety, and the description adds useful context: the response is Markdown, it works without the plugin, every answer includes footer calls for related sections and skills, and strict mode changes when work may begin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core instruction and every sentence carries useful routing or behavioral information. It is dense and somewhat run-on, especially the long topic list and role mapping, but the complexity is justified by the large enum and the need to route agents correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only guidance tool with no output schema, the description covers what is returned, how to choose the topic, how section works, the default, the footer behavior, plugin independence, and strict-mode implications. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning beyond the enum by mapping work types to topics, such as screens and flows to ux, posters and icons to graphic, logos to brand, and motion work to storyboard or motion. It also clarifies that section selects a section within the chosen skill and that skills lists all available skills.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it reads and returns a skill playbook as Markdown. It clearly distinguishes this documentation-retrieval tool from the many sibling action tools by explaining that it returns guidance rather than performing a Figma 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?
It explicitly says to read this before design, motion, or review tasks, and maps roles and work types to the correct topic values. It also explains the default behavior with no arguments and notes the strict-process dependency on role skills and figma_set_brief.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_library_variablesList library variablesARead-only
Variables from the team libraries enabled in this file — the part of a library a plugin can list (its components and styles it cannot). Without collectionKey: the enabled libraries' variable collections { key, name, libraryName }. With one: that collection's variables { key, name, resolvedType }, filtered by query (name substring) and type, paginated. Import a variable by its key before binding it. Local variables: figma_get_variable_defs. UNSUPPORTED means the plugin lacks the teamlibrary permission or no library is enabled (Assets → Libraries). Reads only. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | Max variables. Default 200. | |
| query | No | Name substring, case-insensitive (collections: name or library name). | |
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| collectionKey | No | A collection key from a call without it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/destructiveHint/openWorldHint annotations, it adds real behavioral context: an explicit 'Reads only.' restatement for emphasis, a named permission dependency (teamlibrary), a defined error state (UNSUPPORTED) with causes and remediation, and per-editor support status (Design verified; FigJam/Slides unverified).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded, dense, and free of filler — nearly every clause carries a distinct fact (scope boundary, mode split, return shapes, filters, import rule, sibling, error state, editor support). The em-dash-packed single paragraph is efficient but harder to skim than a short bulleted split would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing returns, and it does: { key, name, libraryName } for collections and { key, name, resolvedType } for variables, plus truncation/cursor behavior. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the baseline is 3, and the description still clarifies the highest-risk semantic: collectionKey switches the entire result shape and paging behavior between collections and variables. It also explains that `query` matches name or library name on collections and that results are paginated. The remaining params (limit, cursor, session) are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource (variables from team libraries enabled in this file) and immediately scopes it against the rest of a library ('its components and styles it cannot'). It is unambiguously distinguishable from figma_get_variable_defs, which it explicitly names as the local-variables 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?
States the two operating modes (without collectionKey vs. with one), routes local-variable lookups to figma_get_variable_defs, explains the import-before-bind prerequisite, and defines the UNSUPPORTED condition with its likely causes (missing teamlibrary permission or no library enabled, with the Assets → Libraries remedy). When/why-not coverage is essentially complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_local_componentsList local componentsARead-only
Components and component sets defined in this file: page, key and description of each; a variant carries its set's id and name, a set its variant count and variant options. Scope to one page with pageId; without it every page is loaded first, which takes a moment on a large file. figma_get_component reads one component's full property definitions. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Only this page. Omit for the whole document. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), yet the description adds real context beyond them: the performance cost of omitting pageId, the return shape for variants vs sets, and a platform-support caveat ('Editors: Design; unverified: FigJam, Slides'). These are genuine behavioral disclosures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph front-loaded with what is returned, then scoping behavior, then sibling routing, then platform support. Every clause carries information; nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description reasonably covers the returned fields (page, key, description, variant/set attributes) and the two parameters' consequences. It is complete enough to call correctly; only minor error/edge-case behavior is absent, which is acceptable for a read-only lister.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaning beyond the schema's terse 'Omit for the whole document' by spelling out the consequence of omitting pageId (all pages loaded, slow on large files). It does not mention the `session` parameter in prose, keeping it just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Components and component sets defined in this file') and immediately scopes it as local (not library). It explicitly distinguishes itself from the sibling figma_get_component by noting that tool 'reads one component's full property definitions,' so an agent can tell the two apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (figma_get_component) and its distinguishing purpose, and explains the pageId scoping tradeoff (omit to load every page, which 'takes a moment on a large file'). It stops short of an explicit 'use this when / not when' rule, but the routing signal is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_metadataFigma file metadataARead-only
File name, page list, plugin API version and editor type, plus the current page and selection size. Start here when you know nothing about the file yet. In a FigJam board it adds board: the top-level sections and a count of each node type; in a Slides deck slides: rows, slide counts, the focused slide and the view. Note: fileKey is intentionally absent — this plugin does not request private-plugin access, so Figma returns null for it.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe read profile (readOnly, non-destructive, closed-world). The description goes beyond them by disclosing that return shape varies by editor type and explaining why `fileKey` is deliberately null (plugin doesn't request private-plugin access) — genuinely useful behavioral context for interpreting output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then usage guidance, then editor-specific variations, then the fileKey caveat. Every sentence contributes, though the density of editor-type detail is slightly heavy for such a simple getter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return-value burden — and it does, enumerating the base fields and the FigJam/Slides extensions. Nothing an agent needs to interpret the response is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single `session` parameter at 100% schema description coverage, the schema carries full semantics. The description adds no meaning about the session parameter itself, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description concretely enumerates the resource contents (file name, page list, plugin API version, editor type, current page, selection size), which is far more specific than the tautological title. It doesn't explicitly name a distinguishing sibling like figma_get_pages or figma_get_selection, so it falls just short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Start here when you know nothing about the file yet" gives a clear entry-point condition. It also notes behavior differs by editor type (FigJam/Slides), but never states when NOT to use it or routes to an alternative sibling. Clear context, no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_motion_contextGet motion (keyframe animation)ARead-only
The timeline animation of layers, for implementing it in code: per animated layer its keyframe tracks ({ field, keyframes: [{ t (s), value, easing }] }, the same strings figma_set_keyframes takes), animation styles, its top-level frame and timeline, plus timelineCohorts (layers that play together) and motionPlans (each frame's figma_set_motion_plan). topLevelFrameId is the frame on the page, found through the parents; a cohort is keyed by that frame and lists every timelineIds seen — a timeline id is never a node id. Inside an animated frame, address layers by the ids your create calls returned: an id read from a listing there can be temporary. This is Motion, not prototype interactions — those are figma_get_reactions. Defaults to the selection, then the page, and reads descendants: a screen never animates itself, its layers do. limits says what the Plugin API cannot tell (loop mode, pivot). Motion is a Figma beta: UNSUPPORTED means this account does not have it. Editors: Design only.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| nodeId | No | Layer or frame (id or Figma link). Defaults to the selection, then the current page. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| maxNodes | No | Layers inspected per call. Default 500. | |
| recursive | No | Include descendants. Default true; false reads only the given layers (a page is always walked). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered, but the description adds meaningful context: returning keyframe strings that match figma_set_keyframes, the 'temporary id' warning for layers inside animated frames, limits on what the Plugin API cannot report (loop mode, pivot), the beta/UNSUPPORTED behavior, and 'Design only.' These are beyond what annotations provide and materially aid correct use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense but front-loaded with the core purpose first. However, it packs multiple unrelated points (id semantics, defaults, limits, beta status, editor restriction) into a single unbroken block, making it dense and harder to scan than a structured list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-output-schema tool with 5 params and complex return sub-structures (timelineCohorts, motionPlans), the description covers what it returns, how it targets nodes, id caveats, and environmental constraints. It omits detail on coordinate/units for keyframe values and animation styles, leaving minor 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%, so the schema already documents each parameter including defaults. The description adds indirect semantics (address layers by ids your create calls returned; a timeline id is never a node id) but does not clearly map to specific parameters like recursive or maxNodes, so it remains baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('The timeline animation of layers') and describes the exact return shape (keyframe tracks, animation styles, timelineCohorts, motionPlans). It explicitly distinguishes itself from the sibling figma_get_reactions ('This is Motion, not prototype interactions — those are figma_get_reactions'), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong routing context: 'This is Motion, not prototype interactions — those are figma_get_reactions', and explains default targeting (selection, then page, reads descendants). It also adds a prerequisite lift note: 'a screen never animates itself, its layers do.' It lacks explicit when-not-to-use framing beyond the reactions contrast, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_nodeGet one nodeARead-only
One node with its children down to depth, as a normalized DTO (id, name, type, childCount; with includeGeometry also layout, size, position, padding, radius, fill, scrolling). FigJam and Slides nodes also carry what they are: a sticky's or shape's text (200 characters), shapeType, a connector's endpoints and label, a table's size, a slide's row and column; a slide grid or row is opaque (only its box can be read). Depth 0 returns the node alone. Children are capped per node; the count is always reported so a cap is never mistaken for the real structure. format: "rest" returns Figma's own REST JSON for the subtree instead (cut at 200 KB, truncated says so) — for a field the DTO and figma_get_design_context leave out.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | How many child levels to include. Default 1. | |
| format | No | "dto" (default) or "rest" (Figma REST JSON, bounded). | |
| nodeId | Yes | Node id (`12:34` or `12-34`) or a Figma link to the layer. Get ids from figma_get_selection, figma_search_nodes or figma_get_design_context. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| includeGeometry | No | Layout, size, position, padding, radius, fill. Default true. | |
| maxChildrenPerNode | No | Cap on children listed per node. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly, non-destructive, not open-world), while the description discloses non-obvious behaviors: per-node child capping with an always-reported count so a cap is never mistaken for real structure, depth 0 returning the node alone, opaque slide grids that expose only a box, and 200 KB truncation of REST output with a `truncated` flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and dense with non-redundant facts; the DTO field list, cap behavior, and format note each earn their place. The prose is heavy with parentheticals and back-to-back clauses, which costs a little readability but not enough to be wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a subtree-read tool with no output schema and a 6-parameter surface, the description covers return shape (DTO fields), special-case node types (sticky, connector, table, slide), capping, opacity, and truncation. An agent has what it needs to call and interpret the result without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Coverage is already 100% in the schema, so the baseline is 3, but the description adds real meaning: `depth` 0 returns the node alone, `maxChildrenPerNode` caps are offset by an always-reported count, and `format` rest returns Figma's own bounded JSON. It stops short of documenting `session` or the accepted `nodeId` forms, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One node with its children down to depth, as a normalized DTO') and enumerates exactly what the DTO carries (id, name, type, childCount, plus geometry fields). It also distinguishes itself from siblings by naming figma_get_design_context and figma_get_selection as sources of ids and as the tools the `rest` format supplements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is mostly implied through parameter behavior rather than explicit when-to-use guidance. The one clear routing cue is 'format: "rest" ... for a field the DTO and figma_get_design_context leave out,' but there is no statement of when to pick this over figma_get_nodes_info, figma_get_metadata, or figma_get_design_context for a subtree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_nodes_infoGet several nodesARead-only
The same as figma_get_node for many ids in one round-trip. Per-id failures are reported per id rather than failing the whole call.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Child levels per node. Default 0. | |
| nodeIds | Yes | Node ids or Figma links to fetch. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| includeGeometry | No | Layout, size, position, padding, radius, fill. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, so the safety profile is covered. The description adds real behavioral value beyond that: partial-failure semantics (per-id failures reported per id rather than failing the whole call), which is exactly the kind of batch behavior an agent needs to plan around. It stops short of describing result shape or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, zero filler, with the batch/round-trip purpose front-loaded and the failure-isolation behavior second. Every clause carries weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a read-only batch fetch with no output schema, the description covers the essentials: batch scope and isolated per-id error handling. What remains unstated is the return structure and ordering, but the partial-failure note is the critical piece for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with nodeIds, depth, session, and includeGeometry all documented in-schema, so the baseline is 3. The description adds no syntax, format, or constraint detail (e.g. the 200-item limit, Figma-link acceptance) beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the action relative to a named sibling ('the same as figma_get_node for many ids in one round-trip'), so the agent immediately knows this is the batch variant of a single-node fetch. The verb+resource+scope is unambiguous and distinguishable from figma_get_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?
Clearly implies the selection condition: use this when fetching many ids in one round-trip instead of calling figma_get_node repeatedly. It names the alternative but does not state explicit exclusions (e.g. when a single call is preferable or the 200-id cap's implications).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_pagesList pagesARead-only
Every page in the document (id, name, which one is current). Use a page id with figma_get_local_components to scope a scan.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds real value beyond them by disclosing the return shape (id, name, current) that no output schema provides. It omits auth/permission notes, but for a read-only listing this is a solid addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no waste; the primary purpose and return contents are front-loaded, and the follow-up usage hint is secondary. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only listing tool with full schema coverage and no output schema, the description correctly compensates by naming the returned fields. It lacks any note on multi-file/session disambiguation, which is the only remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single optional 'session' parameter is fully documented in the schema. The description adds nothing about it (e.g. how to pick a file when several are connected), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Every page in the document') and enumerates the returned fields (id, name, current), so the agent knows exactly what it gets. It does not explicitly contrast itself with the nearby figma_navigate_page, but the read/list framing is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a downstream use ('Use a page id with figma_get_local_components to scope a scan'), which implies the tool is a discovery step. However, it never says when to call this rather than figma_get_metadata or figma_navigate_page, and there are no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_reactionsGet prototype reactionsARead-only
Prototype reactions: what a layer does on click, drag, hover, and where it navigates. scope: "node" (default) reads one node; "subtree" or "page" lists every node with reactions, plus the page's flows, prototype start and background, and frames that scroll, keep fixed layers or open as overlays. Read it before generating interactive code; figma_set_reactions writes them. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max nodes per call for subtree/page. Default 200. | |
| scope | No | Default "node". | |
| cursor | No | Opaque cursor from a previous truncated call. | |
| nodeId | No | Node id or Figma link. Required unless scope is "page" (then: the page it sits on). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, non-destructive read. The description adds real context beyond that: it discloses that subtree/page scope returns page-level flows, prototype start and background, plus scroll/fixed/overlay frame behavior, and flags editor support (Design yes; FigJam, Slides unverified). That editor caveat is genuinely useful behavior the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with zero filler, front-loaded with what reactions are, then scope semantics, then usage routing and editor caveats. Every clause carries 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?
With no output schema, the description does the work of explaining what page-scope returns, and it covers editor compatibility and the write counterpart. Remaining gaps are minor: pagination/truncation behavior and how cursor ties to the limit are only hinted at via the schema, not the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the semantic difference between scope values (node reads one node; subtree/page enumerate every node with reactions plus page metadata), which the terse enum description does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (prototype reactions) and enumerates what they capture: click, drag, hover, navigation targets. It also differentiates the three scope modes and names the sibling figma_set_reactions, so an agent can tell read from write without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Read it before generating interactive code; figma_set_reactions writes them" gives an explicit trigger and a named alternative for the write path. It does not, however, distinguish this from other read tools like figma_get_node or figma_get_design_context, so routing among the read family is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_selectionGet the current selectionARead-only
The nodes the user has selected in Figma right now. This is the usual entry point for "make this into code": the user selects what they mean, then this returns it.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Child levels per selected node. Default 0. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| includeGeometry | No | Layout, size, position, padding, radius, fill. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, destructiveHint false, and openWorldHint false, so the safety profile is covered. The description adds that it reads the live selection ('right now'), but does not cover empty-selection behavior, response shape, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the resource and then the primary use case; no redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only selection getter with rich annotations and full schema coverage, the description supplies the purpose and primary workflow. It leaves return shape and empty-selection handling unstated, but with no output schema this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so depth, session, and includeGeometry are fully documented in the schema. The description adds no parameter-level meaning beyond that, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the exact resource and temporal scope ('nodes the user has selected in Figma right now') and frames it as the entry point for code generation. It does not explicitly contrast with sibling getters like figma_get_node or figma_get_design_context, so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 a concrete usage scenario ('usual entry point for "make this into code"') but does not state when not to use it or name alternatives among the many sibling getters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_slide_gridGet the slide gridARead-only
Read a Figma Slides deck as its grid — start here in a deck. Rows (each row is a section: id, name) of slides in presentation order; per slide its id, name, row, col, index, skipped, child count and speaker notes, and with includeSummary its background, title (its largest text) and interactive elements; includeTransitions adds each slide's transition. Reads the slides only, never the opaque rows or grid. unsupported names what this Figma build does not expose (speakerNotes, transition). An empty deck has no rows: the first figma_create_slides makes row 0. Paginated by slide (limit, cursor); rowIndex reads one row. A slide's layers: figma_get_design_context or figma_scan_text_nodes with the slide id; its picture: figma_export_node. Editors: Slides only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Slides per call. Default 500. | |
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| rowIndex | No | Read one row (section) only. | |
| includeNotes | No | Each slide's speaker notes (markdown). Default true. | |
| includeSummary | No | Per slide: background, title, interactive elements. Default true. | |
| includeTransitions | No | Each slide's transition, or transitionError. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=true annotation, the description adds rich context: the structure of returned data (rows, sections, per-slide fields), what 'unsupported' means for this Figma build, behavior on an empty deck (no rows until figma_create_slides), pagination by slide with limit/cursor, and that it never reads opaque rows. This significantly extends the annotation's safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured and front-loaded with the core purpose, followed by output shape, optional flags, and routing. It is longer than average but every sentence adds functional information; there is little redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the seven parameters, lack of output schema, and the complexity of slide grid semantics, the description covers everything an agent needs: return structure, pagination, empty-deck behavior, unsupported features, and pointers to related tools for slide contents. No use of output_schema to offload return details, so the description carries the full burden well.
Complex tools with many parameters or behaviors need more documentation. 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 all seven parameters already have descriptions, and the description elaborates on the semantics of includeSummary, includeTransitions, rowIndex, and pagination in prose. However, it doesn't add syntax or format details beyond the schema, so the baseline of 3 for fully covered schemas is appropriate—the prose mirrors the schema rather than extending it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading a Figma Slides deck as a grid, with rows as sections and slides in presentation order. It explicitly positions itself as the entry point ('start here in a deck'), distinguishing it from the other slide tools like figma_set_slide_grid or figma_move_slides.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance ('start here in a deck') and routes the agent to appropriate alternatives for deeper inspection: figma_get_design_context or figma_scan_text_nodes for slide layers, and figma_export_node for slide pictures. It also flags the editor restriction ('Slides only').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_stylesList local stylesARead-only
Paint, text, effect and grid styles defined in THIS file, each with its key, a one-line value ("Inter Semi Bold 24/32 -1% upper", "#1a2b3c (var: color/bg)", "drop-shadow 0 4 12 0 #000000 10%", "columns 12, gutter 24, margin 64"), its description and the variables bound inside it — pick a style by what it is, not by its name. Local only: a library-styled file returns count 0; read library styles with figma_get_variable_defs { nodeId } or figma_get_design_context on a screen. Paginated with limit + cursor. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only this style type. Omit for all. | |
| limit | No | Max styles. Default 500. | |
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only profile, but the description adds material behavior: the scope limit (local file only), the empty-result semantics for library-styled files, the pagination mechanic, and the shape of each returned item (key, one-line value, description, bound variables). That is substantial disclosure beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource and scope, then layers return shape, exception handling, pagination and editor support in a compact block with no filler sentences. The four quoted value examples are dense but each illustrates a distinct style type, so they earn their space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so (item fields plus concrete value examples). Between the local-only caveat, the library-style fallback route, pagination, and editor coverage, an agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so type/limit/cursor/session are already documented, and the description largely restates them ("Paginated with `limit` + `cursor`" repeats the schema's nextCursor wording). The one added nuance, "pick a style by what it is, not by its name," is interpretation guidance rather than parameter semantics, so the baseline 3 holds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (list the paint/text/effect/grid styles defined in THIS file) and enumerates the four style types, so an agent knows exactly what is returned. It also differentiates itself from siblings (figma_get_variable_defs, figma_get_design_context, figma_get_local_components) without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States an explicit when-not condition ("Local only: a library-styled file returns count 0") and names the alternative tools to use instead for library styles. It also adds an editor support note ("Editors: Design; unverified: FigJam, Slides"), which is real routing guidance absent anywhere else.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_get_variable_defsGet variables and their valuesARead-only
Design tokens with their VALUES. Without nodeId: every local collection (modes, default mode, key) and variable with values per mode name ("#1a2b3c80", "16", "true", "alias:color/blue/500" — strings, as figma_set_variable_value takes them), scopes, codeSyntax, key and description; paginated. With nodeId (a frame, a screen, a page): only the variables and styles that subtree USES, library ones included — variables { name: value resolved for that node, so a Dark frame reads Dark }, styles { name: value line }, and details with ids, keys and code syntax. Variables work on any plan; modes beyond the first are paid-only. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max variables (file-wide list). Default 500. | |
| cursor | No | The nextCursor of a truncated call, unchanged. | |
| nodeId | No | Read the tokens this subtree uses instead of the file-wide list. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| maxNodes | No | Nodes walked with `nodeId`. Default 2000. | |
| collectionId | No | Only this collection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/no-destructive, but the description adds substantial behavior beyond them: the exact shape of returned values (per-mode strings like '#1a2b3c80', 'alias:color/blue/500'), pagination behavior, plan limits ('modes beyond the first are paid-only'), and editor support coverage. This is unusually rich for a read 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 front-loaded 'Without nodeId / With nodeId' split is the right structure and the key distinction leads. It is dense and semicolon-heavy, bordering on run-on, but nearly every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-shape burden, and it does — describing variables, styles and details payloads for the nodeId path and per-mode values for the file-wide path. Nothing an agent needs to select and invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema — it clarifies that nodeId accepts 'a frame, a screen, a page' and that values come back in the string form figma_set_variable_value consumes. This enriches interpretation of nodeId and the value contract rather than merely restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource ('Design tokens with their VALUES') and immediately splits the tool into two clearly-scoped behaviors — file-wide collection listing vs. subtree-usage resolution. An agent can tell what the tool returns, though it never names sibling tools like figma_get_library_variables to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit conditional guidance: 'Without nodeId: every local collection...' and 'With nodeId (a frame, a screen, a page): only the variables and styles that subtree USES.' That is clear when-to-use context tied to the parameter. It stops short of naming alternatives or exclusions, so a 5 isn't warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_group_nodesGroup nodesAIdempotent
Wrap nodes into a GROUP. All nodes must share one parent — Figma enforces this and the error says so when it applies. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover mutation safety (readOnlyHint=false, destructiveHint=false, idempotentHint=true). The description adds valuable behavioral context: Figma enforces the shared-parent constraint and surfaces an error, and it discloses editor support with Design verified and FigJam/Slides unverified. It does not describe the return value or side effects like selection changes, but that is less critical given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action, then the key constraint, then platform support. Every sentence adds useful information with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity mutation tool with annotations covering safety and idempotency, the description gives the critical constraint and platform support. It leaves gaps around the name parameter and return value, but with no output schema and partial schema descriptions, the overall definition is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%: force, session, and idempotencyKey are documented in the schema, while nodeIds and name are not. The description adds an important constraint for nodeIds ('all nodes must share one parent') and implies grouping semantics, but it says nothing about the name parameter or how the other parameters modify behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Wrap nodes into a GROUP.' It is clear what the tool does, though it does not explicitly distinguish grouping from related siblings like ungroupping, flattening, or boolean operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear prerequisite ('All nodes must share one parent') and platform availability ('Editors: Design; unverified: FigJam, Slides'), which tells an agent when the tool applies. However, it does not explicitly say when to choose this over alternatives such as figma_ungroup_nodes or figma_boolean_nodes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_import_imageImport imageAIdempotent
Place a picture: from a url (http/https, fetched by Figma), a local path inside the export directory or BRIDGE_EXPORT_ROOTS (read by the bridge), or renderNodeId: a layer of this file rendered to a picture inside Figma — a styleframe snapshotted into a storyboard thumbnail, a frame on a mood board. With nodeId it becomes that node's fill; otherwise a new rectangle at the image's own proportions (a render: the layer's own size), or width/height. scaleMode fill / fit / crop / tile. PNG, JPEG or GIF, at most 4096 px a side. To look at a layer yourself, figma_export_node returns its picture to you instead of placing it. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| url | No | ||
| name | No | ||
| path | No | A file inside an allowed root; relative paths resolve from the export directory. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | ||
| height | No | ||
| nodeId | No | Fill this existing node instead of creating a rectangle. | |
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| scaleMode | No | Default "fill". | |
| renderWidth | No | Pixel width of the render; its height follows the layer. Default twice the target's width, within 4096 px a side. | |
| cornerRadius | No | ||
| renderNodeId | No | A layer of this file to render as the picture. Not with `url` or `path`. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=true), so credit goes to what the description adds: format/size limits (PNG/JPEG/GIF, ≤4096 px a side), the nodeId-fills-vs-new-rectangle branching, and the editor support caveat ('Design; unverified: FigJam, Slides'). One mild tension: url fetching is arguably open-world while openWorldHint=false — not a hard contradiction since Figma, not the bridge, performs the fetch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded with the core action; nearly every clause carries a constraint or branch. The heavy parenthetical/em-dash stacking makes it harder to parse than a short bulleted form would be, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-param mutation with no output schema, it covers sources, sizing, format limits, target behavior, and editor support — enough to call it correctly. It does not say what is returned (the new node, the filled node) or default placement when nodeId/width/height are omitted, which a careful agent would still want.
Complex tools with many parameters or behaviors need more documentation. 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 17 parameters and only 53% schema description coverage, the description meaningfully compensates: it explains the exclusivity of url/path/renderNodeId, what nodeId does, how width/height size a new rectangle, and the scaleMode vocabulary. Remaining undocumented params (sizing, cornerRadius, session, x/y defaults) are neither covered here nor fully 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?
Opens with a concrete verb+resource ('Place a picture') and then enumerates the three distinct sources — url, path, renderNodeId — that define the tool. It also distinguishes itself from figma_export_node by contrasting placing vs. returning the picture, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection logic for the three source modes and explicitly names the alternative (`figma_export_node`) for the 'just look at a layer' case. It stops short of stating when not to use this tool (e.g. using `figma_set_fills` to swap an existing fill on a node you already have), so it's strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_import_library_assetsImport library assetsAIdempotent
Bring published library assets into this file by key — components, component sets, styles, variables — and get the local ids every other tool takes: figma_create_instance / figma_swap_component componentId, figma_apply_style_to_node styleId, figma_bind_variable_to_node variableId. Keys come off an existing screen (figma_get_design_context, figma_get_component) or from the library file opened as another session. Only published assets import; each one that does not carries Figma's reason: items: [{ key, kind, ok, id?, name?, type?, error? }]. To place a single library component, figma_create_instance componentKey imports it itself. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| assets | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, idempotent, non-destructive operation, so the description need not restate those safety traits. It adds useful behavior beyond annotations: per-item failure reasons in the returned items array and editor support (Design; unverified FigJam/Slides). It stops short of explaining transactionality or permission details beyond editor availability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and key sources are front-loaded, and every clause carries practical information about importing, returned ids, failures, alternatives, or editor support. The opening sentence is fairly dense with sibling tool names and id mappings, so it is slightly harder to scan than ideal, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the important return shape: items with key, kind, ok, id, name, type, and error. Combined with the schema's parameter descriptions and editor notes, it is close to complete for this mutation tool, though it does not spell out whether imports are atomic or how partial successes should be handled beyond the per-item shape.
Complex tools with many parameters or behaviors need more documentation. 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 high at 75%, and the schema itself richly documents force, session, and idempotencyKey. The description adds meaningful semantics for the assets parameter by explaining that keys come from existing screens or a library session and that the returned local ids feed componentId, styleId, and variableId in sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Bring published library assets into this file by key') and enumerates the asset kinds handled: components, component sets, styles, and variables. It also distinguishes the single-component path from figma_create_instance, so an agent can tell what this tool is for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says where keys come from (figma_get_design_context, figma_get_component, or a library file opened as another session) and states that only published assets import. It also names the alternative for placing a single library component via figma_create_instance 'componentKey' and gives editor applicability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_import_svgImport SVG (icon / vector)AIdempotent
Place SVG markup as editable vectors — icons, logos, illustrations. width (or height) scales the drawing with its vectors; color recolours every painted vector, the usual way to put an icon in the brand colour, and colorVariable binds them to a COLOR variable instead, so the icon follows the token (stroke-only icons stay stroke-only). The result lists the painted layers as vectorIds. Place it into a frame by parentId. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| svg | Yes | The SVG markup, starting with <svg …>. | |
| name | No | e.g. "Icon / Search". | |
| color | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | Scale to this width, keeping proportions. | |
| height | No | Or to this height. | |
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | No | ||
| colorVariable | No | A COLOR variable name or id, e.g. "color/icon/default". Not with `color`. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only but non-destructive, idempotent write. The description adds meaningful behavior: painted layers are returned as vectorIds, colorVariable binds vectors to a COLOR token, and stroke-only icons remain stroke-only. It does not discuss permissions or stale-write handling, but those are partially covered by the force schema field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then covers scaling, color behavior, result shape, placement, and editor support in compact sentences. Every sentence adds relevant information without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter write tool with no output schema, the description discloses the key return value (vectorIds), placement via parentId, color/token behavior, and editor compatibility. It leaves a few operational details to the schema, but overall provides enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 69% schema coverage, the schema documents several parameters, and the description adds useful meaning for width/height scaling, color recoloring, colorVariable token binding, and parentId placement. It does not explain x, y, name, force, sizing, session, or idempotencyKey, though most of those are covered by 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 states a specific verb and resource: placing SVG markup as editable vectors, with clear examples of icons, logos, and illustrations. It also implicitly distinguishes this from raster image import by emphasizing editable vectors and SVG-specific 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?
It gives clear usage contexts (icons, logos, illustrations, brand-colored icons, frame placement) and notes editor compatibility for Design versus FigJam/Slides. It does not explicitly name alternatives such as figma_import_image or state when not to use this tool, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_move_nodesMove nodesAIdempotent
Move nodes to an absolute position, or by a delta with relative: true. Inside an auto-layout the layout owns x/y: positioning: "absolute" takes a child out of the flow so x/y place it — a badge on a card's corner, a close button on a modal — while it stays inside the frame (a fill axis becomes fixed first; the item says so). positioning: "auto" puts it back. x and y are written together and read back: an item Figma did not keep is ok: false and says where the layer is. Slides and their rows are placed by the deck: figma_move_slides moves them; figma_reparent_nodes changes the parent. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| relative | No | Treat x/y as a delta. Default false (absolute). | |
| positioning | No | Children of an auto-layout only: absolute = out of the flow, placed by x/y. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that auto-layout overrides x/y, that a fill axis becomes fixed when a child goes absolute, that writes may be refused when Figma does not keep the position (ok: false with the actual location), and that one failing node does not fail the whole call. It also confirms mutation scope, which is consistent with readOnlyHint=false and destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and modes, and every clause carries operational information. The parenthetical examples ('a badge on a card's corner, a close button on a modal') add color that is helpful but not strictly necessary, making the single dense paragraph slightly heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return shape (`items: [{ id, ok, error? }]`) and failure semantics, plus the stale-write caveat and editor support. For an 8-parameter mutation tool that is enough for an agent to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. 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 63% schema coverage the description carries real weight for the two enums/booleans that matter: `relative` is framed as delta-vs-absolute and `positioning` is explained in terms of flow ownership, which the schema's one-liner does not convey. x/y coupling ('written together and read back') is also clarified, though `force`, `session`, and `idempotencyKey` are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and the two modes of operation: absolute placement or delta via `relative: true`. It also names the sibling tools that own adjacent cases (figma_move_slides for slides, figma_reparent_nodes for parent changes), so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to choose each mode: inside an auto-layout the layout owns x/y, so use `positioning: "absolute"` to pull a child out of flow and `"auto"` to restore it. Names two alternatives with their conditions (figma_move_slides, figma_reparent_nodes) and flags editor support coverage (Design; unverified FigJam, Slides).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_move_slidesMove slidesAIdempotent
Move slides within a Figma Slides deck as one block, in the order given, to exactly one anchor: after or before another slide (afterSlideId / beforeSlideId), or into a row (row, optional col, both counted once the moved slides are taken out; row = the row count opens a new last row). An anchor that is itself being moved is refused before anything changes. Every slide stays in the deck; a row the move empties stays as an empty section and is listed in emptiedRows. Per-slide results with the new row, col and index. To restate the whole deck's grouping use figma_set_slide_grid. Editors: Slides only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| col | No | With `row`: their position in it; default its end. | |
| row | No | Put them in this row (section); the row count opens a new last row. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| slideIds | Yes | The slides to move, in the order they should end up. | |
| afterSlideId | No | Put them right after this slide. | |
| beforeSlideId | No | Put them right before this slide. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive; the description adds real value beyond them: an anchor that is part of the moved set is refused before anything changes (validate-before-write), slides are never removed from the deck, emptied rows persist as empty sections and are reported in `emptiedRows`, and results are per-slide with new row/col/index. It also discloses the permission requirement ("Editors: Slides only, unverified").
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, and every clause carries information (anchor modes, atomicity, emptied rows, return shape, alternative tool, permissions). It is packed into one dense paragraph with nested parentheticals, which costs some scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with no output schema, the description covers the anchor model, ordering, indexing basis, atomic validation, no-data-loss guarantees, side effects (emptiedRows), return shape, and authorization scope. Nothing an agent needs to call it safely and correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds semantics the schema does not: row/col are "counted once the moved slides are taken out" and "row = the row count opens a new last row", which is the non-obvious indexing behavior an agent would otherwise get wrong. It does not further explain `force`, `session`, or `idempotencyKey`, but those are already well documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Move slides within a Figma Slides deck") plus the key semantics: one block, in the given order, to exactly one anchor. It also names the sibling it is not (figma_set_slide_grid), so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates the three mutually exclusive anchor modes (afterSlideId, beforeSlideId, row+col) and says "exactly one anchor", which excludes invalid combinations up front. It names the alternative tool and the condition that selects it: "To restate the whole deck's grouping use figma_set_slide_grid."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_remove_keyframesRemove keyframes (Motion)AIdempotent
Remove a layer's manual keyframe tracks: the given fields, or every track when omitted. A field that is not animated is reported in notAnimated, not an error. Each removal is read back once Figma settles and repeated if the track is still there; one that will not go fails INTERNAL with partial.notRemoved. Returns removed and remaining, read back. Animation styles are not touched; figma_set_keyframes writes tracks. Under BRIDGE_PROCESS=strict (the default) PROCESS_REQUIRED until this session read the motion skill (figma_get_guide) and the frame has a plan (figma_set_motion_plan). Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| fields | No | Fields as figma_get_motion_context names them, e.g. ["OPACITY", "fill:0"]. | |
| nodeId | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety flags, but the description adds substantial non-structured context: read-back verification, automatic retry, the specific failure mode (INTERNAL with `partial.notRemoved`), non-animated fields reported in `notAnimated` rather than erroring, and environment gating (BRIDGE_PROCESS=strict, PROCESS_REQUIRED). This is behavior an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope in the first clause, then layers failure/reporting semantics. Dense and mostly waste-free, though it compresses a lot of distinct concepts into long clauses that could be split for scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 5 parameters, the description supplies what is missing: the returned values (`removed`, `remaining`, `notAnimated`), partial-failure behavior, retry semantics, and environment gating. An agent has everything needed to call this correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% and already documents force, fields, session, and idempotencyKey. The description still adds real meaning beyond the schema: omitting `fields` removes every track, and unanimated fields land in `notAnimated`. It does not restate the field naming format that the schema already gives.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a layer's manual keyframe tracks') and immediately scopes it: the named `fields`, or every track when omitted. It explicitly contrasts with the sibling that writes tracks (figma_set_keyframes), so an agent can distinguish the two without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (figma_set_keyframes writes tracks) and the boundary (animation styles are not touched), and spells out preconditions for strict mode: read the motion skill via figma_get_guide and have a plan via figma_set_motion_plan. When-to-use and when-not-to-use are both inferable with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_remove_reactionsRemove prototype reactionsAIdempotent
Remove every prototype interaction from a node. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so safety profile is largely covered. The description adds platform/editor coverage, which is real context beyond annotations, but it omits that the operation clears ALL interactions at once and says nothing about the stale-read protection (that detail lives only in the `force` parameter schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the core action is front-loaded before the editor-support caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 and only 4 parameters with mostly documented schema, so the burden on the description is modest, but the description does not cover return behavior, whether removal is undoable, or what happens when the node has no reactions. Adequate but thin against a bulk-mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the two nontrivial parameters (force, idempotencyKey) are thoroughly documented in the schema itself. The description adds nothing about nodeId or how bulk removal interacts with force, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with unambiguous scope: 'Remove every prototype interaction from a node.' An agent can distinguish it from figma_set_reactions by the 'every/remove' framing, though the description never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Editors: Design; unverified: FigJam, Slides' gives platform applicability, which is useful selection context. However, there is no statement of when to use this versus figma_set_reactions (partial edit) or figma_get_reactions, and no warning that this wipes all interactions on the node in one shot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_rename_nodeRename nodeAIdempotent
Rename one node. The previous name is returned, so a rename can be reported as a change rather than an assertion. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive, idempotent write. The description adds two pieces of real context beyond them: the previous name is returned (so a rename is verifiable), and editor coverage is Design-only with FigJam/Slides unverified. However, it omits the STALE/force refusal behavior, which is the operation's most important failure mode and is only documented in the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the operation and the returned value. The trailing editor-coverage sentence is somewhat parenthetical but carries genuine applicability information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-node mutation with no output schema, the description covers what it does, that the prior name comes back, and where it works. The stale-write refusal and idempotency-key retry story live in the schema, so the overall package is nearly complete; only the failure mode goes unmentioned in the description itself.
Complex tools with many parameters or behaviors need more documentation. 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 60% schema coverage, the schema already explains force, session, and idempotencyKey in detail; nodeId and name are self-evident. The description adds no parameter information at all, so it does not compensate for the remaining coverage gap, but the baseline of 3 applies given the rich 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?
"Rename one node" is a specific verb+resource and the scope word "one" implicitly distinguishes it from the sibling figma_batch_rename_nodes. An agent can identify the tool's job without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage guidance is implicit: renaming a single node versus the batch sibling is only implied by "one node". The added environment note ("Editors: Design; unverified: FigJam, Slides") is useful context but is about platform support rather than when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_reorder_nodesReorder nodesAIdempotent
Change z-order within each node's current parent. Slides keep their deck order: figma_move_slides reorders them. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| position | Yes | "front", "back", "forward", "backward", or an index as a string ("3"). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive, so safety is covered; the description adds partial-failure semantics ('one node failing does not fail the call') and editor coverage (Design verified, FigJam/Slides unverified). That is real value beyond structured fields, though it doesn't discuss ordering behavior across multiple parents.
Agents need to know what a tool does to the 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, front-loaded with the core effect, then the sibling routing, then the return contract and editor support. 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?
No output schema exists, and the description compensates by describing the per-item return shape and partial-failure behavior. Editor support caveats are included; only multi-parent ordering semantics and the 500-item batch ceiling are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% and the schema already documents position, force, session, and idempotencyKey with rich detail. The description adds no extra meaning about position values or batching limits, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: change z-order within each node's current parent. The 'within current parent' scoping distinguishes it from reparenting and from figma_move_nodes, though it doesn't name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes slide ordering to figma_move_slides ('Slides keep their deck order'), which is a clear alternative rule. It stops short of naming figma_move_nodes or figma_reparent_nodes as the tools for positional changes or hierarchy changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_reparent_nodesReparent nodesAIdempotent
Move nodes to a new parent (frame, group, component, section, slide or page), optionally at a given index. A node keeps its x/y numbers, now relative to the new parent; keepPosition: true keeps its place on the canvas instead (a sticky dropped into a section), or x/y place it in the new parent. A moved connector's item carries a warning: its route may need recreating. Slides move with figma_move_slides. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | In the new parent's coordinates, set after the move. Not with keepPosition. | |
| y | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| index | No | Insertion index. Omit to append. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| parentId | Yes | The new parent. | |
| keepPosition | No | Keep each node's place on the canvas. Default false. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses that a moved connector carries a warning about a broken route, that results are per-item so one failure doesn't fail the call, and which editors are supported vs unverified. These are operational facts an agent can't get from readOnly/idempotent hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and parent types, then layers the positioning nuance and return shape. Dense but every clause carries information; slightly overpacked with parentheticals.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation with no output schema, the description supplies the return shape (items with id/ok/error), partial-failure semantics, edge-case behavior (connector routes), and editor availability. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 78% schema coverage the baseline is 3, and the description earns a bump by explaining the semantic consequence of keepPosition ('keeps its place on the canvas, e.g. a sticky dropped into a section') and that x/y are in the new parent's coordinates. The index and force parameters are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move nodes to a new parent') and enumerates valid parent types, which lets an agent distinguish it from figma_move_nodes (canvas position) and figma_reorder_nodes (sibling order). The sibling routing for slides is named outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names an explicit alternative for one case ('Slides move with figma_move_slides') and clarifies the choice between keepPosition, x/y, and default coordinate behavior. It doesn't systematically distinguish itself from figma_move_nodes or figma_group_nodes, so exclusion coverage is partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_reset_slotReset slotADestructiveIdempotent
Put slots inside instances back to the component's own slot content, dropping what was added into them. Pass the SLOT layers of the instances (figma_search_nodes with type SLOT finds them). To empty one layer at a time use figma_delete_nodes instead. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | SLOT layers inside instances. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already disclose destructiveHint=true and idempotentHint=true, the description adds important behavioral context: added content is dropped, results are per-item, and one failing node does not fail the whole call. It also states editor availability across Design, FigJam, and Slides, which is beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then the alternative and return behavior. Every sentence contributes operational context without redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with four parameters, the description covers purpose, how to identify target nodes, an alternative for per-layer emptying, partial-failure return semantics, and editor availability. No output schema exists, but the description supplies the essential return-shape 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?
With 100% schema description coverage, the schema already documents all four parameters. The description adds useful meaning for nodeIds by specifying they are SLOT layers inside instances and how to locate them via figma_search_nodes type SLOT.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: putting SLOT layers inside instances back to the component's own slot content and dropping added content. It clearly distinguishes this reset action from sibling figma_delete_nodes by noting that delete_nodes is for emptying one layer at a time.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to pass the SLOT layers of instances and points to figma_search_nodes with type SLOT to find them. It also names the alternative tool figma_delete_nodes and the condition for using it instead, leaving little inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_resize_nodesResize nodesAIdempotent
Resize nodes, or change how they size (Figma's fixed / hug / fill). Give width and/or height; the other dimension is kept — a text given only a width wraps and grows downwards. sizing: { horizontal: "fill" } makes a node take its auto-layout parent's width (the fix for text that overflows). min/max limits bound a hug or fill size — a fill paragraph with maxWidth 480 stays readable — on auto-layout frames and their direct children; clearLimits removes them. A node whose size is not its own — a sticky, a table, a connector, a code block, a 1920×1080 slide — is refused per item with the tool that sizes it. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| width | No | ||
| height | No | ||
| sizing | No | How it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| maxWidth | No | ||
| minWidth | No | ||
| maxHeight | No | ||
| minHeight | No | ||
| clearLimits | No | Limits to remove. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only cover read-only/idempotent/destructive flags) by disclosing partial-failure semantics — 'one node failing does not fail the call' — plus the per-item result shape and editor coverage (Design supported, FigJam/Slides unverified). The refusal behavior for non-owned sizes is exactly the kind of surprise an agent needs warned about before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then progressively narrower detail; nearly every clause carries actionable information (wrap behavior, overflow fix, limit scope, refused types, return shape). It is dense to the point of being a wall of text, with example-heavy asides that could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 12-parameter batch mutation with a nested object and no output schema: the description supplies the return shape (`items: [{ id, ok, error? }]`), the failure model, environment support, and the scope caveat on limits. An agent can call this correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 12 parameters and only 42% schema description coverage, the description carries real weight: it defines the interaction between width and height, explains the `sizing` enum values in Figma-panel terms with a worked fill example, and clarifies the min/max limit semantics and their scope restriction. It does not address `force`, `session`, or `idempotencyKey`, though those do carry their own 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?
States a specific verb plus resource and immediately widens the scope correctly: 'Resize nodes, or change how they size (Figma's fixed / hug / fill)'. This distinguishes it from siblings like figma_move_nodes, figma_set_auto_layout, and figma_set_constraints, which could otherwise be confused with resizing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use context: omit one dimension to keep it, width-only on text wraps downward, `sizing: {horizontal: "fill"}` is framed as 'the fix for text that overflows', and min/max only bound auto-layout frames and their direct children. It also states a when-not: nodes whose size is not their own (sticky, table, connector, code block, slide) are refused. The gap is that the alternative tools for those refused types are described rather than named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_review_videoReview a rendered videoARead-only
See a rendered video without rendering again: a contact sheet of the whole piece, every-frame close-ups of a window (the spacing between frames is the speed), frame-exact stills, and per-frame metrics that find freezes, one-frame flickers, flashes, jumps and cuts. Pass the path figma_export_video wrote. No Figma call: it answers while the plugin is busy, in any editor. Frame k is the timeline at k / fps. List the intended cuts (e.g. panel boundaries) and holds: a jump or a still stretch there is not a finding, but a declared cut that lands a frame early or late is. expectFrames checks the length. Returns JSON (numbers, then findings with frames), then up to maxImages images; every image is also written beside the video, or in saveDir. Needs ffmpeg and ffprobe on PATH, else UNSUPPORTED — figma_check_motion judges keyframes without them. Skill: critique (figma_get_guide).
| Name | Required | Description | Default |
|---|---|---|---|
| cuts | No | Frames where a cut is meant: the frame that first shows the new picture. | |
| path | Yes | The video: the `path` figma_export_video returned, or a file inside the export roots. | |
| every | No | Contact sheet: one tile every N frames, by frame index. Default: about 90 tiles. | |
| holds | No | Intended still stretches: inclusive frames, e.g. [{ fromFrame: 120, toFrame: 179 }], or seconds, e.g. [{ from: 4, to: 5.97 }]. | |
| stills | No | Frames to return full size, exactly (frame k = k / fps). | |
| columns | No | Contact sheet tiles per row. Default 9 portrait, 6 landscape. | |
| metrics | No | Per-frame analysis. Default true. | |
| saveDir | No | Where the images go. Default: the video's folder. Same rules as figma_download_assets `dir`. | |
| closeups | No | Windows to show frame by frame, e.g. around each transition. | |
| maxImages | No | Images returned inline (sheet, close-ups, stills, in that order). Default 4. | |
| tileWidth | No | Tile width in px, for the sheet and close-ups. Default 180 portrait, 240 landscape. | |
| thresholds | No | Override the metric thresholds. | |
| expectFrames | No | Frames the file should have, e.g. figma_export_video's expectedFrames. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly, non-destructive, closed-world), and the description goes well beyond them: external dependency requirements and the UNSUPPORTED failure mode, the fact that no Figma call is made, where images are persisted (beside the video or `saveDir`), the return ordering (JSON first, then up to maxImages images), and the semantics of declared cuts landing early/late.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the capability statement, the required-path instruction, and the dependency caveat come before the finer rules. Few words are wasted, though the single long paragraph of interleaved clauses (holds, expectFrames, return shape, skill pointer) packs enough in that a reader may need to re-read it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 13-parameter, nested-object tool with no output schema, the description supplies the missing return contract (JSON numbers then findings with frames, followed by images), the dependency/environment constraints, persistence behavior, and a cross-reference to the alternative tool when dependencies are absent. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents most parameters, but the description adds interpretation the schema cannot: plot/frame mapping (frame k = k / fps), what `cuts` and `holds` mean for whether a result is a finding, and that `expectFrames` validates length. That is meaning beyond field definitions, though most per-field detail still lives in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('See a rendered video without rendering again') and enumerates the actual outputs (contact sheet, close-ups, stills, metrics) as well as the findings it detects (freezes, flickers, flashes, jumps, cuts). It explicitly separates itself from figma_export_video (the source of `path`) and figma_check_motion (keyframe-only alternative), so an agent can pick the right sibling without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Pass the `path` figma_export_video wrote'), a when-not/alternative ('Needs ffmpeg and ffprobe on PATH, else UNSUPPORTED — figma_check_motion judges keyframes without them'), and the operating condition ('answers while the plugin is busy, in any editor'). It also tells the caller to declare `cuts`/`holds` so intended jumps are not flagged, which is real usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_rollbackRoll back to a savepointADestructiveIdempotent
Take back everything you did since a savepoint, in one call, only when that is safe. Refused with ROLLBACK_BLOCKED before any undo when, since the savepoint, a person or a collaborator changed anything on the page the plugin watches, a local variable or style changed without you, or the page was switched by anyone but you: an undo would take their edit too. Your own changes reported late do not block it. The refusal lists what changed (partial.changed) and offers the safe part: figma_delete_nodes on the nodes you made since (partial.safe), which touches nobody's edits. Otherwise one undo per call since the savepoint, then a check that the nodes made since are gone: { savepointId, undone, verified, stillThere, calls }. Use it instead of figma_undo_step. Requires confirm: true. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| confirm | Yes | Must be true: you have read the description. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| savepointId | Yes | The savepoint to go back to, as figma_savepoint returned it ("sp-3"). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=true, but the description adds far more: the exact refusal code and its trigger set, that refusal happens before any undo, that your own late changes are exempt, one-undo-per-call semantics, a post-undo verification step, the return fields {savepointId, undone, verified, stillThere, calls}, the confirm:true gate, and editor coverage (Design; unverified FigJam, Slides). That is unusually rich disclosure of what could be taken and when it will refuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the action and the safety caveat, and no sentence is filler — refusal causes, fallback tool, undo count, return shape, requirement, editor support all carry weight. It is, however, a single dense paragraph of ~150 words that an agent must parse in one pass; tighter grouping would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the response shape, the failure code and its partial payloads, the confirm precondition, and platform coverage. For a destructive rollback tool this covers everything needed to call it correctly and to interpret a refusal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents force, confirm, session, savepointId and idempotencyKey thoroughly; baseline would be 3. The description adds one meaningful gating condition ('Requires confirm: true') and ties the refusal behavior to when force does or does not help, but it doesn't reinterpret individual params beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Take back everything you did since a savepoint, in one call, only when that is safe.' It explicitly separates itself from figma_undo_step ('Use it instead of figma_undo_step') and points at figma_delete_nodes for the safe-part fallback, so an agent can choose it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The when-not conditions are stated precisely: refused with ROLLBACK_BLOCKED if a person/collaborator touched the watched page, a variable/style changed without you, or the page was switched by anyone else, and 'Your own changes reported late do not block it.' It names a concrete alternative (figma_undo_step) and a fallback tool (figma_delete_nodes) for the partial.safe case, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_rotate_nodesRotate nodesAIdempotent
Set an absolute rotation in degrees, turning about the centre as the editor does (pivot: "origin" turns about the top-left corner, Figma's raw behaviour). Inside an auto-layout the layout re-places the node; the item reports pivot "layout". The turn is read back: an item Figma did not keep is ok: false with the rotation and position it has. figma_move_nodes moves without turning. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| angle | Yes | Degrees, counter-clockwise as in Figma's rotation field (negative turns clockwise). Absolute, not a delta. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| pivot | No | Default "center". | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/idempotent/destructive, yet the description adds real behavioural context: auto-layout re-placement, the pivot echoed back as 'layout', read-back verification that surfaces ok:false with the actual rotation/position, and per-item partial failure. Strong, though it doesn't mention stale-write refusal that the 'force' param implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and dense with useful detail, but a couple of clauses ('The turn is read back') are terse enough to need a re-read. Nearly every sentence carries information, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by specifying the return shape (items: [{ id, ok, error? }]) and partial-failure semantics, alongside editor support. An agent has everything needed to call and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 83%, so the baseline is 3; the description earns a bump by explaining that 'origin' turns about the top-left corner and is Figma's raw behaviour, which the enum alone does not convey. It leaves 'force' and 'idempotencyKey' to their schema text, which is acceptable given 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?
States a specific verb and resource ('Set an absolute rotation in degrees') and immediately contrasts its scope with figma_move_nodes ('moves without turning'), so an agent can pick between the two transform tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent away from the sibling for pure translation and explains the auto-layout caveat where the layout re-places the node, plus an editor support matrix (Design verified, FigJam/Slides unverified). No explicit 'do not use when' clause, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_savepointSavepoint before an instructionAIdempotent
Mark the point before an instruction, so figma_rollback can take back everything done after it in one call. Make one at the start of every instruction a person gives: it writes nothing to the document and costs nothing. Result { savepointId, label, at, pageId, journalSeq }; figma_get_changes { since: savepointId } lists what was done since. Savepoints live in this server process: a restart forgets them, and a rollback forgets the ones made after its own. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| label | Yes | The instruction in a few words, e.g. "Hero copy from the brief". | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses state semantics annotations cannot express: 'Savepoints live in this server process: a restart forgets them, and a rollback forgets the ones made after its own.' It also declares the result shape ({ savepointId, label, at, pageId, journalSeq }) and scopes editor support (Design verified; FigJam and Slides unverified), which is exactly the caution an agent needs. Nothing here contradicts readOnlyHint=false — the tool writes no document content but does create server-side 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?
Purpose and the rollback linkage are front-loaded in the first sentence, and every subsequent sentence adds distinct value (cost, return shape, lifecycle, editor coverage). It is dense — four sentences carry purpose, guidance, output, caveats and platform scope — but none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return fields itself, defines the lifecycle limits (restart and rollback invalidation), and flags editor coverage. For a stateful, non-destructive tool with one required parameter, an agent has everything needed to decide to call it at the right moment and reuse the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so force, label, session and idempotencyKey are already well documented; baseline 3 applies. The description adds only indirect value by showing savepointId is the token later passed to figma_get_changes' `since`, which makes the returned ID's role concrete but does not explain any parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark the point before an instruction') and immediately ties it to the sibling that consumes it ('so figma_rollback can take back everything done after it'). An agent can distinguish this from figma_rollback, figma_get_changes and figma_undo_step without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit, actionable guidance: 'Make one at the start of every instruction a person gives', plus the cost argument ('writes nothing... costs nothing') that removes hesitation. It also names the downstream alternatives and their relationship — figma_rollback for undo and figma_get_changes { since: savepointId } for inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_save_screenshotsSave screenshotsARead-only
Render several nodes to image files and return their paths — cheaper for your context than returning image data, and the way to hand a user a set of screenshots. The plugin renders; the bridge writes, so paths follow the same rules as figma_export_node's saveTo (relative lands in the export directory, other folders must be in BRIDGE_EXPORT_ROOTS). One node failing does not lose the others: the result carries failed[].
| Name | Required | Description | Default |
|---|---|---|---|
| dir | No | Directory for the files. Defaults to the export directory. | |
| scale | No | Raster scale, default 2. Ignored for SVG. | |
| format | No | Default PNG. | |
| nodeIds | Yes | Nodes to render. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the write-path rules (bridge writes, relative paths land in the export directory, other folders must be under BRIDGE_EXPORT_ROOTS) and partial-failure semantics ('One node failing does not lose the others: the result carries failed[]'). It doesn't describe the full return payload shape, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and rationale, then the path rules and failure behavior, with no filler sentences. Slightly dense with parenthetical detail but every clause carries 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?
With no output schema, the description responsibly covers the return (paths) and the failure channel (failed[]), and explains the cross-cutting path constraints. It leaves return-value details like ordering or exact failed[] entry shape implicit, so not a full 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100% (baseline 3), and the description adds real meaning by explaining how the dir parameter resolves paths and what constitutes a valid destination. The scale/format/session params are left entirely to the schema, so it doesn't earn a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope ('Render several nodes to image files and return their paths'), and the word 'several' plus the reference to figma_export_node's saveTo distinguishes it from the single-node export sibling. An agent can identify it as the batch-export tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context ('the way to hand a user a set of screenshots', cheaper than returning image data) that tells the agent when to prefer this over returning inline image data. It does not, however, state explicit when-not conditions or fully name alternatives like figma_export_frames_to_pdf or figma_download_assets, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_scan_nodes_by_typesScan for node typesARead-only
Every node of the given types in a subtree, at any depth — the "find all frames / all components" tool. Paginated. The result's scope names the root that was scanned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results. Default 200. | |
| types | Yes | Node types, e.g. ["FRAME","COMPONENT"], or on a board ["STICKY","CONNECTOR"]. | |
| cursor | No | Opaque cursor from a previous truncated call. | |
| nodeId | No | Subtree root: node id or a Figma link. Defaults to the one selected layer, then the current page. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only profile, so the bar is lower. The description adds non-obvious behavioral facts: results are paginated, and the returned `scope` field names the scanned root — genuinely useful beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the core behavior, no filler. Each clause carries distinct information: scope, pagination, and return-field 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?
For a read-only query tool with full schema coverage and no output schema, the description covers purpose, pagination, and a return-value hint. It is close to complete, missing only cross-references to overlapping search siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so cursor, nodeId default resolution, session, types and limit are all documented in the schema. The description adds the "any depth" subtree semantic but no new syntax or format detail for parameters; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scan), resource (nodes of given types), and scope (subtree, any depth), plus a concrete usage gloss ("find all frames / all components"). It implicitly differentiates from figma_scan_text_nodes (text-specific) but never addresses the potentially overlapping figma_search_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 "find all frames / all components" framing implies the use case, so an agent can infer when to reach for it. However, no explicit when-not or named alternative (e.g., figma_search_nodes, figma_scan_text_nodes) is given, so routing between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_scan_text_nodesScan all textARead-only
Every text in a subtree with its full characters — a copy audit, a translation extract, or the text behind a screen when figma_get_design_context cut it at maxTextChars. TEXT nodes, and on a board the text a sticky, shape or connector holds, code blocks, and one item per non-empty table cell (its cell); types narrows it. Paginated by item: a truncated scan says so rather than returning a partial document as if it were whole. The result's scope names the root that was scanned (in Slides, with nothing selected, the focused slide). Finding one text: figma_search_nodes { text }.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max text items. Default 500. | |
| types | No | Only these holders. Default all six. | |
| cursor | No | Opaque cursor from a previous truncated call. | |
| nodeId | No | Subtree root: node id or a Figma link. Defaults to the one selected layer, then the current page. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive/openWorld, so safety is covered. The description adds real behavior beyond them: pagination by item, that a truncated scan announces truncation rather than silently returning a partial document, and that the result carries a `scope` naming the scanned root (with the Slides edge case). Missing only rate/size caveats and auth notes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then scope of holders, then pagination, then result shape, then the alternative. It is dense and clause-heavy, but each sentence adds a distinct fact; 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?
With no output schema, the description still discloses the key return behaviors (per-item pagination, truncation signaling, `scope` field) and the default nodeId resolution. Adequate for a read-only scan tool; only finer detail on result item shape is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters (limit, types, cursor, nodeId default chain, session). The description only adds that `types` narrows the result set and that table cells yield one item each — useful but marginal over the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scan) and resource (text in a subtree with full characters), and enumerates exactly which holders qualify (TEXT, sticky/shape/connector text, code blocks, table cells). It explicitly distinguishes itself from figma_search_nodes (single-text lookup) and figma_get_design_context (maxTextChars fallback), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Concrete use cases are named (copy audit, translation extract, recovering text truncated by figma_get_design_context), and the alternative is given with its trigger condition: 'Finding one text: figma_search_nodes { text }.' When-to-use and the sibling selection condition are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_search_nodesSearch nodes by name or typeARead-only
Find nodes by name substring, by what their text says (text: a TEXT node's characters, a sticky's, shape's or connector's label, a code block, a table cell — a cell hit names its cell), and/or Figma node type, or every instance of a component (componentId; for a variant set, every variant's instances, each hit naming the variant it shows). scope picks where to look: the current page (default), the current selection, or a specific subtree; the result's scope says which root was searched. Paginated with limit + cursor. Every text in a subtree: figma_scan_text_nodes.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Content substring (case-insensitive). query/type then optional. | |
| type | No | Figma node type, e.g. FRAME, TEXT, COMPONENT, INSTANCE, RECTANGLE. | |
| limit | No | Max results. Default 50. | |
| query | No | Name substring (case-insensitive). | |
| scope | No | Where to search. Default "page". | |
| cursor | No | Opaque cursor from a previous truncated call. | |
| nodeId | No | Subtree root when scope is "subtree": node id or a Figma link. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| exactName | No | Match the name exactly instead of as a substring. Default false. | |
| componentId | No | A COMPONENT or COMPONENT_SET id (or link): find its instances. query/type then optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/destructive/openWorld safety, so the bar is lower. The description adds genuinely useful behavior: the result's `scope` echoes which root was searched, pagination is via limit+cursor, and cell hits name their `cell` and variant hits name the variant shown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and stays dense without filler; each clause maps to a real capability. The parenthetical enumerations are heavy but all load-bearing, so it is efficient rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter search tool with no output schema, the description covers match modes, scope semantics, pagination, the session/file-selection concern implicitly, and routes to the right sibling. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), but the description adds meaning beyond the schema: `text` is defined to span TEXT characters, sticky/shape/connector labels, code blocks and table cells, and componentId resolves a variant set to every variant's instances.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find/search) and resource (nodes) and enumerates the three match modes (name substring, text content, node type) plus the componentId instance-lookup mode. It clearly separates itself from siblings like figma_scan_nodes_by_types and figma_scan_text_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?
Explains when each match mode applies and names the alternative for the full-text case ('Every text in a subtree: figma_scan_text_nodes'). It stops short of stating when to prefer this over figma_scan_nodes_by_types or the *_info getters, so no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_selectSelect nodesARead-only
Select nodes on the canvas so the user sees exactly what you mean or are about to change. mode: replace (default), add, toggle. Nodes on another page switch the editor to that page first. Changes no design data.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| nodeId | No | One node. | |
| nodeIds | No | Or several nodes (all on one page). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: a side effect (nodes on another page switch the editor to that page first) and an explicit reassurance that it 'changes no design data.' This discloses a viewport/page-changing behavior the annotations do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose before the mode details and behavioral caveats. No filler; every clause carries information an agent needs (intent, mode semantics, side effect, safety).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a selection tool with no output schema, the definition covers purpose, mode behavior, page-switch side effect, and non-mutation assurance well. It does not state what the call returns (e.g., resulting selection state), a minor gap given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with nodeId/nodeIds/session already described. The description adds genuine value for `mode` by stating its allowed values and the default ('replace (default)'), which the schema enum does not convey on its own. This is meaningfully beyond the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Select nodes on the canvas') and even the intent behind it ('so the user sees exactly what you mean or are about to change'), clearly marking it as a UI-affordance tool distinct from mutators. It does not explicitly name the read-counterpart sibling (figma_get_selection) or other alternatives, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear situational context for when to reach for this tool – pointing the user at the nodes you mean or are about to change. There are no explicit exclusions or named alternatives (e.g., 'use figma_get_selection to read, this to set'), so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_auto_layoutConfigure auto-layoutAIdempotent
Full auto-layout configuration on one node: mode, gap, padding, alignment, wrap, and axis sizing. mode: "none" removes auto-layout. alignX / alignY are screen directions (space-between only along the layout direction; baseline only as alignY of a row). wrap needs a horizontal layout; a wrapped row spaces its rows by rowGap (default: the gap) and shares the height by alignContent. A negative gap overlaps items (an avatar stack — reverseZIndex puts the first on top). Every value is checked before the frame changes. Clipping: figma_set_clips_content. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| gap | No | Space between items, px; negative overlaps them. | |
| mode | No | ||
| wrap | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| alignX | No | ||
| alignY | No | ||
| nodeId | Yes | ||
| rowGap | No | Space between wrapped rows, px. Needs wrap. | |
| padding | No | Padding: one number for all sides ("24"), or four comma-separated ("48,48,32,32") for top,right,bottom,left. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| alignContent | No | How wrapped rows share the height. Needs wrap. | |
| counterSizing | No | ||
| primarySizing | No | ||
| reverseZIndex | No | Draw the first item on top (with a negative gap). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| strokesInLayout | No | Count the frame's stroke as space, so children sit inside it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation (readOnlyHint=false), idempotency, and non-destructiveness; the description adds real behavioral detail beyond them — values are validated before the frame changes, negative gap overlaps items, reverseZIndex controls stacking, and rowGap defaults to gap. It also discloses editor support/verification status (Design verified; FigJam, Slides unverified), which is genuinely useful 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?
Dense and front-loaded: purpose first, then constraints, then edge cases and sibling pointer. Sentence fragments are efficient rather than padded, though the density of caveats (wrap, baseline, overlap) makes it slightly hard to scan quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 16-parameter mutation tool with no output schema, the description plus rich schema descriptions and annotations cover nearly everything an agent needs to invoke correctly, including validation-before-write and editor support. It stops short of describing what the response returns or how conflicting sizing options interact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 56% across 16 params, but the description compensates well for the ambiguous ones: screen-direction semantics for alignX/alignY with validity constraints, rowGap defaulting to gap, alignContent controlling wrapped-row height, negative-gap overlap behavior, and axis sizing. The remaining gaps (strokesInLayout, primarySizing/counterSizing details) are partially covered, so it's strong but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope ('Full auto-layout configuration on one node') and enumerates the exact properties it controls (mode, gap, padding, alignment, wrap, axis sizing). It also routes clipping to the sibling figma_set_clips_content, so an agent can distinguish it from adjacent layout tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions: mode:'none' removes auto-layout, wrap requires a horizontal layout, baseline only applies as alignY of a row, space-between only along the layout direction. These establish when each option is valid, though it doesn't explicitly contrast with alternatives like figma_check_layout or when to prefer this over resizing directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_blend_modeSet blend modeAIdempotent
Set how nodes blend with what is beneath them (MULTIPLY, SCREEN, OVERLAY, …). PASS_THROUGH applies to frames and groups. For transparency use figma_set_opacity. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | Nodes to change. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| blendMode | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly=false, idempotent=true, destructive=false, so the bar is lower; the description still adds real value by disclosing the partial-failure contract ("one node failing does not fail the call") and the per-item result shape, plus editor availability (Design verified; FigJam/Slides unverified). It omits the STALE/force overwrite refusal, which is a notable mutation behavior, though the schema's force param does carry it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the core action and blend-mode values, then the sibling pointer, then the return contract. Every sentence carries information an agent needs; nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch mutation tool with no output schema, the description supplies the return shape and partial-failure semantics that would otherwise be invisible, and flags editor coverage. Combined with the schema's force/idempotencyKey documentation, an agent has enough to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3; the description earns a bump by adding a semantic constraint the enum alone does not convey — that PASS_THROUGH is meaningful only on frames and groups. It does not add meaning for nodeIds, session, or idempotencyKey beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Set how nodes blend with what is beneath them") and gives concrete example values. It explicitly routes transparency changes to figma_set_opacity, so an agent can separate it from the nearest sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: the MULTIPLY/SCREEN/OVERLAY examples, plus the constraint that PASS_THROUGH applies to frames and groups, plus an explicit alternative for transparency (figma_set_opacity). No explicit when-not-to-use or prerequisite (e.g. read-before-write) guidance, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_board_propertiesSet board properties (FigJam)AIdempotent
FigJam properties on 1–500 nodes, each applied by node type. color is a palette name resolved per type — sticky fill, shape preset (fill, stroke and text), connector line, table fill, text fill — or a hex; a section takes a hex only for now. wide, authorVisible (stickies), shape (shapes with text: a shape type), contentsHidden (sections), language (code blocks). A field that does not apply to a node's type is an error for that node, and that node is left unchanged. Hex paints on any node: figma_set_fills. Editors: unverified in FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| wide | No | Stickies: 416 wide instead of 240. | |
| color | No | A palette name for each node's type, or a hex. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| shape | No | Shapes with text: a shape type such as "diamond". | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| language | No | Code blocks: typescript, javascript, python, go, rust, ruby, css, html, json, graphql, sql, swift, kotlin, cpp, bash, plaintext, dart. | |
| authorVisible | No | Stickies: show the author. | |
| contentsHidden | No | Sections: hide what they hold. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the write, idempotent, and non-destructive profile. The description adds useful behavioral detail: fields are validated per node type, inapplicable fields cause an error for that node, and that node is left unchanged. It still omits some mutation behavior such as stale-write handling, though the force parameter documents that in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient, front-loads the FigJam/node-type scope, and avoids repeating the schema mechanically. The final note about editors is somewhat cryptic, but the paragraph otherwise earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter FigJam mutation tool with no output schema, the description gives enough context to call it correctly: node scope, type-specific fields, color semantics, and partial-failure behavior. Remaining gaps like force/idempotency/session details are covered adequately by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 90%, so the schema carries most parameter documentation. The description still adds valuable semantics by explaining how color resolves per node type, how sections differ, and which fields apply to stickies, shapes, sections, and code blocks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource and operation: FigJam board properties applied to 1–500 nodes by node type. It also distinguishes hex paint changes from this tool by explicitly routing them to figma_set_fills.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 FigJam and per-node-type scope implies when the tool is appropriate, and the description names figma_set_fills as the alternative for hex paints. However, it does not explicitly compare against sibling property-setting tools such as figma_set_text_properties or figma_set_slide_properties.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_briefSet the brief of new workAIdempotent
Record the brief of new work before its first frame, as a senior designer writes one: role, gear, title, goal, message and success, plus the lines the gear and the role need (audience, proof, constraints, givens, tone, format, details). Roles, and the skill each reads first: ux (screens, flows, anything people operate), graphic (posters, ads, posts, print), illustration (icons, illustration; skill graphic), brand (logos, identity), presentation (decks; skill slides), design-system (tokens, components), board (FigJam; skill figjam), motion (skill storyboard). Stored in the file on a brief block drawn at an empty spot, or on nodeId; briefId updates one with directions, the choice, styleframes and the system. Under BRIDGE_PROCESS=strict a new top-level frame, a spec into an empty frame, a new deck or a new board waits for a brief, and figma_sign_off ends it. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| gear | No | Required on a new brief: section, page, top, replica (ux, design-system); micro, sting, piece (motion). | |
| goal | No | What should change for the business or the person. Required on a new brief but a replica. | |
| role | No | Required on a new brief. | |
| tone | No | A page or more. | |
| avoid | No | defaultToAvoid and direction0 as tells kinds, e.g. ["card_trio", "one_radius"]. At page and top gear a finding of one is a warning, which fails sign-off. Replaces the list. | |
| block | No | Draw a brief block. Default: at page, top and piece; never in Slides. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| proof | No | Facts that make the message believable. A page or more. | |
| title | No | Required on a new brief. | |
| chosen | No | The direction built. | |
| format | No | Size with a unit and placement, e.g. "390x844 px phone". A page or more. | |
| givens | No | Whose system the file holds, e.g. "none; the styles are another brand's". A page or more. | |
| nodeId | No | Store on this node (a target frame, a section, a slide) instead of drawing a block. | |
| pageId | No | The page for the block. Default the current page. | |
| reopen | No | With briefId: a signed brief becomes open again, for new work on a signed piece. | |
| system | No | The system as numbers. | |
| briefId | No | Update this brief: the fields given are merged, its block redrawn. | |
| details | No | The role's own keys; a key of another role is refused. | |
| message | No | The one sentence a stranger takes away. Required on a new brief but a replica. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| success | No | What the viewer does, then the checks that confirm it. Required on a new brief but a replica. | |
| audience | No | Who, and where they meet the work. A page or more. | |
| safeArea | No | "x,y,width,height" in frame px, where something covers the frame. | |
| direction0 | No | The default direction, named to be avoided. | |
| directions | No | Two or more directions, each with the score it got. | |
| references | No | ||
| assumptions | No | What you assumed; the report lists them. | |
| constraints | No | Format, mandatory content, families. A page or more. | |
| minTextSize | No | The text floor in frame px. | |
| styleframes | No | Node ids of the styleframes. | |
| deliverables | No | Node ids of the work the brief covers; added to the list. | |
| defaultToAvoid | No | The category default this work avoids, in one line. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses where state lands (a brief block at an empty spot, on nodeId, or merged via briefId), that force bypasses a STALE refusal ('read it again and resend'), and includes idempotencyKey retry semantics. Together with the strict-mode gating and sign-off interaction, this is rich behavioral context that annotations alone don't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Nearly all sentences carry real information, and the action is front-loaded, but the body is a dense run-on that crams roles, storage, update modes, and strict-mode gating into one block. It would read better split into purpose, storage, and strict-mode sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 35-parameter, nested, role-dependent tool with no output schema, the description is largely complete: it covers the required fields, role taxonomy, storage/update paths, and strict-mode behavior. Minor gaps remain around what the call returns and how block drawing interacts with layout, but the core call is well supported.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 91%, so the baseline is 3; the description still adds meaning by mapping each role to the skill it reads first (ux→screens/flows, presentation→slides, board→figjam, motion→storyboard) and by characterizing `details` as the role's own keys. It exceeds the schema baseline without duplicating every field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource: 'Record the brief of new work before its first frame.' It enumerates the brief's fields (role, gear, title, goal, message, success), the roles with their skills, and the storage targets (brief block, nodeId, briefId). An agent can tell this apart from figma_get_brief and the creation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete timing ('before its first frame') and states that under BRIDGE_PROCESS=strict certain creations 'wait for a brief, and figma_sign_off ends it,' which clearly frames when the tool is required. It doesn't explicitly compare against a non-brief flow or state exclusions, so it's clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_clips_contentSet clip contentAIdempotent
Turn "Clip content" on or off on frames, components and instances: on crops a photo or overflow to the frame's (rounded) edge; off stops a frame cutting off a shadow or an overhanging badge — the fix for a check_layout clipped finding. A section or shape has no clipping and gets ok:false. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| clipsContent | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe, idempotent write profile, and the description adds genuinely new behavior: per-item results with partial-failure semantics ("one node failing does not fail the call"), the ok:false outcome for ineligible node types, and editor coverage. These are operational details an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its consequences, and every clause carries information — no filler. It is dense to the point of being a single packed paragraph with heavy dash usage, which slightly hurts scanability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies the return shape (`items: [{id, ok, error?}]`) plus partial-failure behavior, which is exactly the missing piece. Combined with the target-type caveat and editor support, an agent has everything needed to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. 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 schema coverage at 60%, the description compensates by explaining what clipsContent actually does in design terms (crops vs. preserves overflow) rather than restating the boolean type. It also implicitly constrains which ids are valid for nodeIds. force, session, and idempotencyKey are already documented in the schema, so the description correctly leaves them alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Turn 'Clip content' on or off") plus the exact node types it applies to (frames, components, instances). It also carves out negative scope — sections and shapes have no clipping — so the agent can tell this apart from sibling setters like figma_set_visible or figma_set_mask.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the concrete situation for each state (on to crop overflow, off to stop a shadow/badge being cut) and explicitly positions itself as "the fix for a check_layout `clipped` finding," naming the sibling it follows. It also says which editor is supported and which are unverified, which is when-to-use guidance at the tool-selection level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_constraintsSet constraintsAIdempotent
Responsive constraints: how nodes follow their parent frame when it resizes. horizontal: left, right, center, left-right, scale; vertical: top, bottom, center, top-bottom, scale (Figma's MIN/MAX/CENTER/STRETCH/SCALE also accepted). Omit one axis to keep it. Children of an auto-layout frame are positioned by the layout instead. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| vertical | No | ||
| horizontal | No | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explicitly details the return behavior, stating that results are per-item and that a single node failing does not cause the entire call to fail. This level of operational detail is highly valuable behavioral context for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly dense and efficient, grouping functional definitions, accepted values, and edge case behavior into a coherent block. The structure flows logically from definition to detail to execution.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 definition is extremely complete. It covers the 'what' (constraints), the 'how' (accepted values/syntax), the 'why' (interaction with auto-layout), and the 'what if' (per-item success/failure reporting), providing everything an agent needs to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the tool schema handles the parameter structure, the description is critical for defining the semantics of the `vertical` and `horizontal` parameters by listing the accepted values (e.g., 'left', 'scale', 'center'). This domain-specific knowledge is essential for correct invocation, but since the parameter definitions themselves are in the schema, it receives a 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: setting responsive constraints on Figma nodes. It provides necessary context regarding what these constraints achieve when a parent frame resizes, clearly distinguishing its function from general node editing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It offers specific usage guidance by detailing how to manage axes (omitting one to keep it) and provides an important behavioral note regarding auto-layout children, which are positioned by the layout instead of constraints. This preemptively guides the user's logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_corner_radiusSet corner radiusAIdempotent
Round the corners of nodes: one radius for all corners, or radii [topLeft, topRight, bottomRight, bottomLeft] per corner (frames and rectangles); smoothing 0–1 makes them continuous like iOS (0.6 is the iOS squircle) and can be set alone. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| radii | No | [topLeft, topRight, bottomRight, bottomLeft]. | |
| radius | No | Same radius for every corner. | |
| nodeIds | Yes | Nodes to change. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| smoothing | No | Corner smoothing 0–1 (0 = circular arcs). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive, closed-world. The description adds genuinely new behavioral facts: partial-failure semantics ("one node failing does not fail the call") and the per-item result shape, plus editor-support caveats. The stale-write/`force` contract lives in the schema rather than here, so it stops short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then modes, then return shape, then caveats — a sensible ordering with no filler sentences. It is dense with backticks and parentheticals, so slightly heavier to parse than it needs to be, but every clause carries 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?
With no output schema, the description correctly compensates by spelling out the return payload and partial-failure behavior. For a 7-parameter mutation tool it covers the essentials; only the interplay of omitted radius/radii (clearing corners) is left unstated, and `force`/`session`/`idempotencyKey` are well handled in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does add a little beyond the schema — the iOS squircle value (0.6) and the fact that `smoothing` works without a radius — but the array order and field meanings are already fully documented 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?
Opens with a specific verb+resource ("Round the corners of nodes") and immediately enumerates the three modes it supports (uniform `radius`, per-corner `radii`, `smoothing`). It is unmistakably distinct from siblings like figma_set_effects, figma_set_fills, or figma_resize_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?
Explains the choice between `radius` and `radii` and scopes `radii` to frames and rectangles, plus notes `smoothing` can be set alone. It also flags editor support (Design verified; FigJam/Slides unverified), which is real usage guidance. No explicit when-not or alternative-tool routing, but no sibling competes for this job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_descriptionSet descriptionAIdempotent
Write the description (plain or markdown) and documentation link that the assets panel and Dev Mode show, on a component, component set, local style or local variable. A set's description is the one people see — put it there rather than on a variant. One https link at most; "" clears it. Variables take plain text only, no link. Library assets are read-only here. To rename: a component or set with figma_rename_node, a style with figma_update_style name, a variable with figma_set_variable_properties name. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| markdown | No | Treat `description` as markdown (bold, lists, links). Default false. | |
| targetId | Yes | A COMPONENT / COMPONENT_SET id, a style id ("S:…,") or a variable id ("VariableID:…"). | |
| description | No | The text. "" clears it. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| documentationLink | No | One https:// address. "" removes the link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/idempotent/non-destructive, but the description adds real behavior the annotations don't: variables accept plain text only (no link), at most one https link, empty string clears, and library assets are read-only. It does not restate the STALE/force protocol, but that lives in the schema param descriptions, so coverage is good overall.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the action and target come first, then the set-vs-variant rule, then constraints, then rename routing. Every sentence carries a distinct constraint or alternative; nothing is padding despite the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param mutation with no output schema, the definition covers targets, constraints, read-only cases, and editor support. The only mild gap is that it never says what a successful call yields or how the write is confirmed, though the idempotencyKey and force semantics are handled in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter constraints the schema cannot express: variables take plain text with no documentation link, and the clearing semantics of empty strings for both text and link. That is genuine added meaning rather than repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (write) plus the exact resource surface (component, component set, local style, local variable) and the two fields written (description text, documentation link). It also explicitly separates itself from rename-oriented siblings, so an agent can tell it apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when-not conditions and routes elsewhere: put the text on the set rather than a variant, library assets are read-only here, and rename goes to figma_rename_node / figma_update_style / figma_set_variable_properties. It also names the editor contexts (Design supported; FigJam/Slides unverified), which is a usage constraint, not filler.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_effectsSet effectsAIdempotent
Replace the effects of nodes: drop shadow, inner shadow, layer blur, background blur (either blur can ramp with progressive), noise, texture and glass. An empty effects array removes them all. Every entry is validated before any node changes, and a field of another effect type is refused. To apply a named effect style use figma_apply_style_to_node. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| effects | Yes | Effects in Figma's order. | |
| nodeIds | Yes | Nodes to change. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: validation of every entry before any node changes, rejection of fields belonging to another effect type, per-item result shape with partial-failure tolerance, and editor support (Design verified; FigJam/Slides unverified). This tells the agent how the write will behave and fail, which the idempotent/destructive hints alone do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then failure semantics, alternative routing, return shape and environment caveat — each sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape (`{ updated, items: [{ id, ok, error? }] }`) and failure model, plus editor compatibility. Nothing an agent needs to invoke and interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real meaning by noting `progressive` ramping applies to either blur type and by defining the empty-array semantics of `effects`. It also flags the cross-field validation rule (a field of another effect type is refused), which the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Replace the effects of nodes') plus an exhaustive enumeration of effect types it handles. It is clearly distinguished from figma_apply_style_to_node, which is named as the path for named effect styles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tool and the condition that selects it (named effect style → figma_apply_style_to_node), and states that an empty `effects` array removes everything. It does not spell out when not to use it (e.g. incremental edits vs full replacement), but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_fillsSet fillsAIdempotent
Replace the fill paints of nodes: solid colours, gradients, images, several stacked fills (bottom first — [{ image }, { gradient }] is a photo under a scrim on one node). A gradient is linear, radial, angular or diamond; a linear one takes a CSS angle (90 = left → right, the default; 180 = top → bottom), fitted to each node's own size; radial and diamond take center / radius, angular takes center only. An image entry reuses an image already in the file by the imageHash figma_import_image returns; to bring a new picture in use figma_import_image. An empty fills removes every fill. Every entry is validated before any node changes. This sets raw paints — to apply a named local style use figma_apply_style_to_node; for outlines use figma_set_strokes. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| fills | Yes | Bottom to top, as in Figma's fill list. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | Nodes to change. | |
| opacity | No | Default opacity for entries that do not set their own. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly=false, destructive=false, idempotent=true), and the description adds real context beyond them: all entries validated before any node changes, per-item partial-failure semantics (one node failing doesn't fail the call), the STALE-refusal/`force` contract, and the raw-paint-vs-style distinction. This is substantive behavioral disclosure, not restating hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then progressively discloses paint kinds, alternatives, and return shape. Dense but nearly every sentence carries information; only the gradient-geometry detail (diagonal exactness on squares) is slightly more verbose than an agent needs before calling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with rich annotations but no output schema, the description supplies return shape (`{ updated, items: [{ id, ok, error? }] }`), failure isolation, and stale-write handling. Nothing critical for a correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning: fills are ordered bottom-to-top with a concrete stacked example, gradient angles are fitted per node's size, `image` reuses an existing `imageHash` from figma_import_image, and an empty `fills` removes every fill. These clarify semantics the schema alone leaves implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Replace the fill paints of nodes', and then enumerates the supported paint kinds (solid, gradient, image, stacked). It explicitly distinguishes itself from figma_apply_style_to_node (named styles) and figma_set_strokes (outlines), so an agent can route without opening siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use routing: apply a named style → figma_apply_style_to_node, outlines → figma_set_strokes, and new images → figma_import_image. It also flags the editor support matrix (Design verified; FigJam/Slides unverified), which is actionable guidance for whether to call it at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_instance_propertiesSet instance propertiesAIdempotent
Change an instance's component properties — its label text, a variant (Size, State), a boolean, a swapped icon — the way the right panel does, keeping it linked to its component. Names may be given without their #id suffix. figma_get_design_context lists an instance's properties; figma_get_component lists every option. A SLOT is not set here: create layers inside it (parentId = the slot). Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | The INSTANCE. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| properties | Yes | JSON object, e.g. {"Label": "Buy now", "Size": "Large", "Show icon": "false"}. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false; the description adds the key behavioral nuance that property names may omit the #id suffix, that instances stay linked to their component, and that slots must be handled differently. It does not cover the STALE-write protection or error semantics (which are in the schema), so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the core action with clear examples. The following sentences add routing, naming, slot, and editor information without significant fluff, though it is slightly longer than strictly necessary; still well-structured and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 annotations (idempotent, non-destructive), a full set of schema parameter descriptions, and no output schema, the description covers the essential behavioral and routing context. It could be slightly more complete about failure modes or return values, but those are either covered by the schema or not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics: it clarifies that property names can be given without the #id suffix, and explains that a SLOT is not set here but requires creating layers with parentId equal to the slot. These details go beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific verb and resource: changing an instance's component properties, with concrete examples (label text, variant, boolean, swapped icon). It immediately distinguishes itself from related tools like figma_get_design_context and figma_get_component, and explicitly notes what it does not do (set a slot).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and when to use them: figma_get_design_context to list properties, figma_get_component to see options, and create layers inside a slot rather than setting one here. It also notes supported editors, giving clear context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_keyframesSet keyframes (Motion)AIdempotent
Animate a layer on its frame's timeline: each track replaces that field's keyframes; other tracks stay. Every track is read back and re-applied if it did not land: tracks[].status is written or rewritten, timeline is { id, duration, topLevelFrameId }, and a track that never lands fails INTERNAL with partial.notApplied. The timeline grows to fit the last key and never shrinks unless timelineDuration says so (tracks: [] + timelineDuration only sets it). Refused before any change: a top-level frame (animate a child), WIDTH/HEIGHT on a group or vector, a missing or non-SOLID paint, EASE_IN_OUT (Figma spells it EASE_IN_AND_OUT); under BRIDGE_PROCESS=strict (the default) PROCESS_REQUIRED until this session read the motion skill (figma_get_guide) and the frame has a plan (figma_set_motion_plan). Not prototype transitions (figma_set_reactions). Check keys with figma_check_motion. UNSUPPORTED means stop, not retry. Skill: motion. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | The layer to animate — inside a top-level frame, not the frame itself. | |
| tracks | No | One entry per field. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| timelineDuration | No | Seconds. Applied as given, even if shorter than the keyframes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations: it discloses that the write is verified and re-applied with a per-track status, that failure surfaces as INTERNAL with partial.notApplied, how the timeline grows/shrinks (and the special case of empty tracks plus timelineDuration), and a concrete list of pre-flight refusals. Annotations already fix the safety profile (non-read-only, idempotent), and the description adds the operational consequences the agent actually needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core write semantics, then failure modes, then refusals, then routing — a sensible order. It is dense and semicolon-heavy with nested parentheticals, which costs some scannability, but essentially every clause carries distinct behavioral information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still tells the agent what comes back (tracks[].status, timeline { id, duration, topLevelFrameId }) and how partial failure is signaled, so it can interpret results. Combined with the refusal list and editor support (Design verified; FigJam/Slides unverified), an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions are themselves detailed, so the baseline is 3; the description earns above that by explaining cross-parameter behavior — that timelineDuration is applied as given even if shorter, and that tracks: [] with timelineDuration only sets the duration without shrinking. Remaining parameter detail (field/easing vocabulary) is already carried by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — animate a layer on its frame's timeline — and immediately defines the write semantics (each track replaces that field's keyframes; other tracks stay). It also names the boundary against neighbors: 'Not prototype transitions (figma_set_reactions)' and points to figma_check_motion and figma_set_motion_plan for adjacent steps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites and exclusions: PROCESS_REQUIRED under BRIDGE_PROCESS=strict until the session reads the motion skill and the frame has a plan, plus named alternatives for verification (figma_check_motion) and for transition work (figma_set_reactions). It also says 'UNSUPPORTED means stop, not retry', which is decisive when-to/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_layout_gridsSet layout gridsAIdempotent
Replace the layout grids of frames — the column grid a page is designed on (e.g. 12 columns, 24 gutter, 80 margin), rows, or a square grid. Visible only in the editor, never in exports. An empty grids removes them. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| grids | Yes | ||
| nodeIds | Yes | Nodes to change. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: per-item result shape with partial-failure semantics ('one node failing does not fail the call'), grids being editor-only and never exported, and the verified/unverified editor matrix. These are behavioral traits the readOnly/destructive/idempotent hints cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and resource, then packs return shape and editor support into compact clauses with no filler. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies the return shape `{ updated, items: [{ id, ok, error? }] }` along with partial-failure behavior. Combined with the rich input schema and annotations, nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline is 3, but the description adds real meaning: a concrete grid example (12 columns, 24 gutter, 80 margin) and the non-obvious contract that an empty `grids` array clears existing grids. It leaves `force`, `session`, and `idempotencyKey` to the schema, which already documents them well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace the layout grids of frames') and enumerates what a grid can be (columns, rows, square grid), which distinguishes it from siblings like figma_create_grid_style (style definition) and figma_set_slide_grid (slides).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes the replace-not-append semantics clear and states that an empty `grids` removes them, plus which editors it is verified for. It does not explicitly name alternatives such as figma_create_grid_style, so the agent must infer which of the grid tools to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_lockedSet lockedAIdempotent
Lock or unlock nodes. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| locked | Yes | ||
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation (readOnlyHint=false), non-destructiveness, and idempotency. The description adds valuable behavior beyond that: per-item results shape (`items: [{ id, ok, error? }]`) and the key guarantee that one node failing does not fail the whole call. Editor compatibility is also disclosed. It does not, however, explain permission requirements or how already-locked nodes are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the action. The return-shape detail and editor caveat each earn their place, and there is no redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations covering safety and idempotency, and no output schema, the description supplies the essential partial-failure semantics and editor support. Minor gaps remain around permissions and group/child locking behavior, but nothing critical to safe invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%: force, session, and idempotencyKey have meaningful descriptions in the schema, while locked and nodeIds are undocumented but self-evident (boolean lock state, array of node IDs). The description itself adds no parameter-level meaning, so baseline 3 is appropriate given the moderate 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?
States a specific verb ('Lock or unlock') and resource ('nodes'), which is unambiguous and clearly distinct from siblings like figma_set_visible or figma_set_opacity. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., set_visible, set_opacity), nor on preconditions such as reading nodes before locking. The editor-support note ('Editors: Design; unverified: FigJam, Slides') is useful context but not usage selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_maskUse as maskAIdempotent
Make a shape a mask (or stop it being one). A mask crops the layers ABOVE it in the same parent — put it below the image or shapes it should crop, then group them (figma_group_nodes) so the mask stays local. maskType: alpha (default), vector (the shape's outline), luminance. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| isMask | No | Default true; false turns the mask off. | |
| nodeId | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| maskType | No | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it non-read-only, non-destructive, idempotent, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the directional rule (crops layers ABOVE, must sit below them), and editor support scope (Design confirmed; FigJam/Slides unverified). It stops short of detailing what happens on failure, which the schema's force/stale note handles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then the critical spatial rule, then the maskType variants and editor scope. Dense but every sentence carries distinct, actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a node mutation with no output schema, the description covers action, spatial semantics, grouping workflow, and editor availability, enough to invoke correctly. Only minor gaps remain (e.g., behavior on target nodes already masked), which the schema's isMask default partly addresses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates by explaining the most semantically complex parameter, maskType, in detail (alpha default, vector = shape outline, luminance). isMask is implied ('stop it being one') though the schema fully documents it; force/session/idempotencyKey are covered by the schema, so no gap remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('make a shape a mask'), covers the inverse case ('stop it being one'), and distinguishes itself from siblings by naming figma_group_nodes as the required companion step. An agent can tell exactly what this does versus reorder_nodes or group_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?
Gives concrete workflow context: put the mask below the layers it should crop, then group them so it stays local. It names the sibling to use next, but offers no explicit when-not-to-use guidance or error/exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_motion_planSet the motion plan of a frameAIdempotent
Record the plan of one animated top-level frame before animating it, as a motion designer does: the brief (audience, message, format, durationS, fps, bpm?) and the beat sheet, beats back to back from 0 to durationS, each with its copy on screen, action and transition. A role-motion brief (figma_set_brief { role: "motion" }; briefId, or the one in force) fills the fields left out. Checked before anything is stored: times on the frame grid; no gap or overlap; each beat long enough to read its copy, max(5/6 s, 0.3 s a word); accents on the bpm grid; every transition named. Stored on the frame; a new call replaces it. figma_check_motion judges the frame against it: bpm, holds, brandId, ctaId and accept (findings the brief intends, with reasons). Under BRIDGE_PROCESS=strict the keyframe tools refuse a frame without a plan. The result gives each beat's frames and check, the figma_check_motion call. One undo step. Editors: Design only.
| Name | Required | Description | Default |
|---|---|---|---|
| cuts | No | Planned hard cuts, in seconds. | |
| beats | Yes | The beat sheet, in order, back to back from 0 to brief.durationS. | |
| brief | Yes | The motion brief; fields left out come from a role-motion brief. | |
| ctaId | No | The call-to-action layer in the frame, for cta_short. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| holds | No | Intended stillness, in seconds: what figma_check_motion's `holds` exempts. | |
| accept | No | Findings the brief intends (a still open, a hard-cut grammar, a loop): figma_check_motion lists them in `accepted`, not against ok. | |
| nodeId | Yes | The animated top-level frame, or any layer in it (id or Figma link). | |
| brandId | No | The brand layer in the frame, for figma_check_motion's brand_late. | |
| briefId | No | The role-motion brief to take left-out fields from (figma_set_brief returns its id). Default: the motion brief in force. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: validation before storage, replacement semantics for a new call, strict-mode refusal by keyframe tools, the returned frames and check call, one undo step, and Design-only editor permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and dense with useful information, not padded. The single-paragraph delivery and long semicolon-separated clauses make it less scannable than a short bulleted structure would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 12-parameter mutation with nested objects and no output schema, it covers validation, storage, replacement, downstream checking, return shape, undo, and permissions. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning such as beats being back-to-back, brief inheritance, read-time validation, and how accept/holds relate to figma_check_motion. Much of the detail is still duplicated in the very rich schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb/resource: record the motion plan of one animated top-level frame before animating it. It clearly distinguishes this setup step from figma_check_motion judging and keyframe tools applying animation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use it: before animating, with fields inherited from a role-motion brief, and notes that strict mode makes keyframe tools refuse a frame without a plan. It also names the sibling tools that consume or support the plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_opacitySet opacityAIdempotent
Set opacity, 0–1. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| opacity | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, yet the description still adds real behavioral facts: per-item results with the `items: [{ id, ok, error? }]` shape and the crucial partial-failure guarantee that one bad node does not fail the call. It omits the stale-write refusal behavior, but that lives in the `force` parameter description, so the gap is small.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight clauses with zero filler: the operation and range come first, then the return/partial-failure contract, then environment support. Every sentence carries information an agent would otherwise have to infer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return shape and failure semantics, and it warns about editor coverage. It leaves open how opacity interacts with groups/children and whether the batch is atomic beyond the per-item error, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the schema carries most of the load, and the description's only parameter detail (0–1) merely restates the schema's own minimum/maximum. Nothing is said about nodeIds, batching limits, or force beyond what the schema already documents, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Set opacity") plus the valid domain (0–1), so the agent knows exactly what changes. It does not explicitly distinguish itself from look-alike siblings such as figma_set_fills or figma_set_blend_mode, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the operator support line ("Editors: Design; unverified: FigJam, Slides") tells the agent where the tool is safe to call, which is genuine guidance. There is no explicit when-to-use/when-not or named alternative for related appearance tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_prototype_flowsSet prototype flowsAIdempotent
Replace a page's prototype flow starting points, in order — the first is where the play button starts — and/or its prototype background colour. Each flow starts at a top-level frame on that page; flows: [] removes them all. Per-layer interactions (click, hover, navigate) are figma_set_reactions. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| flows | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| pageId | No | Default: the current page. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| background | No | Prototype background, e.g. "#111111". | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing ordering semantics (first flow = play-button start), the replace-not-append behavior, and the `flows: []` removal path — meaning a caller knows existing flows are wiped. Some tension with destructiveHint=false given the removal semantics, but since the settings are page-level and undoable this reads as disclosure rather than contradiction; no return/confirmation behavior is described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, no filler. The core replace semantics and ordering rule are front-loaded, and the editor/alternative clauses are compressed into single short fragments.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 semantics an agent needs for the non-obvious parameters (flows ordering, background, clearing) and annotations carry the safety profile. Minor gap: no statement of what a successful call returns or how an invalid/non-top-level nodeId is reported.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 83%, yet the description still adds meaning the schema lacks: flow order is significant and the first entry determines the play-button start, each nodeId must be a top-level frame, and an empty array clears all flows. `background` is elaborated by name but its format comes from the schema pattern.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource: "Replace a page's prototype flow starting points ... and/or its prototype background colour." It explicitly separates itself from figma_set_reactions, which covers per-layer interactions, so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the scope condition (flows must start at a top-level frame on that page) and names the alternative for a different job (per-layer interactions → figma_set_reactions), plus the editor availability (Design; unverified: FigJam, Slides). It never says what to do when neither applies or how it differs from sibling flow-adjacent tools, so it stops just short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_reactionsSet prototype reactionsAIdempotent
Replace a node's prototype interactions. reactions is a JSON array. Shorthand per entry: { "trigger": "ON_CLICK", "action": { "type": "NODE", "destinationId": "12:3", "transition": "SMART_ANIMATE", "duration": 0.3 } } — duration in seconds; navigation defaults to NAVIGATE. Figma's full Reaction shape (what figma_get_reactions returns) is accepted as is. Other actions: BACK, CLOSE, URL ({ type, url }). Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| reactions | Yes | JSON array of reactions; [] removes all. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing that existing interactions are replaced, that an empty array wipes them all, and which editors support the operation. Annotations already cover safety (readOnly=false, idempotent=true, destructive=false); the description adds the mutation semantics without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the payload shape, then defaults, then editor scope. It is dense but every clause carries usable information; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it covers the payload, overwrite semantics, and editor support well. The return value of the call is not described, and the stale-write/force flow is only discoverable via the schema, leaving minor 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 80%, but the reactions parameter's own schema text is thin ('JSON array of reactions'), so the description carries the real load: it gives the shorthand shape, the duration unit, NAVIGATE default, and alternate action types (BACK, CLOSE, URL). force, session, and idempotencyKey are left to the schema, which documents them well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Replace a node's prototype interactions'), which is precise and clearly narrower than sibling read tool figma_get_reactions. It does not explicitly name siblings like figma_remove_reactions or figma_set_prototype_flows, so the boundary is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 replace semantics and the '[] removes all' note imply when to use it, and the editor support line ('Design; unverified: FigJam, Slides') gives useful prerequisites. But there is no explicit guidance on when to choose this over figma_remove_reactions or figma_set_prototype_flows, and the STALE/force workflow is only in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_scroll_behaviorSet scroll and fixed layersAIdempotent
Prototype scrolling for a frame: overflow (none, horizontal, vertical, both) and which direct children stay fixed while the rest scrolls (fixedNodeIds, bottom to top; [] fixes none). Fixed layers are moved to the top of the layer list, so in an auto-layout frame each must be absolute first (figma_move_nodes positioning "absolute"), and an instance takes overflow only — Figma moves none of its layers, so fix them in its main component. This is presentation behaviour; to cut content off on the canvas use figma_set_clips_content. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | A frame, component or instance (an instance: `overflow` only). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| overflow | No | ||
| fixedNodeIds | No | Direct children to fix (e.g. a nav bar), bottom to top. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behaviour beyond the annotations: fixed layers are moved to the top of the layer list (an undocumented side effect), auto-layout frames require absolute positioning first, instances accept `overflow` only because Figma moves none of their layers, and the editor support matrix (Design; unverified FigJam, Slides). None of this is derivable from `readOnlyHint: false` / `idempotentHint: true`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and both parameters, then the caveats. Dense parenthetical clauses make it slightly harder to scan, but every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-destructive mutation with annotations present and no output schema, the description covers side effects, preconditions and scope limits. It leaves one gap: whether omitting `overflow` or `fixedNodeIds` preserves existing prototype settings or clears them.
Complex tools with many parameters or behaviors need more documentation. 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 83%, so the schema already carries most parameter meaning and the baseline is 3. The description still adds value by enumerating the `overflow` values and clarifying that `fixedNodeIds` is bottom-to-top with `[]` fixing none, plus the instance restriction on which parameters apply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: sets prototype scrolling (`overflow`) and fixed-child behaviour on a frame. It also explicitly distinguishes itself from the nearest look-alike, `figma_set_clips_content`, so an agent can separate the two without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing rules: use `figma_move_nodes` positioning "absolute" first inside auto-layout frames, and fix layers in the main component when targeting an instance. It names the clip-vs-scroll alternative but does not spell out a general 'use this when…' trigger or a when-not condition beyond the clips_content case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_slide_gridRegroup the slide gridAIdempotent
Restate a whole Figma Slides deck's grouping in one step: rows lists every slide id in its new row (section) and order, each row with an optional name (1–3 words; "" restores the default label). Every slide of the deck must appear exactly once — a missing, repeated or unknown id is refused, listed by id, before anything changes; no slide is ever removed. Returns the rows as they are afterwards, how many slides moved and rows were renamed, and rows left empty or removed. To move a few slides without restating the deck use figma_move_slides; to rename one section use figma_rename_node on its row id (figma_get_slide_grid lists them). Editors: Slides only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds real context beyond them: validation happens before any mutation, offending ids are listed, no slide is ever removed, and the editor scope is flagged as Slides-only/unverified. This is unusually complete for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the critical constraint, and every clause carries information (validation, return summary, alternatives). It is dense and semicolon-packed into essentially one long paragraph, which costs a little readability but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the return payload (rows afterward, count moved, count renamed, rows emptied or removed), which is exactly what an agent needs to interpret results. Precondition, failure mode, scope caveat, and alternatives are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 75%, the description still adds meaning the schema cannot: `rows` is a complete restatement of deck grouping, name is 1–3 words with "" restoring the default, and ids must be an exact partition of the deck. It does not discuss `force`, `session`, or `idempotencyKey`, but those are documented 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?
Specific verb and resource: "Restate a whole Figma Slides deck's grouping in one step," with the atomic-rewrite semantics spelled out. It explicitly differentiates from siblings figma_move_slides (partial moves) and figma_rename_node (single section rename), so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit alternatives and the condition that selects each: figma_move_slides for moving a few slides, figma_rename_node for renaming one section, figma_get_slide_grid for listing rows. It also states the hard precondition (every slide appears exactly once) and the refusal behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_slide_propertiesSet slide propertiesAIdempotent
Per slide of a Figma Slides deck: skipped (left out of the presentation, kept in the deck) and speakerNotes (the presenter's notes as markdown; "" clears). Notes keep lists, bold, italic and strikethrough; headings, code and links stay literal text and earn a warning. Write notes only when asked or for a deck meant to be presented: short bullets that add to the slide, not a script. If this Figma build does not expose speaker notes, a call that sets them is refused before anything changes. Per-slide results. Slide names: figma_rename_node; backgrounds: figma_set_fills on the slide; transitions: figma_set_slide_transition. Editors: Slides only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| slides | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it explains what `skipped` means operationally, how `speakerNotes` formatting is preserved or degraded with a warning, and that unsupported speaker-note writes are refused before any change. It also states return granularity ('Per-slide results') and editor applicability ('Slides only, unverified').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the two per-slide properties and their semantics, then covers markdown limits, note-writing guidance, refusal behavior, result granularity, sibling routing, and editor scope. Every sentence carries actionable information; none repeats annotations or schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 nested mutation tool with no output schema, the description supplies the missing behavioral context: property meanings, markdown limitations, preflight refusal, per-slide results, and adjacent-tool routing. The remaining parameters (`force`, `session`, `idempotencyKey`) are fully documented in the schema, so an agent has enough to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is 3, but the description adds meaningful semantics absent from the schema for nested fields: `skipped` is defined as left out of presentation but kept in the deck, and `speakerNotes` formatting and clearing behavior are expanded. The top-level `force`, `session`, and `idempotencyKey` semantics remain schema-only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (a slide in a Figma Slides deck) and the exact properties being set (`skipped` and `speakerNotes`). It also routes slide names, backgrounds, and transitions to sibling tools, so an agent can distinguish this tool from neighbors without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to write speaker notes: 'only when asked or for a deck meant to be presented', with a concrete style expectation ('short bullets... not a script'). It also names alternative tools for adjacent slide operations: figma_rename_node for names, figma_set_fills for backgrounds, and figma_set_slide_transition for transitions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_slide_transitionSet slide transitionsAIdempotent
Set the transition into each of these Figma Slides slides: style (DISSOLVE, SMART_ANIMATE, SLIDE_FROM_LEFT, PUSH_FROM_RIGHT, … or NONE), duration 0.01–10 s, curve, and timing: on-click, or after-delay with delay 0–30 s (a delay with on-click is refused: Figma sets it to 0). Fields left out keep each slide's current value. Each slide's transition is read before anything changes: if this Figma build does not implement transitions the call is refused, nothing changed. Returns each slide's transition as read back. Not prototype interactions (figma_set_reactions) or layer animation (figma_set_keyframes). Editors: Slides only, unverified.
| Name | Required | Description | Default |
|---|---|---|---|
| curve | No | Easing (EASE_IN_AND_OUT, not EASE_IN_OUT). | |
| delay | No | Seconds, with timing after-delay only. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| style | Yes | The transition style; NONE removes it. | |
| timing | No | What starts it. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| duration | No | Seconds. | |
| slideIds | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it discloses pre-read validation, that an unsupported build refuses the call with nothing changed, that a delay combined with on-click is normalized to 0, and that each slide's transition is returned as read back. These are concrete failure and mutation semantics an agent otherwise couldn't infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and its fields, and every clause carries information. The single dense semicolon-laden sentence is a bit heavy to parse but justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation with no output schema, the description covers partial updates, refusal behavior, delay/timing interaction, return behavior, and editor scope. Nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 89%, so the baseline is 3, but the description adds cross-parameter semantics the schema can't express: delay only applies with timing=after-delay, and delay+on-click is refused/normalized. Ranges for duration and delay live in the schema, so it doesn't need to restate them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the transition into each of these Figma Slides slides') and enumerates the fields it governs (style, duration, curve, timing). It also distinguishes itself from the two nearest siblings, figma_set_reactions and figma_set_keyframes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly excludes prototype interactions and layer animation and names the tools to use instead (figma_set_reactions, figma_set_keyframes). It also clarifies the partial-update rule (omitted fields keep current values) and the Slides-only editor scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_strokesSet strokesAIdempotent
Set the outline (stroke) of nodes: exactly one of a solid color, a gradient (as in figma_set_fills), or remove: true to take it off; plus weight, alignment, dashes, line ends (cap) and corners (join). sides sets per-side weights on frames, rectangles, components and instances: a side left out is 0 — so { sides: { bottom: 1 } } is a bottom border — unless weight is given, which then fills it. This is the border — for the inside colour use figma_set_fills. Returns per-item results: { updated, items: [{ id, ok, error? }] } — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| cap | No | End decoration of open paths and lines, as in figma_create_line. | |
| join | No | How corners of the path are joined. | |
| align | No | ||
| color | No | Stroke colour, #rgb / #rrggbb / #rrggbbaa. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| sides | No | Per-side weights in px — a bottom border, a table-row divider, an input underline. | |
| remove | No | Remove every stroke instead; give nothing else with it. | |
| weight | No | Stroke weight in px. | |
| nodeIds | Yes | Nodes to change. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| gradient | No | A gradient stroke instead of `color`. | |
| dashPattern | No | Dash and gap lengths in px, e.g. [4, 2]. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, idempotent, non-destructive, so the safety profile is covered. The description adds value beyond that: the partial-failure contract ('one node failing does not fail the call') and the editor coverage caveat. The STALE/force retry mechanism is documented in the schema rather than here, so this is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the exclusivity rule and the fills contrast arrive first, then sides semantics, then the return shape. Every clause carries information, though the single paragraph packing all of it is heavy reading for a 13-parameter tool; a short list would scan faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 parameters, nested gradient objects and no output schema, the description still supplies the return contract (`{ updated, items: [{ id, ok, error? }] }`), the partial-failure semantics, the fills alternative and the editor support matrix. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 92%, so the baseline is 3; the description earns above that by explaining the non-obvious `sides` semantics that the schema's terse 'Per-side weights in px' does not: an omitted side becomes 0 (so `{ sides: { bottom: 1 } }` is a bottom border) unless `weight` is supplied to fill it. That is a genuine correctness-affecting rule not derivable from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the outline (stroke) of nodes') and immediately differentiates from the nearest sibling: 'This is the border — for the inside colour use figma_set_fills.' An agent can distinguish stroking from filling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the mutual-exclusion rule ('exactly one of a solid color, a gradient, or remove: true') and routes the inside-colour case to figma_set_fills. It also notes the editor scope (Design verified; FigJam and Slides unverified), which helps an agent decide whether to attempt it. It doesn't state when to prefer a gradient stroke over a solid one, so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_textSet textAIdempotent
Replace the content of a TEXT node — or, on a board, of a sticky, shape or connector label, or a code block's code (a table's cells: figma_edit_table). The node's current font is loaded first, so this works on text this project did not create. If the node had more than one style (a bold word, a second font), Figma gives the new text the first character's style and the rest is lost — the result then carries flattened.runs with the old segments, so you can reapply them with figma_set_text_range. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | ||
| content | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it discloses the destructive side effect (multi-style runs flattened to the first character's style), notes the mitigation (`flattened.runs` in the result for figma_set_text_range reapply), explains that fonts are loaded first so foreign text works, and flags editor support (Design verified; FigJam/Slides unverified). That is exactly the data-loss and environment risk an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then secondary targets and caveats. Dense but every clause carries information (targets, font loading, flattening, recovery path, editor support); the single long sentence with parentheticals is slightly harder to scan than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description steps up by describing the meaningful part of the return value (`flattened.runs`). Combined with the stale-write/idempotency behavior covered in the schema, an agent has enough to call this safely; only the full response shape and stale error handling in prose are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, and the two bare required params (nodeId, content) have no schema description; the prose partially compensates by describing which node types are valid targets and what 'content' means in each case. force and idempotencyKey are already well documented in the schema, and the description adds the flattened-result semantics needed to use the output correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replace content) and names the exact resource classes it accepts: TEXT nodes, board sticky/shape/connector labels, code blocks, plus a redirect for table cells. An agent can distinguish it from figma_create_text or figma_set_text_properties without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes table-cell edits to figma_edit_table and style re-application to figma_set_text_range, which is real alternative-routing. It does not address figma_find_replace_text or when to prefer creating new text over overwriting, so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_text_propertiesSet text propertiesAIdempotent
Change typography on whole text nodes, like Figma's text panel: font family, weight, size, line height, letter spacing, case, decoration, colour, paragraph spacing and indent, lists, alignment (horizontal and vertical), resizing, truncation, leading trim, wrap style. A new family keeps each run's own weight (a bold word stays bold); a new weight applies to all of it. A weight the family names differently ("SemiBold" vs "Semi Bold") is matched, and anything substituted is reported as fellBack. maxLines ends the text in an ellipsis after that many lines. On a board a sticky, shape or connector restyles its text, and a table every cell; those texts have no alignment, resizing or truncation of their own. For part of a text use figma_set_text_range. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| case | No | ||
| list | No | Numbered or bulleted paragraphs; none removes the list. | |
| align | No | ||
| color | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| weight | No | Font weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold"). | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| fontSize | No | ||
| maxLines | No | Truncate with an ellipsis after this many lines. | |
| truncate | No | Turn ellipsis truncation on or off. | |
| wrapStyle | No | Figma's textWrapStyle. | |
| autoResize | No | hug = one line that grows; wrap = fixed width, grows down; truncate = a fixed box ending in an ellipsis. | |
| decoration | No | ||
| fontFamily | No | A family available in this Figma (figma_suggest_fonts lists ranked ones). | |
| lineHeight | No | "auto", px ("24"), or percent ("150%"). | |
| leadingTrim | No | cap-height removes the vertical space above and below the glyphs. | |
| alignVertical | No | Where the text sits in a box taller than it. | |
| letterSpacing | No | px ("0.5") or percent ("-1%"). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| paragraphIndent | No | px the first line of each paragraph is offset from the left. | |
| paragraphSpacing | No | Vertical px between paragraphs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent, non-destructive, closed-world, but the description adds substantial behavioral detail beyond them: per-run weight preservation vs whole-range weight application, font-name normalization with substitutions reported as `fellBack`, maxLines ellipsis semantics, board-wide restyling of sticky/shape/connector text and every table cell, and per-item partial-failure results. The STALE/force semantics are covered in the schema, completing the mutation-safety picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the core purpose and the property enumeration earns its place as a capability list. A couple of sentences are dense (the font-family/weight matching explanation), but none are filler; the return-shape and editor-availability sentences are compact and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by specifying the return shape (`items: [{ id, ok, error? }]`) and the partial-failure guarantee. Combined with board behavior, weight/fellBack semantics, and editor support, an agent has everything needed to invoke this correctly on a complex 22-parameter mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 73% with eight enums already self-documenting, so the baseline is solid. The description adds real meaning beyond the schema by explaining weight-matching behavior and `fellBack` reporting, and by spelling out that `autoResize`/'truncate'/'maxLines' interact (ellipsis after N lines). A few parameters (color, case, decoration) still rely entirely on the schema, keeping this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change typography on whole text nodes') and immediately anchors it to a familiar model ('like Figma's text panel'), then enumerates exactly which properties are covered. It also names the sibling it is not (figma_set_text_range) and describes how it behaves differently on boards, so an agent can distinguish it from other text-mutation tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes partial-text work to figma_set_text_range and clarifies the board/table special cases where per-node properties don't apply. It also states editor availability (Design supported; FigJam/Slides unverified). It does not contrast with related alternatives like figma_set_text (content) or figma_apply_style_to_node (applying a text style), leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_text_rangeStyle part of a textAIdempotent
Style part of one text node (or a sticky's, shape's or connector's text) — a bold word, a coloured price, an underlined link, a bulleted paragraph. Pick the part with match (every occurrence, or the nth with occurrence) or with start/end character offsets. Paragraph spacing, paragraph indent, list and its indent level widen to the whole paragraphs the part touches. To tie the part to the design system, use textStyle and fillStyle (a local style's id or exact name), colorVariable (a COLOR variable), and variables per text field. One colour source per call: color, fillStyle or colorVariable. link takes a URL, or "node:" to link to a layer in this file. Everything is checked before the text changes. For whole-node properties (alignment, resizing, truncation) use figma_set_text_properties. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| case | No | ||
| link | No | A URL, or "node:<id>" for a layer in this file. | |
| list | No | Numbered or bulleted paragraphs; none removes the list. | |
| color | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| match | No | The text to style, e.g. "Pro". | |
| start | No | ||
| indent | No | List level of the lines, 0–5 (1 = a top-level item); with `list` for nested bullets. | |
| nodeId | Yes | ||
| weight | No | Font weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold"). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| fontSize | No | ||
| fillStyle | No | A paint style id or exact name for the text colour. | |
| textStyle | No | A text style id ("S:…") or exact name, e.g. "Body/Strong". | |
| variables | No | Bind fields of the range to variables, e.g. { "fontSize": "type/body/size" }: FLOAT for sizes and spacing, STRING for family and style, either for weight. | |
| decoration | No | ||
| fontFamily | No | A family available in this Figma (figma_suggest_fonts lists ranked ones). | |
| lineHeight | No | "auto", px ("24"), or percent ("150%"). | |
| occurrence | No | Only the nth match. Default: all. | |
| colorVariable | No | A COLOR variable name or id, e.g. "color/text/link". | |
| letterSpacing | No | px ("0.5") or percent ("-1%"). | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| paragraphIndent | No | px the first line of each paragraph is offset from the left. | |
| paragraphSpacing | No | Vertical px between paragraphs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, idempotent, non-destructive write. The description adds useful behavioral context: validation happens before changes, paragraph-level properties widen to whole touched paragraphs, colour sources are mutually exclusive, and editor support is qualified. It does not fully describe stale-write handling or return behavior, but those are covered partly by the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and selection mechanics, and nearly every clause carries useful information. It is dense and delivered as one long paragraph, which slightly reduces readability for a 25-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, annotation coverage, and rich input schema, the description supplies enough context to call it correctly: target selection, styling sources, design-system binding, link formats, validation before mutation, and the key sibling alternative. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 25 parameters and 72% schema description coverage, the schema does much of the work. The description adds meaningful semantics for the most ambiguous areas: match/occurrence vs start/end, textStyle/fillStyle/colorVariable/variables, link target syntax, and which properties widen to paragraphs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: style part of a text node, including sticky, shape, and connector text. It gives concrete examples (bold word, coloured price, link, bulleted paragraph) and explicitly distinguishes itself from figma_set_text_properties for whole-node 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?
It explains exactly how to select the target range via `match`/`occurrence` or `start`/`end`, and names the alternative tool for whole-node properties. It also states constraints such as one colour source per call and widening behavior for paragraph-level properties.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_variable_modeSet variable modeAIdempotent
Show nodes in a chosen mode of a collection — Dark on this screen, Light on that one: frames, components, sections and pages pin a mode, and everything inside follows. Without it every node uses the collection's default mode, so a Dark mode can be created and valued and still never be seen. clear: true removes the pin (the node inherits again). The collection by id or name, the mode by name or id. Returns per-item results: items: [{ id, ok, error? }] — one item failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Mode name or id, e.g. "Dark". Give this or `clear`. | |
| clear | No | Remove the pinned mode instead. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| collectionId | No | ||
| collectionName | No | Or the collection's exact name. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say mutation, idempotent, non-destructive), the description discloses the per-item result contract (`items: [{ id, ok, error? }]`) and that one failing item does not fail the whole call — critical partial-failure semantics. It also states the editor support matrix (Design supported; FigJam/Slides unverified), which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The effect and its motivation are front-loaded, then clear semantics, then input identification, then the return shape and editor caveats — a logical order with little waste. The opening em-dash clause is slightly ornate for tool documentation but still earns its place by explaining the pin metaphor.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape and partial-failure rule, and annotations cover the safety profile, so an agent can call this correctly. The one soft spot is that the collection is described as 'by id or name' while neither parameter is required in the schema, so the description doesn't resolve whether the collection is mandatory for disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema carries most of the load, but the description still adds meaning: mode may be given by name or id, the collection by id or name, and clear removes the pin so the node inherits again. It leaves `session`, `idempotencyKey`, and the stale-write `force` behavior to the schema, which documents them adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (pin a variable mode on nodes) and immediately makes the effect concrete: frames, components, sections and pages pin a mode and their contents follow. That functional detail separates it from neighbors like figma_add_variable_mode (which defines a mode on a collection) and figma_set_variable_value without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear reason to reach for the tool — without a pin, a Dark mode can exist and still never render — and explains the `clear: true` inverse case. What's missing is an explicit when-not or a direct pointer to the sibling tools (add_variable_mode, set_variable_value) for adjacent tasks, so an agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_variable_propertiesSet variable propertiesAIdempotent
Change what a token carries besides its value: name (one variable only), scopes, codeSyntax ("" removes a platform), description, hiddenFromPublishing — on many variables at once, by id or exact name. Scopes are checked against each variable's own type. Values per mode: figma_set_variable_value. Returns per-item results: items: [{ id, ok, error? }] — one item failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Rename — only when one variable is targeted. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| scopes | No | Which property pickers offer it. [] hides a primitive that is only aliased; semantic tokens name their fields, e.g. ["FRAME_FILL","SHAPE_FILL"] or ["GAP"]. Checked against the type; ALL_SCOPES stands alone. Default (omitted): Figma's ALL_SCOPES. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| codeSyntax | No | The name in code per platform, e.g. { "WEB": "var(--color-bg-brand)" }. "" removes that platform. | |
| description | No | ||
| variableIds | No | Give this or `variableNames`. | |
| variableNames | No | Exact full names, e.g. "color/bg/brand". | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| hiddenFromPublishing | No | Hide it when the file is published as a library. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses partial-failure behavior (`one item failing does not fail the call`), the per-item return shape, scope validation against variable type, editor support (`Design`; unverified `FigJam, Slides`), and the special empty-string behavior for `codeSyntax`. These are meaningful operational details not supplied by the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then constraints, return behavior, and environment notes. Despite covering many parameters, it remains a compact paragraph with no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description supplies the missing return semantics (per-item results), partial-failure behavior, targeting rules, and the key alternative for values. Remaining fields such as `force` and `idempotencyKey` are thoroughly covered by schema descriptions.
Complex tools with many parameters or behaviors need more documentation. 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 90%, so the schema already documents nearly every parameter in detail. The description adds only light context—`name` is single-variable, scopes are type-checked, and `codeSyntax` empty string removes a platform—most of which is already reflected in the schema descriptions, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: changing non-value variable properties (`name`, `scopes`, `codeSyntax`, `description`, `hiddenFromPublishing`). It explicitly distinguishes itself from `figma_set_variable_value` by saying values per mode belong to that sibling, so an agent can select the right tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly identifies the tool’s scope—non-value variable properties—and names `figma_set_variable_value` for per-mode values, which is the main adjacent alternative. It also constrains targeting to ids or exact names and notes `name` works on only one variable, though it does not enumerate exclusions against creation or deletion tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_variable_valueSet variable valueAIdempotent
Set a variable's value in one mode. value is a string: "#1a2b3c" for COLOR, "16" for FLOAT, text for STRING, "true"/"false" for BOOLEAN, or "alias:color/brand" to point at another variable of the same type. modeId takes a mode id or name and defaults to the collection's first mode. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| value | Yes | The value for the declared type: "#1a2b3c" for COLOR, "16" for FLOAT, "Inter" for STRING, "true" for BOOLEAN. | |
| modeId | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| variableId | No | e.g. "VariableID:1:2". | |
| variableName | No | Or its full name, e.g. "color/bg/default". | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true, destructive=false, and readOnly=false, so the safety profile is covered. The description adds valuable beyond-annotation context: modeId defaults to the collection's first mode, and editor support is scoped (Design confirmed, FigJam/Slides unverified). The STALE/overwrite behavior lives only in the schema, not the description, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action and then the value-format and mode-default details. No filler; every clause carries information, though the type examples are slightly packed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema but strong annotations, the description covers the key call semantics (value encoding, mode default, editor availability). It is nearly complete; only return/response behavior and error/staleness handling are absent, and those are partly carried by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (86%), so the baseline is 3, but the description adds real value: it spells out the type-dependent value encodings (hex for COLOR, numeric for FLOAT, alias syntax) and clarifies that modeId accepts an id or a name with a default. This compensates for the otherwise-undocumented modeId property.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Set') and resource ('a variable's value') with explicit scope ('in one mode'), which distinguishes it from sibling figma_set_variable_mode or figma_create_variable. It does not explicitly rule out figma_set_variable_properties, but the intent remains clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains value encoding but gives no when/when-not guidance and names no siblings or alternatives (e.g., binding a variable to a node via figma_bind_variable_to_node). It only implies usage rather than directing it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_set_visibleSet visibilityAIdempotent
Hide or show nodes. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| visible | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond annotations: per-item result shape (`items: [{ id, ok, error? }]`) and the crucial partial-failure contract that one failing node does not fail the call. Also discloses editor/platform coverage. It does not explain permission requirements or edge behavior (e.g. nodes hidden by ancestors or locked nodes), keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the operation front-loaded, then the return contract, then a terse environment caveat. No filler sentences at all.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 essentials for a batch mutation: what it changes, that partial failures are expected and returned per id, and where the editor support stands, though there is no output schema. Missing only limits like the 500-node cap (in schema) and interactions with locked/hidden ancestor state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description says nothing about nodeIds, visible, session, force or idempotencyKey; the schema carries descriptions for force, session and idempotencyKey (60% coverage) and the two undocumented params are self-explanatory. With schema doing most of the work, baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair and resource ('Hide or show nodes'), which is clearly distinct from sibling mutation tools like figma_set_locked, figma_set_opacity or figma_delete_nodes. It does not explicitly name a sibling it might be confused with, so it stops short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the operation name rather than stated; there is no 'use this instead of X' routing to alternatives such as figma_set_locked. The one piece of context given – 'Editors: Design; unverified: FigJam, Slides' – is environment applicability rather than when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_sign_offSign off new workAIdempotent
End a piece of new work the way a studio signs it off. Runs the role's checks on the deliverables (figma_check_layout with the role's audits and the brief's floors; for motion the frame-by-frame check at the delivery fps), checks the brief is complete for its gear (directions, the choice, styleframes, the system), takes your critique lens scores, rounds and a reason for every info you keep, then records the result and a fingerprint on each deliverable and on the brief block, closes the brief, and selects and zooms to the work on a pass. At top and piece, message and originality need a reviewer other than you (the critique_cold prompt in a fresh context, or the owner); at page a self-review is recorded as one. ok: false lists each blocker with the call that clears it. A final export (figma_export_node, figma_export_frames_to_pdf or figma_export_video with final: true) needs a passing sign-off newer than the last change. Writes plugin data only. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Motion: the delivery rate. Default the brief's. | |
| deck | No | Figma Slides: the whole deck. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| lenses | Yes | Every lens of the role's sign-off, scored as the critique skill scores it, each with its reviewer. | |
| nodeId | No | The deliverable. Default the brief's deliverables. | |
| rounds | Yes | Critique rounds run. | |
| answers | No | An info kept on purpose, with why. | |
| briefId | No | Default the brief whose work the node is, else the brief in force, else its page's. | |
| nodeIds | No | The deliverables: top-level frames, component sets, sections. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| placeholders | No | Every invented fact, or ["none"]. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, non-open-world. The description adds real value: 'Writes plugin data only', the STALE refusal behavior, the reviewer constraint, the blocker listing on `ok: false`, and the export-freshness rule. It corroborates rather than contradicts the annotations and adds workflow-level behavior beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, but the body is a dense run-on cramming checks, reviewer rules, blocker behavior, export gating, and editor support into one paragraph. Every clause carries content, yet the lack of structure makes it harder to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, no-output-schema, complex workflow tool, the description covers the essential mechanics: what it checks, what it records, what gates it, what blockers look like, and editor support. Return shape is described only via `ok: false`, which is adequate but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description still adds narrative meaning: it ties `lenses`, `rounds`, `answers`, and `placeholders` together into the sign-off flow ('takes your critique lens scores, rounds and a reason for every info you keep'). It also clarifies the reviewer rule that applies per lens, which the schema only partially encodes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'End a piece of new work the way a studio signs it off', then names the gating checks it runs (figma_check_layout, brief completeness, critique lenses). An agent can clearly distinguish it from siblings like figma_check_layout or figma_export_node because it is the aggregating sign-off step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong contextual guidance: it explains the reviewer requirement at top/piece levels, the export gating ('a final export ... needs a passing sign-off newer than the last change'), and how `ok: false` surfaces blockers. It stops short of an explicit 'use this instead of X when Y' statement against alternatives, but the workflow placement is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_statusFigma bridge statusARead-only
Bridge and plugin connection status: whether this process holds the Figma connection or shares it, every connected Figma file (session id, file, page, user, plugin version), each file's editor (Figma Design, FigJam or Figma Slides) with the tools that do not run there (unavailableTools), the active session, the version of the skills figma_get_guide serves (skills), the process mode, the skills read and this session's briefs (process), the stale-write guard (bridge.conflicts: refuse, warn or off), this server's token file and fingerprint (the plugin window shows its own) with refused tokens (auth), video export state (videoExport, video: ffmpeg), and a hint for what to do next. Answered by the bridge itself — works even when no plugin is connected. Call this first, and whenever another figma_ tool returns NO_SESSION, PORT_IN_USE, or UNSUPPORTED naming an editor.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, and the description is consistent with that (pure inspection, no mutation). It adds non-obvious behavior the annotations cannot convey: the answer comes from the bridge itself and works even with no plugin connected, plus it discloses the stale-write conflict modes (refuse/warn/off) and auth fingerprint semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core guidance ('Call this first, and whenever...') is placed at the end but is a single crisp sentence. The middle is one very long enumerated clause covering ten output areas, which is dense and hard to parse, though it is defensible given there is no output schema to carry those field descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, no output schema, and only readOnly/openWorld annotations, the description carries the full burden and does: it documents the returned field groups, the diagnostic purpose, and the recovery conditions. An agent has everything needed to decide to call it and to interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4 and there is no parameter semantics to explain. The description instead spends its words on return-value content, which is the relevant substitute for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specifically that this reports bridge and plugin connection status, and enumerates what the report contains (connected files, editor type, active session, conflicts, auth, video export). No sibling tool does this — it is the only diagnostic/status entry point in the set — so it is trivially distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'Call this first' and names the precise trigger conditions for re-calling: NO_SESSION, PORT_IN_USE, or UNSUPPORTED naming an editor. This is an unambiguous when-to-use rule tied to concrete error codes returned by sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_stress_testStress-test a design with real contentAIdempotent
Does the design survive real content? Copies the frame once per case beside it, applies the case to the copy, runs figma_check_layout (craft plus audits) on the original and on each copy, and reports what each case broke that the original does not have, by the original's layer path. Cases: expand (every text grown as translation grows it, 300 % up to 10 characters down to 130 % past 70), long (names and titles at their longest), numbers (every number large: 9 → 12,345), many (lists of three or more instances tripled), empty (those lists emptied); default all. The copies are removed unless keep: true (then they stay, selected). One undo step. Result { baseline: { ok, counts }, cases: [{ case, broke: [{ kind, severity, path, detail }], ok }], kept? }. Run it on every screen before sign-off and fix what it breaks. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | Leave the copies beside the frame, selected, for the person to see. Default false. | |
| cases | No | Which cases to run. Default all five. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| audits | No | figma_check_layout audits to run besides craft, which always runs, e.g. ["a11y", "copy"]. | |
| nodeId | Yes | The frame to test: a screen, a card, a section. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that one copy per case is created beside the frame, that copies are deleted unless `keep: true` (then left selected), that the whole run is one undo step, and that STALE writes are refused unless `force` is set. It also spells out the result shape and confirms idempotent/destructive=false semantics without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the framing question and the mechanism before the case definitions, and nearly every clause carries information. The parenthetical ratio rules for `expand` are dense and slow to parse, which slightly hurts readability but not substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the returned object (`baseline`, `cases[].broke[].kind/severity/path/detail`, `kept?`). With the mutation behavior, undo scope, platform support (Design verified; FigJam/Slides unverified) and cleanup rules all stated, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns more by explaining what each case actually does (e.g. "expand" grows text 300% up to 10 characters down to 130% past 70) and that `audits` runs besides craft, which the enum list alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — stress-test a frame by copying it per case, applying the case, and diffing layout audits against the original. It is clearly distinct from figma_check_layout, which it names as a component it invokes rather than duplicates, and it enumerates the five cases so the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear operational trigger: "Run it on every screen before sign-off and fix what it breaks," plus defaults for `cases` (all five). It does not state when not to use it, or how to choose between this and a plain figma_check_layout run, so it stops short of explicit alternatives/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_suggest_fontsSuggest fonts that fit the designARead-only
Choose typography the way a designer would: reads the fonts and sizes the design already uses, and the fonts actually available in this Figma, then ranks heading/body pairings for the mood and use — with the exact style names to pass on — plus a type scale. When the design already has a font, consistency says so: keep it unless changing it is the point. applyPlan splits the existing text into heading and body node ids, so a choice applies in two figma_set_text_properties calls. A large page is read in part — up to 5,000 layers or 5 s; scanned says whether it was whole — so pass nodeId to fit one frame. Reads only.
| Name | Required | Description | Default |
|---|---|---|---|
| use | No | What the text is for. Default "ui". | |
| mood | No | Words for the feel, e.g. "modern minimal", "editorial elegant", "playful", "technical". | |
| limit | No | Pairings to return. Default 5. | |
| nodeId | No | The design to fit. Defaults to the selection, then the page. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint/destructiveHint/openWorldHint), so the bar is lower; the description adds real behavior beyond them — partial reads capped at 5,000 layers or 5 s, `scanned` reporting whether the read was whole, and the two-call apply path via figma_set_text_properties. 'Reads only' merely restates the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded with the core purpose; every clause carries a fact. The em-dash-packed single paragraph and backtick-heavy style make it slightly dense to scan, but there is little genuine 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?
With no output schema, the description carries the return-value burden and largely meets it: ranked pairings with exact style names, a type scale, plus `consistency`, `scanned`, and `applyPlan` heading/body node ids. Enough for an agent to call it and act on results, though the shape of applyPlan and consistency is only sketched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline, but the description adds rationale the schema lacks: it explains how `mood`/`use` drive the ranking, why to set `nodeId` (fit one frame when a page is too large to read whole), and the file-selection purpose of `session`. This goes beyond the per-field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (suggests heading/body font pairings) and the exact inputs it derives them from (existing fonts/sizes plus available fonts). It is clearly distinguishable from figma_get_fonts, which merely lists available fonts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use it to pick typography like a designer, keep the existing font when `consistency` flags one 'unless changing it is the point', and pass nodeId to scope a partial page read to one frame. It does not name sibling alternatives for listing fonts or applying styles, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_swap_componentSwap componentAIdempotent
Make an existing instance show a different component (a component set swaps to its default variant, or to the variant you name), keeping overrides where Figma can. A library component is given by componentKey / componentSetKey and imported first. To switch a variant of the SAME set, figma_set_instance_properties keeps the other values; to place a new instance use figma_create_instance. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeId | Yes | The INSTANCE to swap. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| variant | No | For a set: which variant, e.g. "Size=Large, State=Hover". | |
| componentId | No | The COMPONENT or COMPONENT_SET to show instead. Exactly one of componentId, componentKey, componentSetKey. | |
| componentKey | No | A published library component's key. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| componentSetKey | No | A published library component set's key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (destructiveHint false, idempotentHint true); the description adds non-obvious behavior: overrides are preserved only 'where Figma can', and library components are imported first as a side effect. It doesn't spell out what happens to overrides that can't be kept, which is the one thing an agent would want before overwriting a carefully-tuned instance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: behavior first, alternatives second, platform scope last. No filler, and the load-bearing information is front-loaded before the sibling routing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with no output schema, the description covers behavior, alternatives, side effects and platform support. It leaves the return value (e.g. whether the new component/variant is echoed back) and the practical consequence of a lost override unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description still adds meaning: a component set resolves to its default variant unless `variant` is named, and `componentKey`/`componentSetKey` denote library assets that get imported. That explains the semantics of the key parameters beyond their terse schema strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Make an existing instance show a different component') and immediately pins down scope: existing instance, not a new one, with variant defaulting rules. It is unmistakable against siblings like figma_create_instance and figma_set_instance_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?
Explicitly routes away from two siblings with their selecting conditions: figma_set_instance_properties for same-set variants (keeps other values) and figma_create_instance for new instances. It also states editor availability (Design; unverified FigJam/Slides), which is a real usage gate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_undo_stepUndo (dangerous)ADestructiveIdempotent
Trigger Figma's undo. WARNING: it returns to the last checkpoint this plugin committed, so changes the user made BY HAND since the last tool call are lost too. Prefer figma_delete_nodes with the ids a create call returned — that is the safe way to undo agent work. Requires confirm: true. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Undo steps, default 1. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| confirm | Yes | Must be true: you have read the warning. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description warns that undo returns to the plugin's last committed checkpoint, so manual user edits are lost. This is critical behavioral context for a destructive operation, and it does not contradict the destructiveHint.
Agents need to know what a tool does to the 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 warning is front-loaded, the alternative is presented immediately after, and every sentence adds operational value. There is no unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive undo tool with no output schema, the description supplies the essential risk, recovery alternative, confirmation requirement, and editor scope. The input schema independently covers all parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage, so all five parameters, including count, force, session, and idempotencyKey, are already documented. The description only repeats the confirm requirement, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "Trigger Figma's undo." It also clarifies the exact checkpoint semantics, which distinguishes this from a generic undo/delete operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the safer alternative, figma_delete_nodes with returned ids, and states that this tool is the dangerous fallback. The required confirm flag and editor support are also called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_ungroup_nodesUngroupADestructiveIdempotent
Unwrap groups: their children move up into the group's parent and the group disappears. Only GROUP nodes — to move children out of a frame use figma_reparent_nodes. Each item reports childIds. Returns per-item results: items: [{ id, ok, error? }] — one node failing does not fail the call. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| nodeIds | Yes | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/idempotent annotations, the description discloses the exact structural effect, per-item return shape with partial-failure semantics ('one node failing does not fail the call'), and editor support (Design; unverified FigJam, Slides). These are concrete behavioral traits an agent needs before invoking a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core transformation, followed by scope exclusion, return behavior, and editor support. Every sentence carries actionable information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent mutation tool with no output schema, the definition covers the key semantics, exclusion, partial-failure behavior, and return shape. The slight gap is that it mentions childIds in a way that doesn't fully align with the listed item shape and does not restate the stale-write/force behavior, which is left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, with the required nodeIds array having no schema description. The tool description adds no input-parameter meaning (it mentions 'childIds' only in the result context and does not explain force, session, or idempotencyKey), so it neither compensates for the gap nor adds value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation (unwrap groups), the exact structural change (children move to parent, group disappears), and explicitly distinguishes it from figma_reparent_nodes for frames. An agent can identify the tool and its scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit applicability constraint (only GROUP nodes) and names the alternative tool for the excluded case (figma_reparent_nodes for frames). This is direct when/when-not guidance rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_update_styleUpdate styleAIdempotent
Change a local style IN PLACE — every node using it follows; deleting and recreating would detach them all. By styleId or styleName (+ type when a name is shared). Any kind: name, description. Paint: color or fills, with opacity; opacity alone fades every paint and keeps bound colours. A gradient style's angle is exact only on a square node — a style has no size; for an exact CSS angle on a known node use figma_set_fills, or give transform. Text: font, size, line height, letter spacing, case, decoration, paragraph spacing/indent. Effect: effects. Grid: grids. variables binds tokens inside the style: text fields by name (fontSize, fontFamily…), a paint's "color", "effect.color" / "effect.radius" …, "grid.count" …, with index for the entry. A field that does not fit the style's kind, and a library style, are refused before anything changes. Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| case | No | ||
| name | No | Rename the style. | |
| type | No | Only to tell same-named styles apart. | |
| color | No | A solid colour. Give this or `fills`. | |
| fills | No | Several paints or a gradient, entries as in figma_set_fills. | |
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| grids | No | Replaces the grids; entries as in figma_set_layout_grids. | |
| weight | No | Font weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold"). | |
| effects | No | Replaces the effects; entries as in figma_set_effects. | |
| opacity | No | ||
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| styleId | No | A style id from figma_get_styles. | |
| fontSize | No | ||
| styleName | No | Or its exact name, e.g. "Heading/H1". | |
| variables | No | ||
| decoration | No | ||
| fontFamily | No | Default Inter (create); the style's own family (update). | |
| lineHeight | No | "auto", px ("32") or percent ("150%"). A string, not a number. | |
| description | No | What the style is for — shown in Figma's style picker. | |
| letterSpacing | No | px ("0.5") or percent ("-2%"). A string, not a number. | |
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| paragraphIndent | No | px of first-line indent. | |
| paragraphSpacing | No | px between paragraphs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-readonly, non-destructive, idempotent mutation. The description adds meaningful behavior: updates propagate to every node using the style, invalid kind mismatches and library styles are refused before changes, and editor support is Design with FigJam/Slides unverified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loads the core update-in-place concept before covering kind-specific fields. It is appropriately sized for a 23-parameter tool, though the long semicolon-heavy paragraph makes some details harder to scan than a structured layout would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex style-update mutation with no output schema, the description covers the essential semantics: in-place propagation, style lookup, kind-specific fields, variable bindings, gradient constraints, and refusal cases. Some schema-documented operational parameters such as `force`, `session`, and `idempotencyKey` are not discussed in the description, but the schema covers them.
Complex tools with many parameters or behaviors need more documentation. 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 78% schema coverage, the schema already documents many parameters. The description still adds substantial meaning by grouping parameters by style kind (paint, text, effect, grid), explaining the `styleId`/`styleName`+`type` lookup, `opacity` behavior, gradient angle caveat, and how `variables` binds fields with an optional `index`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: change a local style in place so every node using it follows. It also distinguishes this from delete/recreate behavior and from figma_set_fills for the exact-angle-on-node case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use it (in-place updates to an existing local style) and gives explicit alternatives: use figma_set_fills when an exact CSS angle is needed on a known node, or provide `transform`. It also notes that library styles and fields of the wrong kind are refused.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_update_variable_collectionUpdate variable collectionADestructiveIdempotent
Rename a variable collection, hide it from publishing, rename its modes (e.g. "Mode 1" → "Light"), or remove modes. Removing a mode deletes the value every variable holds for it — the result counts them per mode; the last mode is never removed. Everything is checked before anything changes. To add a mode use figma_add_variable_mode (paid plans). Editors: Design; unverified: FigJam, Slides.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| force | No | Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit. | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. | |
| removeModes | No | Mode names or ids. | |
| renameModes | No | ||
| collectionId | Yes | ||
| idempotencyKey | No | Caller-owned retry key, ≤128 chars. Re-calling with the same key never executes twice: it returns the existing result, or waits for the op still in flight. Supply your own for anything large — if the MCP client times out (rather than the bridge), only a key you chose can be used to retry safely. | |
| hiddenFromPublishing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive/idempotent; the description discloses what is actually destroyed (removing a mode deletes every variable's value for that mode), a safety guard (the last mode is never removed), and atomic validation ("Everything is checked before anything changes"). It also adds auth/platform context (Editors: Design; unverified: FigJam, Slides) that no structured field carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the capability list, then the destructive consequence, then the alternative routing — good ordering with no filler. The trailing environment/role sentence is dense but it is the only place that information appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter destructive mutation with no output schema, the description supplies the consequence of deletion, the atomicity guarantee, a hint at the return value ("the result counts them per mode"), and platform availability. Remaining gaps (stale/force interplay, idempotency retry behavior) are already covered by schema parameter descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, so the description compensates by explaining the semantics of removeModes (values are deleted per mode, terminal guard against removing the final mode) and the intent of renameModes examples. It leaves name, hiddenFromPublishing and collectionId to the schema, which is acceptable since force, session and idempotencyKey are already well documented there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with specific verbs and the exact resource: rename a collection, hide it from publishing, rename or remove its modes. The sibling boundary is drawn explicitly ("To add a mode use figma_add_variable_mode"), so an agent can separate it from add_variable_mode, delete_variable_collection and set_variable_mode without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative for the adjacent operation (adding modes → figma_add_variable_mode) and states plan and editor-role prerequisites. It does not cover the when-not case versus figma_delete_variable_collection or set_variable_mode, but the context needed to pick this tool is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_zoom_toZoom to nodesARead-only
Scroll and zoom the viewport to show nodes — after building something, so the user sees it. zoom: "fit" (default) or a number as a string ("1" = 100%). Switches page if needed. In Figma Slides the nodes' slide (a slide given, else the one holding the first node) becomes the focused slide, and view switches between "grid" (every slide) and "single-slide" (the focused one); view alone needs no nodes. The result says which slide is focused and the view, or why the view did not change. Changes no design data.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Figma Slides only: the grid of all slides, or one slide. | |
| zoom | No | "fit" or a zoom level like "1.5". | |
| nodeId | No | One node. | |
| nodeIds | No | Or several nodes (all on one page). | |
| session | No | Optional sessionId or file name, to pick a Figma file when more than one is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description reinforces this with 'Changes no design data' and adds non-obvious behavior like page switching and slide-focus semantics. It stops short of detailing limits or failure conditions beyond the result summary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and usage, then layers in the Slides-specific detail. It is dense near the end, but every clause carries semantic weight (zoom format, page switch, slide focus, result).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the result ('which slide is focused and the view, or why the view did not change'). Combined with full param coverage and read-only annotations, an agent has enough to call it correctly, though tool selection against similar viewport tools is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: zoom default 'fit' and the numeric-as-string convention, the interaction between nodeIds and slide focus, and that view operates without nodes. These exceed what the schema text alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (scroll and zoom) plus resource (the viewport) and scope (show nodes). Clearly distinguishes itself from navigation and selection siblings like figma_navigate_page and figma_select.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context — 'after building something, so the user sees it' — which tells the agent when this is relevant. It also notes the 'view alone needs no nodes' edge case, but does not name alternative tools or contrast with figma_navigate_page/figma_select explicitly.
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.
111 tool updates
v0.3.0- Changed
figma_add_component_property1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_add_variable_mode1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_apply_style_to_node1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_batch1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_batch_rename_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_bind_variable_to_node1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_boolean_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_check_layout4 fields changed- changed
Input schema / properties / audit / descriptionPrevious value: -"QA passes to add: tokens, names, fonts, board, craft (finish defects), tells (the generated look; info only), handoff (how much is bound to the system)."New value: +"QA passes to add: tokens, names, fonts, board, craft (finish defects), tells (the generated look; info, a warning where a page or top brief avoids it, and run by default under one), handoff (how much is bound to the system), a11y, states, copy, system, deck, mark, icons, library (a role's sign-off checks; with briefId, the brief's numbers)." - changed
Input schema / properties / audit / items / enumPrevious value: -[ - "tokens", - "names", - "fonts", - "board", - "craft", - "tells", - "handoff" -]New value: +[ + "tokens", + "names", + "fonts", + "board", + "craft", + "tells", + "handoff", + "a11y", + "states", + "copy", + "system", + "deck", + "mark", + "icons", + "library" +] - changed
Input schema / properties / audit / maxItemsPrevious value: -7New value: +15 - added
Input schema / properties / briefIdAdded value: +{ + "description": "The node a brief is stored on (figma_set_brief returns it): the role audits measure against its platform, viewport, screens, system, room, applications, grid and platforms, and craft takes its minTextSize and safeArea. At page or top gear its `avoid` kinds are warnings, and tells run by default where its role's sign-off judges them or it avoids one. A motion brief judges layout where the viewer sees it (restPose). Default: the brief in force, unless the checked node is another brief's work (its own record, its top-level frame's, or a brief listing it), which wins; audit.brief names the one used.", + "type": "string" +}
- Changed
figma_clone_node1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_combine_as_variants1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_convert_to_component1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_animatic1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_code_block1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_connectors1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_effect_style1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_ellipse1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_frame1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_from_spec1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_grid_style1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_instance1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_line1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_link_preview1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_page1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_paint_style1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_polygon1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_rectangle1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_section1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_shapes_with_text1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_slides1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_slot1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_star1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_stickies1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_storyboard1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_table1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_text1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_text_style1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_variable1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_variable_collection1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_variables1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_create_vector1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_delete_component_property1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_delete_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_delete_style1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_delete_variable1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_delete_variable_collection1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_detach_instance1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_edit_component_property1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_edit_connectors1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_edit_table1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_export_frames_to_pdf1 field changed- added
Input schema / properties / finalAdded value: +{ + "description": "The delivery. Under BRIDGE_PROCESS=strict a node that belongs to a brief needs a passing figma_sign_off newer than its last change. Default false: a render to judge, never gated.", + "type": "boolean" +}
- Changed
figma_export_node1 field changed- added
Input schema / properties / finalAdded value: +{ + "description": "The delivery. Under BRIDGE_PROCESS=strict a node that belongs to a brief needs a passing figma_sign_off newer than its last change. Default false: a render to judge, never gated.", + "type": "boolean" +}
- Changed
figma_find_replace_text1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_fit_sections1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_flatten_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Added
figma_get_brief - Added
figma_get_changes - Changed
figma_get_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "workflow", - "design", - "storyboard", - "motion", - "critique", - "design-system", - "design-to-code", - "code-to-design", - "prototype", - "figjam", - "slides", - "build", - "spec", - "check", - "safety", - "tools", - "brief", - "directions", - "system", - "tells", - "finish", - "beat-sheet", - "boards", - "animatic", - "bible", - "easing", - "principles", - "transitions", - "kinetic-type", - "formats", - "passes", - "mechanics", - "lenses", - "motion-checks", - "sampling", - "rounds", - "library", - "typography", - "rules", - "board-recipes", - "deck-recipes", - "skills" -]New value: +[ + "workflow", + "design", + "storyboard", + "motion", + "critique", + "design-system", + "design-to-code", + "code-to-design", + "prototype", + "figjam", + "slides", + "brand", + "graphic", + "ux", + "build", + "spec", + "check", + "safety", + "tools", + "brief", + "directions", + "system", + "tells", + "finish", + "beat-sheet", + "boards", + "animatic", + "bible", + "easing", + "principles", + "transitions", + "kinetic-type", + "formats", + "passes", + "mechanics", + "lenses", + "motion-checks", + "sampling", + "rounds", + "library", + "typography", + "rules", + "board-recipes", + "story", + "deck-recipes", + "identity", + "guidelines", + "placements", + "grid", + "illustration", + "flows", + "screens", + "states", + "accessibility", + "content", + "usability", + "skills" +]
- Changed
figma_group_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_import_image1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_import_library_assets1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_import_svg1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_move_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_move_slides1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_remove_keyframes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_remove_reactions1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_rename_node1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_reorder_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_reparent_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_reset_slot1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_resize_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Added
figma_rollback - Changed
figma_rotate_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Added
figma_savepoint - Changed
figma_set_auto_layout1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_blend_mode1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_board_properties1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Added
figma_set_brief - Changed
figma_set_clips_content1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_constraints1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_corner_radius1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_description1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_effects1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_fills1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_instance_properties1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_keyframes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_layout_grids1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_locked1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_mask1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_motion_plan9 fields changed- changed
Input schema / properties / brief / descriptionPrevious value: -"The motion brief."New value: +"The motion brief; fields left out come from a role-motion brief." - changed
Input schema / properties / brief / properties / audience / descriptionPrevious value: -"Who it is for."New value: +"Who it is for. Default: the motion brief's." - changed
Input schema / properties / brief / properties / durationS / descriptionPrevious value: -"Length in seconds, a whole number of frames."New value: +"Length in seconds, a whole number of frames. Default: the motion brief's." - changed
Input schema / properties / brief / properties / format / descriptionPrevious value: -"Size and placement, e.g. \"1080x1920 IG Reels\"."New value: +"Size and placement, e.g. \"1080x1920 IG Reels\". Default: the motion brief's format, else its placement." - changed
Input schema / properties / brief / properties / fps / descriptionPrevious value: -"Delivery rate: 8, 12, 15, 24, 30, 60."New value: +"Delivery rate: 8, 12, 15, 24, 30, 60. Default: the motion brief's." - changed
Input schema / properties / brief / properties / message / descriptionPrevious value: -"The one thing it must say."New value: +"The one thing it must say. Default: the motion brief's." - removed
Input schema / properties / brief / requiredRemoved value: -[ - "audience", - "message", - "format", - "durationS", - "fps" -] - added
Input schema / properties / briefIdAdded value: +{ + "description": "The role-motion brief to take left-out fields from (figma_set_brief returns its id). Default: the motion brief in force.", + "type": "string" +} - added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_opacity1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_prototype_flows1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_reactions1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_scroll_behavior1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_slide_grid1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_slide_properties1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_slide_transition1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_strokes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_text1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_text_properties1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_text_range1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_variable_mode1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_variable_properties1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_variable_value1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_set_visible1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Added
figma_sign_off - Added
figma_stress_test - Changed
figma_swap_component1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_undo_step1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_ungroup_nodes1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_update_style1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
- Changed
figma_update_variable_collection1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite on purpose. A write to a node someone changed after you last read it is refused (STALE); read it again and resend instead. Pass true only when the person said to overwrite their edit.", + "type": "boolean" +}
133 tool updates
v0.1.1- First observed
figma_add_component_property - First observed
figma_add_variable_mode - First observed
figma_apply_style_to_node - First observed
figma_batch - First observed
figma_batch_rename_nodes - First observed
figma_bind_variable_to_node - First observed
figma_boolean_nodes - First observed
figma_check_layout - First observed
figma_check_motion - First observed
figma_clone_node - First observed
figma_combine_as_variants - First observed
figma_convert_to_component - First observed
figma_create_animatic - First observed
figma_create_code_block - First observed
figma_create_connectors - First observed
figma_create_effect_style - First observed
figma_create_ellipse - First observed
figma_create_frame - First observed
figma_create_from_spec - First observed
figma_create_grid_style - First observed
figma_create_instance - First observed
figma_create_line - First observed
figma_create_link_preview - First observed
figma_create_page - First observed
figma_create_paint_style - First observed
figma_create_polygon - First observed
figma_create_rectangle - First observed
figma_create_section - First observed
figma_create_shapes_with_text - First observed
figma_create_slides - First observed
figma_create_slot - First observed
figma_create_star - First observed
figma_create_stickies - First observed
figma_create_storyboard - First observed
figma_create_table - First observed
figma_create_text - First observed
figma_create_text_style - First observed
figma_create_variable - First observed
figma_create_variable_collection - First observed
figma_create_variables - First observed
figma_create_vector - First observed
figma_delete_component_property - First observed
figma_delete_nodes - First observed
figma_delete_style - First observed
figma_delete_variable - First observed
figma_delete_variable_collection - First observed
figma_detach_instance - First observed
figma_download_assets - First observed
figma_edit_component_property - First observed
figma_edit_connectors - First observed
figma_edit_table - First observed
figma_export_frames_to_pdf - First observed
figma_export_node - First observed
figma_export_video - First observed
figma_find_replace_text - First observed
figma_fit_sections - First observed
figma_flatten_nodes - First observed
figma_get_annotations - First observed
figma_get_component - First observed
figma_get_design_context - First observed
figma_get_fonts - First observed
figma_get_guide - First observed
figma_get_library_variables - First observed
figma_get_local_components - First observed
figma_get_metadata - First observed
figma_get_motion_context - First observed
figma_get_node - First observed
figma_get_nodes_info - First observed
figma_get_pages - First observed
figma_get_reactions - First observed
figma_get_selection - First observed
figma_get_slide_grid - First observed
figma_get_styles - First observed
figma_get_variable_defs - First observed
figma_group_nodes - First observed
figma_import_image - First observed
figma_import_library_assets - First observed
figma_import_svg - First observed
figma_move_nodes - First observed
figma_move_slides - First observed
figma_navigate_page - First observed
figma_remove_keyframes - First observed
figma_remove_reactions - First observed
figma_rename_node - First observed
figma_reorder_nodes - First observed
figma_reparent_nodes - First observed
figma_reset_slot - First observed
figma_resize_nodes - First observed
figma_review_video - First observed
figma_rotate_nodes - First observed
figma_save_screenshots - First observed
figma_scan_nodes_by_types - First observed
figma_scan_text_nodes - First observed
figma_search_nodes - First observed
figma_select - First observed
figma_set_auto_layout - First observed
figma_set_blend_mode - First observed
figma_set_board_properties - First observed
figma_set_clips_content - First observed
figma_set_constraints - First observed
figma_set_corner_radius - First observed
figma_set_description - First observed
figma_set_effects - First observed
figma_set_fills - First observed
figma_set_instance_properties - First observed
figma_set_keyframes - First observed
figma_set_layout_grids - First observed
figma_set_locked - First observed
figma_set_mask - First observed
figma_set_motion_plan - First observed
figma_set_opacity - First observed
figma_set_prototype_flows - First observed
figma_set_reactions - First observed
figma_set_scroll_behavior - First observed
figma_set_slide_grid - First observed
figma_set_slide_properties - First observed
figma_set_slide_transition - First observed
figma_set_strokes - First observed
figma_set_text - First observed
figma_set_text_properties - First observed
figma_set_text_range - First observed
figma_set_variable_mode - First observed
figma_set_variable_properties - First observed
figma_set_variable_value - First observed
figma_set_visible - First observed
figma_status - First observed
figma_suggest_fonts - First observed
figma_swap_component - First observed
figma_undo_step - First observed
figma_ungroup_nodes - First observed
figma_update_style - First observed
figma_update_variable_collection - First observed
figma_zoom_to
TDQS
Scored across 140 tools
Most tools have a sharply scoped purpose and the descriptions cross-reference siblings explicitly (e.g. figma_set_fills vs figma_apply_style_to_node, figma_get_reactions vs figma_get_motion_context). But the set is so large that near-neighbours abound: six-plus read tools (get_node, get_nodes_info, get_design_context, get_metadata, search_nodes, scan_text_nodes, scan_nodes_by_types) and five export tools (export_node, save_screenshots, download_assets, export_frames_to_pdf, export_video) require reading long descriptions to choose correctly. An agent will frequently pick the wrong one on first pass.
Overwhelmingly a figma_verb_noun snake_case pattern (create_frame, set_fills, get_design_context, delete_variable), which is predictable and readable. Minor deviations exist: figma_batch, figma_savepoint, figma_sign_off, figma_stress_test, figma_status, figma_batch_rename_nodes mix noun-style names into the verb scheme, but none are ambiguous.
140 tools is far beyond any reasonable single-server surface and forces the agent to triage a huge catalogue before acting. Even with excellent descriptions, the cognitive load and misselection risk are extreme; many tools (create_rectangle, create_ellipse, create_polygon, create_star, create_line, create_vector) are thin wrappers that should be consolidated into one shape tool or a spec builder.
Coverage is exceptional for the domain: full node CRUD (create/clone/move/resize/rotate/reorder/reparent/group/boolean/flatten/delete), variables and styles end-to-end, components/variants/properties/slots, FigJam board primitives, Slides decks and transitions, motion keyframes and review, plus briefs, sign-off, savepoints and rollback. The only real gap is consolidation rather than missing capability.
Maintenance
Related MCP Connectors
The Figma MCP server brings Figma design context directly into your AI workflow.
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
The Canva MCP server connects AI assistants (like Claude, ChatGPT, and Cursor) to Canva's API, enabling them to create and manage designs directly within chat conversations. Key capabilities include generating new designs from prompts, autofilling templates, searching and resizing existing designs, importing files from URLs, exporting designs as PDFs or images, and managing folders and comments without switching between tools.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that integrates AI agents with Figma, enabling reading and programmatic modification of designs.41MIT
- FlicenseNot gradedqualityCmaintenanceA local MCP server that gives AI agents live access to open Figma files for design handoff and UX writing without API tokens or rate limits.3-
- AlicenseBqualityAmaintenanceA local MCP server that lets AI assistants inspect, create, and update designs in Figma Desktop through a development plugin, requiring no Figma Personal Access Token or cloud services.1216 npm1MIT

desrid-html-to-figmaofficial
AlicenseNot gradedqualityBmaintenanceThis MCP server lets AI agents connect to Figma to read, analyze, create, and modify designs, including elements, styles, assets, and code generation. It works with free Figma accounts and supports parallel multi-agent use across MCP-compatible clients.MIT