Skip to main content
Glama

Figxel is a local MCP server with a small Figma desktop plugin. With it, an AI app such as Claude, 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.

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.

Temporary: 0.1.1 is waiting to be published to npm, where figxel-mcp@latest is still 0.1.0. Until then the Quickstart's first step runs setup from the v0.1.1 GitHub Release; the @latest entry in your AI app moves to 0.1.1 by itself once it is on npm.

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.

  • The agent works like a designer. Its skills teach it to write a brief, compare directions and check every section it builds. For motion the tools enforce the process: a plan before the first keyframe, a passing check before the final render.

  • It is local and open source. The server runs on your machine and listens only on 127.0.0.1. MIT licensed.

Related MCP server: Talk to Figma 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_layout finds overflowing text, clipped or overlapping content, low contrast and placeholder copy, and suggests the fix.

  • FigJam and Figma Slides: reads work today; board and deck writes stay refused until a live run verifies them.

  • Follow a process: eleven skills, from design and motion to critique, reach every app through figma_get_guide, MCP prompts and skill:// resources.

That is 133 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

  1. 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 https://github.com/AvYour/figxel-mcp/releases/download/v0.1.1/figxel-mcp-0.1.1.tgz setup --register

    Once 0.1.1 is on npm this becomes npx -y figxel-mcp@latest setup --register. Setup 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.

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

  3. Add the server to your AI app. In Claude Desktop, Settings → Developer → Edit Config opens claude_desktop_config.json [C-277]. Add Figxel under mcpServers:

    {
      "mcpServers": {
        "figxel": { "command": "npx", "args": ["-y", "figxel-mcp@latest"] }
      }
    }

    On Windows, start it through cmd, because an app that starts npx without 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@latest

    Other apps: docs/clients.md.

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

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.tsx in 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_TOOLSET trims the tool list for apps with a tool limit, such as VS Code (128 tools [C-286]) and Windsurf (100 [C-289]): core registers 20 tools.

  • BRIDGE_PROCESS sets how strictly the motion process is enforced: strict (the default), guided (warnings instead of refusals) or off.

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 ENOENT in the app's log): use the cmd /c npx … form [C-281].

  • Too many tools in VS Code or Windsurf: set BRIDGE_TOOLSET (Configuration).

  • figma_status asks 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.

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?

Figxel itself sends nothing off your machine. 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

Using Figxel

How to work with the agent: the first session, writing a brief, example requests, reviewing and undoing its work, tips

Using it from any AI app

Setup per app, install details, updating and uninstalling, installing the skills, tool-call timeouts, sharing one Figma connection

Configuration

Every setting, its default and where to set it

Troubleshooting

Known problems with their fixes, and the privacy details

Using Figxel as an agent

How an agent should work: the loop, the skills, prompts and resources, choosing a tool, the safety rules

Tool catalog

Every tool and its parameters, toolsets, resources, and which editor runs each tool

Protocol

The wire protocol between the server and the plugin

Design spec

Architecture, configuration, limits, safety, errors, testing and decisions

Roadmap

Phases, next steps, locked decisions, and why Figxel uses a plugin

Claim registry

Every external fact the design relies on, with source and date: the ids such as [C-273] in these documents

Contributing

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

133 tools
figma_add_component_propertyAdd component propertyA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYese.g. "Label", "Show icon".
typeYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
bindNodeIdsNoLayers inside the component this property drives.
componentIdYesA COMPONENT, or a COMPONENT_SET — not a single variant inside a set.
defaultValueYesText, "true"/"false" for BOOLEAN, a component id for INSTANCE_SWAP.
idempotencyKeyNoCaller-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.
preferredValuesNoINSTANCE_SWAP only: component or component-set ids offered first in the swap menu.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the description's added value is what matters, and it delivers a lot: what binding actually does ('instances then edit the label without detaching'), the reuse contract with the `reused: true` flag, the return value shape, and environment limits (Design verified; 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.

Conciseness4/5

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

Front-loaded with the core action, and every clause carries information (four type behaviors, the return key, the reuse rule, sibling routing, editor coverage). It is dense and packed into one long paragraph, which slightly hurts scanability, but there is little dead weight.

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

Completeness5/5

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

With no output schema, the description correctly fills the gap by stating what is returned (the property `key` as name + #id that figma_set_instance_properties accepts) and that a plain name works too. Combined with type semantics, reuse behavior and editor support, 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.

Parameters4/5

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

Schema coverage is 88%, so the baseline is 3. The description still adds genuine meaning on top: it explains that bindNodeIds wires text layers for TEXT, that BOOLEAN drives show/hide, that INSTANCE_SWAP's default is a component id, and that VARIANT only applies to sets — semantics the bare enum does not convey.

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

Purpose5/5

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

States a specific verb+resource ('give a component ... a property that instances can change') and immediately enumerates the four property kinds with their distinct semantics. It clearly differentiates itself from figma_edit_component_property, figma_delete_component_property and figma_create_slot by naming when each is the right call.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use figma_edit_component_property to rename, re-default or unwire, and figma_create_slot for slots. It also documents the re-call/reuse case ('called again with a name and type that exist, it reuses that property') and notes VARIANT is 'on a set only', so both when-to-use and when-not-to-use are covered.

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

figma_add_variable_modeAdd variable modeA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
collectionIdYes
idempotencyKeyNoCaller-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

A4.4/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly=false, destructive=false, idempotent=true), but the description adds real behavioral context beyond them: the paid-plan gating rule, the fact that Figma's own refusal message is surfaced, the returned modeId, and the editor support matrix (Design; unverified FigJam/Slides). This is well above the lower bar set by the annotations.

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

Conciseness5/5

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

Front-loads the core action and return value, then adds plan gate, follow-up tool, and editor support in tight clauses. No sentence is filler and none repeats structured data verbatim.

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

Completeness4/5

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

For a 4-param mutation with no output schema, the description covers the return value, plan prerequisite, error behavior, and next step, so an agent can call it correctly. The only remaining gap is the undocumented collectionId/name semantics.

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

Parameters3/5

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

Schema description coverage is only 50% (session and idempotencyKey are documented; name and collectionId are not). The description mentions the target collection and the mode name example "Dark" but adds no format, uniqueness, or identifier semantics for the undocumented required parameters. With half the parameters bare in the schema, the description does not fully compensate.

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

Purpose5/5

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

States a specific verb (Add) and resource (a mode to a variable collection), names the counterpart operation in the title, and discloses the return value (modeId). It is clearly distinguishable from sibling tools like figma_set_variable_mode, figma_update_variable_collection, and figma_create_variable_collection.

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

Usage Guidelines4/5

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

Gives concrete context: modes beyond the first require a paid plan, Starter files are refused with the message returned, and the follow-up step is routed explicitly to figma_set_variable_value. It also documents supported editors. It stops short of naming a when-not alternative beyond the plan gate, so it is a strong 4 rather than a 5.

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 styleA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
nodeIdsYesNodes to change.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
styleIdNoA style id from figma_get_styles.
styleNameNoOr its exact name, e.g. "Brand/Primary".
idempotencyKeyNoCaller-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

A4.7/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly=false, idempotent=true, destructive=false), and the description adds genuine behavior: per-item partial-success semantics ('one node failing does not fail the call'), the exact return shape, and editor support ('Design; unverified: FigJam, Slides'). It stops short of stating that applying a style replaces existing fills/strokes.

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

Conciseness5/5

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

A single dense paragraph where every clause carries routing or behavioral information; the core action is front-loaded before the alternatives and edge cases. No filler sentences.

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

Completeness5/5

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

With no output schema, the description supplies the return contract (`{ updated, items: [{ id, ok, error? }] }`), the partial-failure rule, the style-source alternatives, and platform coverage — everything needed 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.

Parameters4/5

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

With 83% schema coverage the baseline is 3, but the description adds real meaning beyond the enum: `type` defaults to fill and can be stroke when applying a paint style, and it explains the id-vs-name distinction for styleId/styleName. It does not touch `session` or `idempotencyKey`, which the schema already documents.

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

Purpose5/5

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

States a specific verb and resource (apply a local style to a node), enumerates the style kinds (paint, text, effect, grid), and clarifies the effect ('the node then follows the style'). It is readily distinguishable from siblings like figma_create_paint_style and 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.

Usage Guidelines5/5

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

Explicitly routes the agent: use figma_set_fills for a raw colour, figma_get_styles for local styles, and figma_get_design_context's `stylesUsed` id for library styles. It also states when `type` is needed (shared name across kinds, or paint-as-stroke with fill as default).

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

figma_batchBatch editsA
Idempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
stepsYesJSON array, e.g. [{"op":"set_corner_radius","params":{"nodeIds":["1:2"],"radius":12}},{"op":"set_opacity","params":{"nodeIds":["1:3"],"opacity":0.6}}].
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnly=false, destructive=false, idempotent=true, openWorld=false. The description goes far beyond: stop-at-first-failure with no rollback, partial.steps/partial.failedAt semantics, whole-batch Ctrl+Z undo, the 1–50 step limit, pre-flight validation of each step against its own tool parameters, and the BRIDGE_PROCESS motion gate. This is exactly the extra behavioral context the annotations cannot carry.

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

Conciseness4/5

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

Front-loads the core value (ONE call, ONE undo) and the create/delete exclusions before the mechanics. Everything present earns its place, though the single dense paragraph packs success/error shapes, validation, and the motion gate together, which costs some scannability.

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

Completeness5/5

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

This is a complex aggregator tool with no output schema, so the description carries the full burden of describing returns — and it does: the success object shape, the itemsFailed array, and partial failure reporting. Combined with the step format and exclusions, 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: op names must omit the figma_ prefix, the 1–50 step range, and that each step is validated against its own tool's parameters before execution. Session and idempotencyKey are left 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.

Purpose5/5

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

States a specific verb+resource ('several edits in ONE call and ONE undo step') and scopes the resource precisely: fills, strokes, radius, effects, auto-layout, sizes, text, constraints, names. It also distinguishes itself from siblings by explicitly excluding creates (naming figma_create_from_spec), deletes, and node-replacing ops (group, boolean, flatten, clone), so an agent can differentiate it from hundreds of siblings without reading a schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('a polish pass over what you built'), when-not (no creates, no deletes, nothing that replaces nodes with new ids), and names the alternative for the excluded case (figma_create_from_spec builds). It also flags the motion-gate prerequisite for keyframe steps, so the agent knows exactly what conditions apply.

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 renameA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNoDefault false.
scopeNoDefault "page".
typesNoOnly these node types, e.g. ["FRAME"].
nodeIdNoSubtree root when scope is "subtree".
patternYesText to find in names (or a regex when `regex: true`).
replaceYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A3.7/5.0
Behavior4/5

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

Annotations only declare the safety/idempotency profile; the description adds genuinely new behavior — per-item results `items: [{ id, ok, error? }]` and the key guarantee that one failing node does not fail the whole call, plus partial platform support. It does not mention reversibility (e.g. that an undo step can roll back renames), 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.

Conciseness4/5

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

Four tight sentences, front-loaded with the core operation and then the result semantics and platform caveat — each sentence carries information and none is padding. Slightly compressed in places ('Scope, optional type filter, optional regex' is telegraphic), but that density is efficient rather than confusing.

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

Completeness4/5

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

With no output schema, the description correctly compensates by describing the per-item result envelope and partial-failure behavior, and it covers the three operating modes. For an 8-parameter mutation tool the description plus the high-coverage schema is nearly complete; only reversibility/cleanup guidance is absent.

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

Parameters3/5

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

Schema description coverage is 88%, so the schema already documents scope, types, regex, nodeId, session, and the idempotencyKey retry contract in detail. The description only restates 'scope, optional type filter, optional regex' and adds no format or interaction detail (e.g. how nodeId pairs with scope='subtree') beyond what the schema provides, so the baseline 3 applies.

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

Purpose4/5

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

'Bulk rename by find/replace over names' states a specific verb, resource, and mechanism, which cleanly separates it from the single-node figma_rename_node and the text-content figma_find_replace_text. It stops short of naming those siblings, so an agent must infer the distinction from 'names' vs 'text'.

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

Usage Guidelines3/5

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

The example ('turning `Frame 12` into `Card / 12`') and the mention of scope/type filter/regex imply intended usage, and the editor note ('Design; unverified: FigJam, Slides') is useful environment guidance. However, there is no explicit when-to-use-vs-figma_rename_node or vs figma_find_replace_text routing, which matters given how many rename-adjacent siblings exist.

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 variableA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYese.g. "fill", "radius", "gap", "padding", "effect.color", "fontSize".
indexNoWhich paint, effect or grid (0 = the first, the default).
nodeIdsYesNodes to change.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
variableIdNoe.g. "VariableID:1:2".
variableNameNoOr its full name, e.g. "color/bg/default".
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly=false, idempotent=true, destructive=false), and the description adds substantial behavior beyond them: per-item result shape, that one failing node does not fail the whole call, per-item refusals for unsupported text fields, and editor support (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.

Conciseness4/5

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

Front-loaded with the core purpose, then the field taxonomy, alternative routes, and return shape. It is dense and the long field enumeration is heavy, but nearly every clause carries actionable information an agent needs to pick valid field values.

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

Completeness5/5

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

No output schema exists, but the description supplies the return contract ({ updated, items: [{ id, ok, error? }] }), failure semantics, refusal cases, and editor coverage. Combined with the fully documented schema and idempotencyKey retry guidance, 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.

Parameters4/5

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

Schema coverage is 100% so baseline is 3, but the description adds real meaning: it explains which `field` values exist and their semantics, that `index` selects the specific paint/effect/grid and must be SOLID, and how variableId vs variableName relate. This goes beyond the schema's terse examples.

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

Purpose5/5

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

States a specific verb+resource+scope: binding a variable (design token) to a node property so the node follows the variable. It enumerates exactly which properties are bindable, letting an agent distinguish it from siblings like figma_set_variable_value (changes a value) or figma_create_variable (creates a token).

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

Usage Guidelines4/5

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

Gives clear routing context: library variables bind by the id reported by figma_get_variable_defs { nodeId }, and a token inside a style is handled by figma_update_style instead. It also states exclusions (gradient/image paints are refused, not replaced). It stops short of an explicit when-not-to-use-this vs figma_set_variable_value comparison.

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

figma_boolean_nodesBoolean operationA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
nodeIdsYesThe shapes, from any layer order — Figma uses their stacking.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
operationYes
idempotencyKeyNoCaller-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

A4.4/5.0
Behavior4/5

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

Annotations already declare the mutation-safe profile (readOnly=false, idempotent=true, destructive=false), so the bar is lower. The description adds real behavior: the result takes the lowest shape's place, the resulting id is returned, and the parent-sharing constraint. It does not explain what happens to the source shapes' child structure, leaving a 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.

Conciseness5/5

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

Front-loaded with the core action, then the four modes, then placement/return behavior, then use cases and editor scope. Dense but every clause carries information; no filler sentences.

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

Completeness4/5

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

For a mutation tool with no output schema, it covers modes, placement, returned id, parent requirement, and editor support. The one omission is what happens to the original nodes' internal hierarchy after the boolean, a detail an agent might need.

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

Parameters4/5

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

Schema coverage is 60%, and the description enriches the operation enum with per-value meaning (union, subtract, intersect, exclude) that the schema lists only as bare names. It also implicitly reinforces the multi-node input, though it adds nothing for the undocumented `name` parameter.

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

Purpose5/5

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

States a specific verb and resource (combine shapes into one boolean shape) and enumerates all four operation modes with plain-language definitions of each. An agent can distinguish this from nearby siblings like figma_flatten_nodes, figma_group_nodes, and figma_ungroup_nodes without opening the schema.

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

Usage Guidelines4/5

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

Gives clear usage context ("Builds icons, badges, cut-out shapes and logos") and a hard prerequisite (shapes must share a parent), plus editor support notes. It stops short of explicitly contrasting when to pick this over the sibling flatten/group/ungroup tools, so it is clear context rather than full when/when-not routing.

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

figma_check_layoutCheck a design for defectsA
Read-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 painted over; content clipped or sticking out; a fill child in a hug parent; stacked frames; placeholder copy ("Lorem ipsum", "Acme"); low contrast (WCAG); zero-size nodes, empty frames, default names; on a slide, content off it, bleeds, cut text. audit adds passes: tokens (raw values, with the variable to bind), names (duplicate components, variants), fonts (expectFonts flags others), board (FigJam rules), craft (finish: near-equal sizes, unshared edges, near-touches, lines through text, old-style figures, shape contrast, faint hairlines, a sunk block; safeArea, minTextSize), tells (the generated look, info only), handoff (share bound to variables or styles, detached instances). ok: true = no errors or warnings. Default: the selection, then the page (Slides: focused slide). Reads only.

ParametersJSON Schema
NameRequiredDescriptionDefault
auditNoQA passes to add: tokens, names, fonts, board, craft (finish defects), tells (the generated look; info only), handoff (how much is bound to the system).
limitNoMax findings returned. Default 100.
nodeIdNoThe frame or section to check. Defaults to every selected node, then the page.
nodeIdsNoSeveral roots in one call, e.g. a batch of 3–5 slides. Not with nodeId.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
maxNodesNoStop after this many nodes. Default 3000.
safeAreaNo"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.
expectFontsNoFont families the design should use, e.g. ["Inter"]; implies the fonts audit.
minSeverityNoHide findings below this level. Default "info".
minTextSizeNoSmallest 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

A4.3/5.0
Behavior4/5

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

With readOnlyHint/openWorldHint/destructiveHint already covering the safety profile, the description adds meaningful context: result semantics ('ok: true = no errors or warnings'), each audit pass behavior, that 'tells' is informational only, and that tokens pass returns the variable to bind. It also implies cost bounds via maxNodes defaults. It does not discuss pagination or performance limits beyond that.

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

Conciseness4/5

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

Front-loads the timing and purpose, then compresses defect classes and audit-pass semantics into a dense but scannable telegraphic style. Every sentence carries information, though the heavy semicolon/backtick packing makes it harder to parse than a cleanly structured list would be.

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

Completeness4/5

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

With no output schema, the description carries the return burden and does so partially: it explains 'ok: true' and 'number and fix' per finding, default scope, and audit-pass additions. It covers enough for a correct invocation, though result shape details (severity fields, counts) are only implied.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds cross-parameter semantics the schema lacks: safeArea and minTextSize 'imply craft', expectFonts 'implies the fonts audit', and each audit enum value is explained with its output meaning (e.g. tells = info only). This goes beyond restating the schema.

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

Purpose5/5

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

States a specific verb and resource (checks a Figma design/selection for layout defects) and enumerates the concrete defect classes it reports (overflow, overlap, clipping, placeholder copy, low contrast, zero-size nodes). It explicitly contrasts itself with the visual sibling figma_export_node and distinguishes itself from the surrounding mutation tools in the suite.

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

Usage Guidelines4/5

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

Gives clear timing guidance ('after each section and before calling anything done') and names the alternative for the visual view (figma_export_node). It also states the default scope (selection, then page, or focused slide). It stops short of explicit when-not-to-use or exclusion conditions, but the context is unambiguous.

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 frameA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoJudge up to this time, s. Default the end.
bpmNoTempo: turns on the beat check. Default the plan's.
fpsNoFrame rate to judge at; match the planned export. Default 30.
fromNoJudge from this time, s. Default the start.
ctaIdNoThe call-to-action layer: turns on cta_short. Default the plan's.
holdsNoIntended 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.
limitNoMax findings returned. Default 100.
rulesNoOnly these rules. Default all.
nodeIdNoThe 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.
brandByNoBrand fully visible by this time, s. Default 3.
brandIdNoThe brand layer: turns on brand_late. Default the plan's.
ctaMinSNoSeconds the CTA must stay readable. Default 2.5.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
maxNodesNoLayers read. Default 2000.
beatTimesNoThe beat times of the music in seconds, increasing: the beat check uses them instead of the bpm grid.
beatOffsetNoTime of the first downbeat, s. Default the plan's, else 0.
thresholdsNoOverride a default threshold; each comes from a measured 2026-10-09 finding.
beatsPerBarNoDefault 4.
minSeverityNoHide findings below this level. Default "info".
includeActivityNoAdd `activity`: the fastest on-screen move per frame, px.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines5/5

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 nodeA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoNot for a slide: the deck's grid places it.
yNo
nameNo
nodeIdYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNoDefault: the source's parent. For a slide, a SLIDE_ROW.
idempotencyKeyNoCaller-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

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (write, non-destructive, idempotent), so the description earns credit for adding behavior: the clone carries the entire subtree, and for slides it lands adjacent in the row and returns row/col. It doesn't say whether the source is untouched or what the default placement is for a non-slide node (the schema's parentId default handles that), leaving a modest gap.

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

Conciseness4/5

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

Three sentences, front-loaded with the core action before the slide special case. The slide sentence is dash-heavy and dense, but no sentence is wasted.

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

Completeness4/5

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

For a write tool with full annotation coverage and no output schema, the definition covers what it does, where it is supported, and part of the return shape (row/col). It never mentions whether the original node remains unchanged or whether the duplicate inherits names, which an agent might wonder about.

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

Parameters3/5

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

Schema coverage is 57%, so the description should compensate but mostly restates the schema's own parentId slide-row note ("a SLIDE_ROW") and position semantics. Its only genuinely additive parameter information is the row/col return values, which matters because there is no output schema.

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

Purpose4/5

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

"Duplicate a node with its whole subtree" is a precise verb+resource, and the parent/position clause clarifies scope beyond a simple copy. It does not name a specific sibling (e.g., figma_reparent_nodes or figma_create_instance) that an agent might confuse it with, so it stops short of the top band.

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

Usage Guidelines4/5

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

It states the context in which the optional parentId/repositioning applies and scopes editor support ("Editors: Design; unverified: FigJam, Slides"), which is real selection guidance. It never names an alternative tool or a when-not condition, so it is clear context without exclusions.

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 variantsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
gapNoSpace between variants, px. Default 24.
nameNoThe set's name, e.g. "Button".
arrangeNoLay the variants out in a wrapping row. Default true.
columnsNoA variant property every component names, e.g. "State": one grid column per value.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
descriptionNoWhat the set is for — shown in the assets panel and Dev Mode.
componentIdsYes
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false and idempotent=true. The description adds real context beyond them: the naming convention Figma uses to derive properties, the shared-parent constraint, default wrapping-row layout, and that the grid mode returns page coordinates for external header labels.

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

Conciseness4/5

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

Front-loaded with purpose, then prerequisites, layout behavior, follow-on workflow, and editor support in a tight sequence. Dense but every sentence carries operational weight; the editor-support tail is the only marginal line.

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

Completeness4/5

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

For an 8-parameter mutation tool with no output schema, the description covers prerequisites, layout modes, and the notable return value (grid coordinates). It stops short of describing error/rollback behavior, but the essentials for correct invocation are present.

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

Parameters4/5

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

Schema coverage is already 88%. The description still adds meaning for the non-obvious parameters, clarifying what `arrange: false` does and how `columns: "State"` produces columns per value and rows per combination, plus the returned grid coordinates — details the schema comments only summarize.

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

Purpose5/5

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

States a specific verb and resource — 'Combine components into one component set (variants)' — and anchors it to the Figma feature of the same name. It is clearly distinguishable from siblings like figma_convert_to_component and figma_group_nodes.

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

Usage Guidelines5/5

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

Spells out prerequisites (name each component 'Property=Value' via figma_rename_node first, components must share a parent) and the follow-on workflow (figma_create_instance to place, figma_set_instance_properties to switch), naming the sibling tools explicitly. It also flags editor support (Design; unverified Slides).

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 componentA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoComponent name. Defaults to the node's name.
nodeIdYesThe node to convert.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
descriptionNoWhat the component is for — shown in the assets panel and Dev Mode.
idempotencyKeyNoCaller-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

A4.4/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description only needs additive context. It supplies the failure conditions and the fact that the original node is preserved with its children and a new id is returned, plus editor/platform availability. It stops short of describing what happens to existing instances or references to the original node.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the core action, followed by constraints and the sibling routing. No filler, and the parenthetical asides earn their place.

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

Completeness4/5

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

With no output schema, the description helpfully notes the returned id, and it covers preconditions and platform scope. It could say more about the return payload or how the new component relates to the original node, but it is sufficient for an agent to invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters (including name defaulting and idempotencyKey retry semantics) are fully documented in the schema. The description adds essentially no parameter-level detail beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Turn an existing node ... into a reusable COMPONENT') and clarifies the colloquial equivalent ('the toolbar's Create component'). It is clearly distinguishable from siblings like figma_get_component or figma_create_instance.

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

Usage Guidelines5/5

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

Explicitly states preconditions where conversion is impossible (already a component, or inside a component/instance) and names the follow-up alternative for placing copies (figma_create_instance). This is exactly the when/when-not/alternative structure the dimension rewards.

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 animaticA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoDefault: right of everything on the page.
yNo
driftNoPush each plate's picture 3 % over its panel, so a held panel does not read as a freeze. Default false.
widthNoPlate width in px; the height follows the board's aspect. Default 1080 (1920 for 16:9).
burnInNo"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".
pageIdNoThe page to build on, at its top level. Default: the board's page.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
storyboardIdYesThe board figma_create_storyboard returned (its storyboardId: the Storyboard / <title> frame), id or Figma link.
dissolveFramesNoFrames of cross-fade out of a panel whose transition caption starts with "dissolve". Default 0: every change is a cut.
idempotencyKeyNoCaller-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

A4.2/5.0
Behavior4/5

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

Going beyond the annotations (which only declare non-readonly, idempotent, non-destructive, closed-world), the description discloses the creation mechanics (one plate per panel, frame-exact opacity cuts), that outputs are read back as `verified` or `notApplied`, that plates 2–n rest at opacity 0, and that it costs one undo step and is Design-editor-only + unverified. This is rich behavioral context; only minor gaps (e.g. failure modes, scale limits) remain.

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

Conciseness4/5

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

Purpose is front-loaded in the first clause, and the dense detail that follows is generally relevant. It is long and several clauses are run-on, but for a complex 10-parameter generative tool most sentences earn their place.

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

Completeness5/5

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

With no output schema, the description compensates by describing return semantics (`render` is the export_video call, `blank` lists empty panels, per-track `verified`/`notApplied`), the visual result, the frame-timing mechanics, editor restrictions, and undo cost. Nothing essential for invoking 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.

Parameters3/5

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

Schema description coverage is already 90%, so the schema documents x/y/drift/width/burnIn/dissolveFrames/idempotencyKey thoroughly. The description restates and contextualizes a few behaviors (dissolveFrames cross-fades, drift pushes 3%, burnIn labels, blank lists empty panels) but adds little 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.

Purpose5/5

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

Names a specific verb and resource ('turn a figma_create_storyboard board into an animatic') and describes the concrete artifact produced (a top-level frame `Animatic · <title>` with one plate per panel). It explicitly references the sibling figma_create_storyboard it consumes, so an agent can distinguish it from other create tools at a glance.

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

Usage Guidelines4/5

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

Lays out a clear pipeline: read timing from the board as-is, then export via figma_export_video and judge pace with figma_review_video, with the storyboard skill guide referenced. It gives context for when this applies, but does not state explicit exclusions or when-not-to-use conditions.

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

figma_create_code_blockCreate a code block (FigJam)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoLeft edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content.
yNoTop edge, in the parent's coordinates.
codeYesThe code.
nameNoLayer name.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
languageNotypescript, javascript, python, go, rust, ruby, css, html, json, graphql, sql, swift, kotlin, cpp, bash, plaintext, dart. Default plaintext.
parentIdNoA section or frame to put it in (id or Figma link). Default: the current page.
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

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

Annotations cover the safety profile (destructiveHint=false, idempotentHint=true), and the description adds behavior beyond that: unrecognized language values are refused rather than silently falling back to plaintext, styling is fixed by FigJam, and environment support is 'unverified'. The idempotency-key retry semantics live in the schema, so the description is right not to repeat them.

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

Conciseness4/5

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

It is compact and front-loaded with the resource and the most important parameter (language), and the refusal rule and styling constraints follow. The telegraphic fragments and the trailing 'Editors: FigJam only, unverified' are slightly cryptic, but nothing is wasted.

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

Completeness4/5

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

For an 8-parameter creation tool with only one required param, full schema coverage and matching annotations, the description supplies the environment scope, the language semantics and the styling limits an agent needs. No output schema exists, but the return value is a created node and the annotations plus idempotency key cover the risky parts.

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

Parameters4/5

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

Schema coverage is 100%, so a 3 is the baseline. The description adds genuine meaning on top of the schema: language matching is case-insensitive, plaintext is the default, and 'dart is in the Plugin API but not yet confirmed on the canvas' gives a caveat the schema does not. That pushes it above baseline.

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

Purpose4/5

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

The name and title establish the verb+resource ('create a code block'), and the description pins it to FigJam with syntax highlighting, which distinguishes it from generic siblings like figma_create_text, figma_create_table and figma_create_stickies. The description itself opens with a noun phrase rather than a verb, so it leans on the name/title for the action.

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

Usage Guidelines4/5

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

It gives concrete usage constraints: FigJam-only environment ('Editors: FigJam only, unverified') and 'no theme, font or size to set', which steers the agent away from trying to set styling. It also states the language default and refusal behavior. It does not name an alternative tool, but for a creation tool the environment constraint is the key guidance.

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)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNoWhere every connector goes: a section or a frame without auto-layout. Default: per connector, the lowest section holding both ends, else the page.
connectorsYes
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior5/5

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

Annotations only cover readOnly/idempotent/destructive/openWorld; the description adds non-obvious behavior the annotations cannot convey: connectors are created in their final parent (lowest shared section, else page), are never moved, and reparenting leaves stale elbows — hence build last. It also documents default cap behavior and default lineType, which materially affects the result.

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

Conciseness4/5

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

Front-loaded with the action and batch limit, then endpoints, then defaults. Dense but each clause carries information; the main inefficiency is restating the endpoint syntax and lineType/cap defaults already present in the schema. Hedges like 'to be confirmed' and 'unverified' are appropriately honest rather than filler.

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

Completeness4/5

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

No output schema, but the description covers the parent-placement semantics, the endpoint grammar, cap/lineType defaults, and points to the edit sibling for later changes; idempotencyKey retry semantics live in the schema. Return-value behavior is not described, but for a create tool that is a minor gap.

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

Parameters4/5

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

Schema coverage is 75%, and the description supplies the critical endpoint mini-language ("12:34", "12:34@right", "12:34@0.5,1", free point "120,340") plus the constraint that an end may not be another connector. Defaults for lineType and caps are repeated from the schema, so it adds real value but some redundancy.

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

Purpose5/5

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

States a specific verb+resource ('FigJam connector lines between nodes'), quantifies batch capacity (1–200 per call), and names the sibling figma_edit_connectors for the modify path. An agent can distinguish this from figma_create_line, figma_create_vector, and figma_edit_connectors without opening schemas.

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

Usage Guidelines4/5

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

Gives clear routing guidance: build connectors last (because reparented connectors keep stale elbows), and use figma_edit_connectors to change one later. It also flags the environment constraint (FigJam only, unverified). No explicit when-not-to-use statement, 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_create_effect_styleCreate effect styleA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
effectsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
descriptionNoWhat the style is for — shown in Figma's style picker.
idempotencyKeyNoCaller-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

A3.6/5.0
Behavior4/5

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

Annotations already cover readOnly/destructive/idempotent, so the bar is lower. The description adds real behavioral context beyond them: the style is 'local' (not a library style), it is mutable in place via figma_update_style, and the permission gate 'Editors: Design only' is a genuine prerequisite disclosure. It still says nothing about what is returned or duplicate-name behavior.

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

Conciseness4/5

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

Four short, telegraphic sentences with no filler, and the resource identity leads. The fragmentary first sentence ('A local effect style ...') reads like a note rather than a definition, slightly weakening front-loading but not enough to waste space.

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

Completeness3/5

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

For a creation tool with a large nested effects schema, no output schema, and existing annotations, the description covers the key relationships and permission gate. It omits what the call returns (e.g. the style handle needed for figma_apply_style_to_node) and name-collision/error behavior, leaving a visible gap in an otherwise adequate definition.

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

Parameters3/5

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

Schema coverage is 60%, so the schema documents several params (session, description, idempotencyKey, and most effect fields). The description's 'Same effect entries as figma_set_effects' is a valuable cross-reference for the complex 16-item effects array, but it adds nothing for name/description/session and doesn't fully compensate for the uncovered remainder.

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

Purpose4/5

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

It names the concrete resource (a local effect style, for shadows and blurs) and distinguishes itself implicitly from the paint/text/grid style creators. It stops short of a clean verb-first statement, opening with a noun phrase rather than 'Creates...', but an agent can still identify the artifact unambiguously.

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

Usage Guidelines3/5

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

The description routes the agent downstream ('nodes can then follow via figma_apply_style_to_node') and to the mutator ('change it later in place with figma_update_style'), which is useful related-tool framing. It never states when to choose this over figma_create_paint_style / figma_create_text_style / figma_create_grid_style, so the usage guidance is implied rather than explicit.

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

figma_create_ellipseCreate ellipseC
Idempotent

An ellipse with an optional fill. Editors: Design; unverified: FigJam, Slides.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
fillNo
nameNo
widthYes
heightYes
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
idempotencyKeyNoCaller-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

C2.1/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=false, so the safety profile is covered. The description adds only the editor-support caveat ('unverified: FigJam, Slides'), which is genuinely useful context, but says nothing about where the node is placed by default, how x/y behave, or what happens when parentId is omitted. For a mutation tool, that leaves 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.

Conciseness3/5

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

The description is short and front-loaded with the ellipse/fill fact, so there is no wasted prose. However, its brevity stems from under-specification rather than disciplined editing — it is too small for a 10-parameter creation tool, so the concision is not fully earned.

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

Completeness2/5

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

Given 10 parameters, 30% schema coverage, nested objects, a mutation hint in the annotations, and no output schema, the description should do far more work than two fragments. It omits the required-parameter contract, positional defaults, parent placement, and any relationship to sibling shape creators, leaving the agent to reconstruct the call from the schema alone.

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

Parameters2/5

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

Schema description coverage is only 30% across 10 parameters, so the description carries a real burden — yet it mentions only 'optional fill'. It never notes that width and height are required, nor explains x/y coordinates, parentId, name, or how sizing interacts with the created node. The nested sizing object and idempotencyKey are documented in the schema, but the remaining parameters are left to the agent's inference.

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

Purpose2/5

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

The description is a bare noun phrase, 'An ellipse with an optional fill,' which essentially restates the tool name figma_create_ellipse and title 'Create ellipse'. It never supplies a verb or says the tool creates a node in a Figma file, and it does nothing to distinguish itself from the many sibling create_* tools (create_rectangle, create_polygon, create_star). The editor availability note is the only non-redundant content.

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

Usage Guidelines2/5

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

The 'Editors: Design; unverified: FigJam, Slides' clause gives a weak environment hint about where the tool is supported, but there is no guidance on when to use this tool versus figma_create_polygon, figma_create_star, or the composite figma_create_shapes_with_text. No prerequisites (e.g., a target page or parent frame) are stated.

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

figma_create_frameCreate frameA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
gapNoSpace between items, px.
nameNoWhat it is, e.g. "Header", "Pricing card".
wrapNoWrap items onto new lines (horizontal layout only).
widthNoFixes the width. Omit to hug (auto-layout) — a plain frame defaults to 100.
alignXNoHorizontal alignment of the items.
alignYNoVertical alignment of the items. baseline (a row only) lines up text baselines, e.g. "$29 /mo".
heightNoFixes the height. Omit to hug (auto-layout).
layoutNoAuto-layout direction: horizontal = a row, vertical = a column.
rowGapNoSpace between wrapped rows, px. Needs wrap; default the gap.
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
paddingNoPadding: one number for all sides ("24"), or four comma-separated ("48,48,32,32") for top,right,bottom,left.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNoDefaults to the current page (in Slides: the focused slide).
backgroundNoOmitted: transparent inside another frame, white directly on the page.
alignContentNoHow wrapped rows share the height. Needs wrap.
clipsContentNoClip children at the frame edge. Default false (shadows stay visible).
cornerRadiusNo
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnly=false, idempotent=true, destructive=false). The description adds real behavioral context beyond them: auto-layout hugging on unsized axes, sizing:fill inheriting parent column width, wrapping rowGap defaulting to gap, and content not clipped unless clipsContent is true. It is solid, though it does not cover return behavior or failure modes.

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

Conciseness4/5

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

Front-loaded with the core concept, then progressively details layout, sizing, wrapping, clipping, and naming. Dense but every sentence carries usable information; the editor-support clause is the least essential but still useful for scope-setting.

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

Completeness4/5

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

For a 20-parameter mutation tool with nested objects and no output schema, the description covers the dominant workflows and defaults (sizing, wrap, clipping, background). Gaps remain around validation/error behavior and how it interacts with downstream styling tools, but the essential calling context is present.

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

Parameters4/5

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

Schema coverage is high (85%), so the baseline is 3; the description earns above that by tying parameters together (layout/gap/padding/alignX/alignY for auto-layout, rowGap needing wrap and defaulting to gap, sizing:fill semantics). It adds cross-parameter meaning rather than merely restating individual field docs.

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

Purpose4/5

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

States a specific verb+resource (create a frame) and explains its role as the structural building block, with concrete composition guidance ('one frame per section, row or card'). It does not explicitly distinguish itself from close siblings like figma_create_rectangle, figma_create_section, or figma_create_from_spec, so an agent still has to infer the boundary.

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

Usage Guidelines4/5

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

Gives clear context for use: build designs step by step, add content via parentId, and a note that editors are Design with FigJam/Slides unverified. It stops short of explicit when-not-to-use guidance or naming the alternative creation tools for plain shapes or sections.

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 specA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
specYesThe 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.
pageIdNoThe page to build on, at its top level, when no parentId is given. Not with parentId.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNoWhere to attach it: a frame, section, slide or page. Defaults to the current page (in Slides: the focused slide).
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), but the description adds substantial non-structural behavior: unknown fields are 'refused, never dropped'; a mid-way failure does NOT roll back and reports created[]/failedAt; idempotencyKey is needed for safe retry on large specs; and editor support is scoped (Design verified; FigJam/Slides unverified). This is far beyond what annotations convey.

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

Conciseness4/5

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

Dense but front-loaded: the capability statement comes first, then workflow, then grammar pointer, then the minimal shape, then failure/idempotency semantics, then editor scope. Every sentence carries operational value, though the grammar pointer plus inline example is slightly redundant.

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

Completeness5/5

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

For a complex single-call section builder with no output schema, this is complete: it gives the grammar source, a worked minimal example, the multi-call workflow, failure semantics, retry guidance, parent/page placement rules, and editor support. An agent could invoke it correctly without opening other docs.

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

Parameters3/5

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

Schema coverage is 100% and each of the 5 params has a schema description, so the baseline is 3. The description does add value by giving a minimal shape example, stating that an array of roots needs parentId or pageId, and explaining why idempotencyKey matters — but the core grammar is delegated to figma_get_guide rather than fully specified here.

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

Purpose5/5

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

States a specific verb+resource (build a whole section in one call) and enumerates exactly what it can produce — header, hero, card, grid, footer — plus the node types it supports. This clearly distinguishes it from the granular siblings like figma_create_frame, figma_create_text, figma_create_rectangle that build single nodes.

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

Usage Guidelines5/5

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

Explicit when-to-use workflow: '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.' It also states the alternative boundary — 'Not a whole page in one payload: a section at a time' — and points to figma_get_guide for the grammar, routing the agent precisely.

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 styleA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
gridsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
descriptionNoWhat the style is for — shown in Figma's style picker.
idempotencyKeyNoCaller-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

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly=false, idempotent=true, destructive=false), so the bar is lower. The description adds a real constraint not present in annotations: 'Editors: Design only', plus the 'local' scope of the style. It does not cover naming collisions or what the call returns, 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.

Conciseness4/5

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

Three dense sentences, each earning its place: definition, consumption path, alternative, then the editor restriction. Information is front-loaded. The jargon-heavy, clause-packed style costs it a point on readability but not on economy.

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

Completeness5/5

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

For a creation tool with no output schema, the description covers what is made, how it is consumed, what differentiates it from the raw-grid sibling, and the permission requirement. Combined with annotations that carry the idempotent/non-destructive profile, 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.

Parameters4/5

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

Schema description coverage is only 60%, but the description compensates by giving a worked example for the complex 'grids' entries ('12 columns, 24 gutter, 64 margin') and cross-referencing figma_set_layout_grids for the entry format. The top-level name/grids carry no schema description, so this added context is genuinely valuable, though session/description/idempotencyKey rely on the schema alone.

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

Purpose5/5

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

States a specific verb and resource: creating a 'local GRID style — a named layout grid'. It reinforces this with a concrete example ('12 columns, 24 gutter, 64 margin') and explicitly distinguishes itself from the sibling figma_set_layout_grids, which 'sets raw grids on frames instead'. An agent can tell it apart from the other style-creation siblings 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.

Usage Guidelines4/5

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

Explains the downstream consumption path ('frames follow via figma_apply_style_to_node { type: "grid" }') and names the alternative tool (figma_set_layout_grids) with the condition that separates them (reusable style vs raw grids). It lacks an explicit 'use this when / not when' framing, but the context is clearly stated.

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

figma_create_instanceCreate instanceA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
variantNoFor a set: which variant, e.g. "Size=Large, State=Hover". Default: the set's default variant.
parentIdNoDefaults to the current page (in Slides: the focused slide).
componentIdNoA COMPONENT or COMPONENT_SET id in this file.
componentKeyNoA published library component's key.
idempotencyKeyNoCaller-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.
componentSetKeyNoA published library component set's key.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety and retry semantics are covered. The description adds real behavioral context beyond them: a library component is imported first and then placed, and editor support varies. It stops short of describing what the call returns or where the instance lands by default, but the added side-effect disclosure is meaningful.

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

Conciseness4/5

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

Front-loaded with the core action and then layered with routing, the id-source rule, the exclusivity constraint, and platform support. Dense but every clause carries information; the only mild cost is that the exclusivity rule is buried mid-paragraph rather than stated up front.

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

Completeness4/5

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

For a 10-parameter mutation tool with no output schema and 80% schema coverage, the description covers the id-source workflow, the exclusivity constraint, the import side effect, and the sibling alternative. It does not say what the call returns (e.g. the new node id) or the default parent behavior, which are the remaining minor gaps given annotations already carry idempotency and safety.

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

Parameters4/5

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

Schema coverage is 80%, so the baseline is 3, but the description adds a constraint the schema does not encode: 'Give exactly one of componentId, componentKey, componentSetKey' (no oneOf in the schema). It also clarifies variant defaulting, which exceeds the schema's own description. That mutual-exclusivity rule is exactly the kind of semantics an agent cannot infer from structured fields.

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

Purpose5/5

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

States a specific verb (place) and resource (instance of a component/component set variant), enumerating the three modes of placement. It explicitly distinguishes itself from siblings figma_swap_component and figma_import_library_assets, 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.

Usage Guidelines5/5

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

Explicit routing: local ids come from figma_get_local_components, library components are imported then placed, and the alternative for changing an existing instance is figma_swap_component. It also names the required version support (Design; unverified FigJam/Slides), which is genuine 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_create_lineCreate lineA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
capNo
nameNo
angleNoDegrees, default 0.
colorNoDefault #000000.
lengthYes
weightNoStroke weight in px, default 1.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
dashPatternNoDash and gap lengths, e.g. [4, 4].
idempotencyKeyNoCaller-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

A4.2/5.0
Behavior4/5

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 tool. The description adds useful behavioral context beyond annotations: cap decorates both ends, a line keeps its length while a filled rectangle stretches, and editor compatibility is given.

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

Conciseness5/5

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

The description is dense but front-loaded, with use cases first and geometry details following in a logical order. Every sentence earns its place, including the auto-layout alternative and editor support note.

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

Completeness4/5

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

For a create tool with no output schema and annotations covering safety and idempotency, the description gives enough to invoke the core line creation correctly. It is missing some placement and styling details, such as default parent behavior, but remains largely complete for the primary use case.

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

Parameters3/5

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

The description explains key geometry and appearance parameters such as length, angle, cap, and the x/y origin, which adds meaning beyond the schema. However, with 12 parameters and only 50% schema description coverage, several parameters such as parentId, name, color, weight, dashPattern, and idempotencyKey are not covered or only partially covered by the description.

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

Purpose5/5

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

States a specific verb and resource ('Create line') and immediately lists concrete use cases: dividers, connectors, arrows, underlines, decorative strokes. It also distinguishes the tool from figma_create_rectangle for auto-layout dividers, so an agent can tell it apart from siblings.

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

Usage Guidelines4/5

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

The description explains when to use a line versus a rectangle in auto-layout contexts, and notes editor support for Design, FigJam, and Slides. It provides clear usage context but does not explicitly exclude or compare against other nearby tools such as figma_create_connectors or figma_create_vector.

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

figma_create_pageCreate pageB
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
activateNoSwitch to the new page. Default false.
idempotencyKeyNoCaller-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

B3.4/5.0
Behavior4/5

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

Annotations already declare it as a non-readOnly, idempotent, non-destructive write, so the bar is lower; the description nonetheless adds real context: the 3-page cap on free Starter files, the fact that Figma's own error is surfaced verbatim, and the plan-vs-bridge error provenance. That failure-mode and environment disclosure goes beyond the structured data.

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

Conciseness4/5

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

Very short, with no filler: the plan-cap warning, the error-provenance clarification, and the editor matrix each earn their place. The leading sentence fragment 'A new page.' is an awkward front-load but costs only a few words.

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

Completeness4/5

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

No output schema exists, but for a mutation tool whose annotations already carry the safety profile, the description covers the important ambient constraints (plan cap, error behavior, editor support). It omits whether/how the new page affects the current selection or file layout, which is a modest gap.

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

Parameters3/5

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

Schema coverage is 75%, with session, activate, and idempotencyKey all described in-schema, so the schema carries the parameter burden. The description adds no meaning about name (undocumented) or about how 'activate' interacts with the new page, so the baseline 3 fits.

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

Purpose3/5

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

The description opens with the fragment 'A new page.', which essentially restates the title 'Create page' rather than stating a verb + resource, and it never differentiates this from adjacent creation siblings like figma_create_slides or figma_create_section. The intent (create a page) is unambiguous once combined with the name/title, but the description itself contributes little.

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

Usage Guidelines3/5

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

The 'Editors: Design; unverified: FigJam, Slides' note gives implicit applicability guidance about where this call is safe, and the cap note tells you when it will fail. However, there is no when-to-use-vs-alternative guidance (e.g., use figma_get_pages to list, figma_navigate_page to switch) and no prerequisites stated beyond the plan cap.

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 styleA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
colorNoA solid colour. Give this or `fills`.
fillsNoSeveral paints or a gradient, entries as in figma_set_fills.
opacityNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
variableIdNoBind the first paint's colour to this COLOR variable.
descriptionNoWhat the style is for — shown in Figma's style picker.
variableNameNoOr the variable's full name, e.g. "color/bg/brand".
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

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

Annotations already carry the safety profile (non-readOnly, idempotent, non-destructive, closed-world). The description adds constraints the annotations do not: 'Editors: Design only' and the behavioral consequence that a style has no size, so gradient `angle` is exact only on a square node. It stops short of describing return shape or duplicate-name behavior.

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

Conciseness5/5

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

Front-loaded with the resource type, then dense but waste-free sentences covering binding, later editing, the gradient caveat and the editor restriction. Every sentence carries distinct information and nothing is padded.

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

Completeness4/5

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

For a 9-parameter tool with nested gradient objects and no output schema, the description covers the essential calling decisions plus key caveats and alternatives. Minor gaps remain (where the style lands, name-collision behavior), but nothing an agent strictly 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.

Parameters4/5

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

Schema coverage is 78%, so the schema does much of the work, but the description adds real meaning beyond it: it explains that `variableId`/`variableName` binds the FIRST paint's colour to a COLOR variable (a behavioral link not visible in the schema), and it flags the `fills`/gradient-angle caveat. It does not add meaning for name, session, opacity or idempotencyKey.

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

Purpose4/5

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

The description nails the resource and type: 'A local PAINT style', which cleanly separates it from figma_create_text_style, figma_create_effect_style and figma_create_grid_style. The creation verb is implied rather than stated (it opens with a noun phrase, not 'Creates...'), 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.

Usage Guidelines5/5

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

It routes the agent explicitly to alternatives with conditions: use figma_update_style to change the style later in place, and use figma_set_fills (or pass `transform`) when an exact CSS angle on a known node is needed, because a style has no size. That is precise when-to-use / when-to-use-something-else guidance.

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

figma_create_polygonCreate polygonA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
fillNo
nameNo
widthYes
heightYes
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
strokeNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
pointCountNoSides, default 3.
cornerRadiusNoRounds the outer corners.
strokeWeightNoDefault 1 when a stroke is given.
idempotencyKeyNoCaller-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

A3.7/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=false), so the description need not restate them. It adds useful editor-compatibility context that structured fields do not carry. However it says nothing about where the node lands (parentId/current page), what is returned, or what happens with an invalid parent, leaving gaps 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.

Conciseness5/5

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

Three dense fragments, no filler, and the core meaning (what shape, how the count maps, when to use it) comes first. The editor-compatibility note is placed last where it belongs. Nothing here could be cut without losing information.

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

Completeness3/5

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

For a 14-parameter mutation tool with no output schema and sub-half schema coverage, the description covers shape semantics and environment support but omits the return value, placement behavior (parentId vs current selection/page), and the practical role of idempotencyKey for retries. Annotations cover safety; the remaining operational gaps keep this at adequate rather than complete.

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

Parameters3/5

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

With only 43% schema description coverage across 14 parameters, the description is expected to compensate, and it partly does by mapping pointCount values to real shapes and pointing to figma_rotate_nodes for diamonds. But 13 of 14 parameters (fill, stroke, name, x/y, parentId, session, sizing, cornerRadius, strokeWeight) get no semantic help from the description; the schema carries the rest. Partial compensation only.

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

Purpose4/5

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

The description names the exact resource (a regular polygon) and enumerates concrete cases — triangle with pointCount 3, diamond with pointCount 4 plus figma_rotate_nodes — which is far more specific than the title 'Create polygon'. It implicitly separates the tool from sibling shape creators like figma_create_star, figma_create_ellipse and figma_create_rectangle, though it never names them. No explicit verb, but the intent (create a polygon node) is unmistakable.

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

Usage Guidelines4/5

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

Gives clear use-case context ('Badges, play buttons, decorative geometry') plus an environment note that it is supported in Design and unverified in FigJam/Slides, which is real selection guidance for editor choice. It also cross-references figma_rotate_nodes for the diamond case. What is missing is any when-not-to-use statement versus figma_create_vector or figma_create_star.

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

figma_create_rectangleCreate rectangleC
Idempotent

A rectangle with an optional fill, corner radius and stroke. Editors: Design; unverified: FigJam, Slides.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
fillNo
nameNo
widthYes
heightYes
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
strokeNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
cornerRadiusNo
strokeWeightNoDefault 1 when a stroke is given.
idempotencyKeyNoCaller-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

C2.7/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true, openWorldHint=false), so the bar is lower. The editor-compatibility note is genuine extra context not derivable from annotations, but the description says nothing about where the new node lands, permissions needed, or whether it fails outside Design — gaps for a creation tool.

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

Conciseness4/5

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

Two short sentences with no filler, and the property summary is front-loaded ahead of the platform note. The first sentence is a noun fragment rather than a statement of action, which costs a little clarity but not length.

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

Completeness2/5

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

For a 13-parameter creation tool with no output schema and sparse schema descriptions, the description is far too thin: it does not say what is returned (e.g. the created node id), where the rectangle is placed by default, or how required width/height interact with x/y. The context an agent needs to call this correctly is largely missing.

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

Parameters2/5

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

Schema description coverage is only 31% across 13 parameters. The description names three (fill, corner radius, stroke), which roughly repeats schema names rather than explaining them, and is silent on x/y coordinate semantics, parentId, sizing, name defaults, and units — the areas where the schema provides no description at all.

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

Purpose3/5

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

The name supplies the verb (create) and the description supplies the resource's properties (fill, corner radius, stroke), so the intent is recoverable. But the description itself is a noun fragment with no verb or scope statement, and it does nothing to separate this from its many shape siblings (figma_create_ellipse, figma_create_frame, 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.

Usage Guidelines2/5

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

The only usage-adjacent content is 'Editors: Design; unverified: FigJam, Slides', which is platform availability, not when-to-use guidance. There is no statement of when to pick this over figma_create_frame, figma_create_from_spec, or figma_import_svg, and no prerequisites (e.g. must a parent/page be selected first).

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

figma_create_sectionCreate sectionA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoIn the parent's coordinates.
yNo
fillNoBackground colour, e.g. #F5FBFF.
nameNoShort and navigational, e.g. "Brainstorm"; "" for none.
widthNoDefault 800.
heightNoDefault 600.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNoA page or a section. Defaults to the current page.
contentsHiddenNoHide what is inside, as FigJam's Hide contents. Default false.
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

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

Annotations already establish the safety profile (not read-only, idempotent, non-destructive), so the bar is lower. The description adds real behavioral context beyond them: platform verification status across Design/FigJam/Slides and the untitled-section behavior when `name` is empty.

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

Conciseness4/5

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

The conceptual definition is front-loaded before the alternative and the editor caveat, and every sentence carries information. The 'white wrapper, zones inside it, cards inside those' clause is slightly verbose but earns its place by conveying FigJam structural nesting.

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

Completeness4/5

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

With 10 optional params at 90% schema coverage and no output schema, the description fills the important gaps: what a section is, how it nests, when to prefer create_from_spec, and platform support. An agent can call it correctly without more prose.

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

Parameters4/5

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

Schema coverage is 90%, so the baseline is 3. The description goes beyond it by explaining that `name: ""` deliberately leaves the section untitled when an inner title text carries the label, and by interpreting `parentId` as allowing another section (nesting), adding semantics the schema only hints at.

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

Purpose4/5

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

The description defines the resource concretely (a section as the container designers use to organise a page by flow, and on FigJam the structural wrapper) and clarifies the nesting model via `parentId` = another section. It clearly distinguishes itself from figma_create_from_spec, though it never explicitly contrasts with sibling creators like figma_create_frame.

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

Usage Guidelines4/5

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

It gives an explicit routing rule: to fill a section and fit it to content in one call, use figma_create_from_spec with `arrange` and `hug`. It also flags editor compatibility (Design confirmed; FigJam/Slides unverified), which helps an agent decide whether to attempt the call. No explicit 'when not to use' for the plain-section case, but the alternative is named.

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)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoLeft edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content.
yNoTop edge, in the parent's coordinates.
gapNoSpace between shapes, px. Default 40.
shapesYes
columnsNoItems per row. Default: all in one row.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNoA section or frame to put it in (id or Figma link). Default: the current page.
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior4/5

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

Annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) already declare the mutation/idempotency profile, and the description does not contradict them. It adds useful behavior beyond them: the 1–200 batch limit, text auto-fitting unless width/height are supplied, and that a preset sets fill, stroke and text together. It stops short of describing the returned node ids an agent would need for downstream chaining.

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

Conciseness4/5

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

Dense but front-loaded: the core action and batch limit lead, followed by shape/color semantics, then layout and alternatives. No filler sentences, though the single-paragraph block is heavy and would scan better with structure.

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

Completeness4/5

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

For an 8-parameter creation tool with no output schema and 88% schema coverage, the description plus schema covers shape, color, sizing, layout and alternatives thoroughly. The main omission is any mention of what the call returns (node ids) for chaining into figma_create_connectors.

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

Parameters4/5

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

Schema coverage is 88%, so baseline is 3, but the description adds real meaning the schema lacks: it enumerates the `color` presets and their light- variants (the schema only calls them 'a coordinated preset'), lists concrete `shape` types, and clarifies that `label` produces a fixed-size 1–2 character circle marker. This substantially improves interpretation over the raw schema descriptions.

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

Purpose5/5

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

States a specific verb+resource with scope: FigJam shapes with text, flowchart/decision/database/callout use cases, 1–200 per call. It actively distinguishes itself from siblings by naming figma_create_stickies (layout), figma_create_connectors (joining), and figma_create_table (tabular data, 'never a grid of shapes').

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

Usage Guidelines5/5

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

Explicit alternatives and exclusions: join shapes with figma_create_connectors, use figma_create_table for rows/columns rather than a grid of shapes, and note that editors are unverified in FigJam and Slides. This routes the agent to the correct sibling for adjacent tasks.

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

figma_create_slidesCreate slidesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slidesYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.9/5.0
Behavior5/5

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

Annotations already declare non-read-only, idempotent, non-destructive, closed-world, but the description adds what annotations cannot: slides are created empty, the background fill must live on the slide because rows/grid carry no fill, all positions are validated atomically before the first slide is created, and it notes the editor restriction ('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.

Conciseness4/5

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

Front-loaded with purpose and workflow, then item semantics, return shape, and alternatives — a logical order with no filler. It is dense and slightly run-on in the 'Per item:' passage, and one clause is restated from the schema, but every sentence carries information.

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

Completeness5/5

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

Despite no output schema, the description states what is returned (each slide's id, row, col and index as read back), and it covers permissions, atomic validation, workflow chaining and sibling alternatives. Nothing an agent needs to invoke this correctly is missing.

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

Parameters5/5

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

With 67% schema coverage, the description meaningfully compensates: it explains that `row`/`col` are counted against the grid left by earlier items in the same call, that omitting both appends to the end of the deck, and that on an empty deck the first slide creates row 0 — semantics the schema only hints at. It also disambiguates `skipped` and the hex `background` placement. Minor overlap with the schema's own wording on row-count behavior.

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

Purpose5/5

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

States a specific verb, resource, cardinality and dimension: 'Add 1–20 empty 1920×1080 slides to a Figma Slides deck, in list order.' It explicitly distinguishes itself from figma_create_frame, figma_move_slides and figma_set_slide_grid, 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.

Usage Guidelines5/5

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

Gives the full intended workflow (create slides, then feed each via figma_create_from_spec with parentId = slide id, then verify with figma_check_layout at 3–5 slides per call) plus explicit exclusions and the sibling to use for each alternative case. It even states the anti-pattern to avoid ('Do not delete and rebuild slides to restyle a deck').

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

figma_create_slotCreate slotA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoe.g. "Content", "Actions".
widthNo
heightNo
layoutNoAuto-layout direction of the slot.
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
componentIdYesA COMPONENT, or one variant of a set.
idempotencyKeyNoCaller-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

A4.4/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the description does not need to restate safety. It adds genuine behavioral context beyond annotations: editor availability scoping (Design; unverified FigJam, Slides) and the validation rule that Figma refuses a grid layout on a slot. It stops short of describing return shape or failure behavior, so a 3 is appropriate given annotations carry the safety burden.

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

Conciseness5/5

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

Front-loads purpose, then preconditions, cross-tool routing, and environment scope in a dense sequence where every sentence carries new information. No filler or restatement of the name.

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

Completeness4/5

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

For an 8-parameter mutation with a nested sizing object and no output schema, the description covers purpose, valid input shape, layout constraint, follow-up tools, and editor scope. It omits anything about default sizing/layout behavior or what the call returns, minor gaps rather than blocking ones.

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

Parameters4/5

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

Schema coverage is moderately high (75%), so the baseline is 3, but the description adds meaning beyond the schema: the layout constraint ('Figma refuses a grid on a slot') sharpens an enum the schema only labels 'Auto-layout direction', and the componentId constraint ('not a set') adds an input rule the schema does not state. Width, height, and sizing are left entirely to the schema.

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

Purpose5/5

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

States a specific verb and resource ('Add a slot to a component') and immediately defines what a slot actually is (a frame each instance fills with its own layers, plus the SLOT property). This is enough for an agent to tell it apart from sibling node-creation tools like figma_create_frame or figma_convert_to_component 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.

Usage Guidelines5/5

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

Gives explicit preconditions and exclusions: 'Pass a component or one variant, not a set', slot filling happens via parentId in an instance, figma_reset_slot empties it, and figma_set_instance_properties cannot set a slot. This is concrete when/when-not guidance with named alternatives.

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

figma_create_starCreate starA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
fillNo
nameNo
widthYes
heightYes
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
strokeNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
pointCountNoSpikes, default 5.
innerRadiusNoDefault Figma's 0.38.
cornerRadiusNoRounds the outer corners.
strokeWeightNoDefault 1 when a stroke is given.
idempotencyKeyNoCaller-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

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so safety/idempotency is covered structurally. The description adds a genuine behavioral trait not in the annotations: platform support (verified in Design, unverified in FigJam/Slides). It says nothing about what node is returned or how conflicts are handled beyond what idempotencyKey already documents 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.

Conciseness4/5

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

Three dense sentences, front-loaded with the shape semantics before use cases and platform notes. Every clause carries information; no filler or repetition of the tool name.

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

Completeness3/5

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

For a 15-parameter mutation tool with no output schema and an openEnded nested sizing object, the description covers purpose, key geometry params, and editor constraints but leaves most parameters and the return shape undocumented. Adequate minimum viable context, with visible gaps.

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

Parameters3/5

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

Schema coverage is only 47% across 15 parameters, so the description would need to compensate more. It does add real interpretation for innerRadius (low = spiky, near 1 = polygon) and pointCount (spikes), which goes beyond the terse schema defaults, but x, y, fill, stroke, name, parentId, cornerRadius, strokeWeight, and sizing get no descriptive support.

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

Purpose4/5

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

The description states the resource precisely ('a star or burst') and defines its two defining parameters (pointCount spikes, innerRadius 0–1), which implicitly separates it from the sibling figma_create_polygon ('near 1 = almost a polygon'). The verb is carried only by the name/title, so it is clear but not fully self-contained.

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

Usage Guidelines4/5

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

It supplies concrete use cases (rating stars, sale bursts, sparkles, decorative shapes) and an editor-compatibility caveat ('Editors: Design; unverified: FigJam, Slides'), which tells the agent when this tool is applicable. It does not name an explicit alternative for regular polygons, so it stops short of full routing guidance.

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

figma_create_stickiesCreate stickies (FigJam)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoLeft edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content.
yNoTop edge, in the parent's coordinates.
gapNoSpace between stickies, px. Default 64.
columnsNoItems per row. Default: all in one row.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNoA section or frame to put it in (id or Figma link). Default: the current page.
stickiesYes
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

Annotations already cover safety (idempotent, non-destructive), but the description adds substantial extra behavior: Rows are laid out after text is measured so they never overlap, the parent is never resized and `parentOverflow` reports the overrun (routing to figma_fit_sections), and the editor/verification limitation is disclosed. These are non-obvious consequences an agent would otherwise discover only by testing.

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

Conciseness4/5

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

Dense but front-loaded: count range and grid layout come first, then sizing, color, layout knobs, overflow, and return shape. Most sentences carry unique facts, though the run-on construction around sizing and `wide` could be tightened without losing information.

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

Completeness5/5

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

No output schema exists, yet the description documents the return payload (created [{ index, id, x, y, width, height }] and bounds), which is exactly the gap that would otherwise be missing. Combined with editor constraints, overflow signaling, and layout rules, 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.

Parameters4/5

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

Schema description coverage is 88%, so the schema already documents most parameters and the baseline would be 3. The description still adds value: it clarifies that stickies are fixed-size (no width/height), that color names resolve to FigJam's exact swatches, and that `columns`/`gap` interact with the auto-measured layout rather than raw coordinates.

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

Purpose5/5

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

States a specific verb and resource (create FigJam sticky notes) plus the batch scope (1–200 per call). It actively distinguishes itself from siblings like figma_create_text by asserting 'Prompts, labels and instructions are text, not stickies,' 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.

Usage Guidelines4/5

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

Gives real selection guidance: use `wide` for about 100 words or more, and the note that prose belongs in text tools implicitly routes to figma_create_text. Also flags the 'Editors: FigJam only, unverified' constraint. It stops short of naming an explicit alternative tool or stating when not to use 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_create_storyboardCreate a storyboardA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoDefault: right of everything on the page.
yNo
bpmNoTempo: adds bar.beat per panel and lists panels that start off the beat.
fpsNoFrame rate the frame numbers use. Default 30.
snapNoRound each duration to whole frames (default), whole beats (needs bpm), or not at all. Changes are listed in `snapped`.
titleYesThe piece's name; the board is named Storyboard / <title>.
aspectYesOf every thumbnail and styleframe.
pageIdNoThe page to build on, at its top level. Default: the current page.
panelsYes
columnsNoCards per row. Default 6 (9:16), 5 (4:5, 1:1), 4 (16:9).
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
captionsNoCaption rows on every card, always in this order. Default: timecode, duration, and every row any panel fills.
thumbWidthNoThumbnail width in px; height follows the aspect. Default 216 / 288 / 300 / 384 by aspect.
beatsPerBarNoDefault 4. Needs bpm.
idempotencyKeyNoCaller-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.
styleframeWidthNoStyleframe width in px. Default 1080 (1920 for 16:9).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare idempotentHint=true and destructiveHint=false, but the description adds context annotations cannot: 'One undo step' (reversibility), editor support ('Design; unverified: FigJam, Slides'), and the shape of the returned diagnostics (panels starting off the beat, copy too brief to read). This is rich behavioral disclosure beyond the structured hints.

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

Conciseness4/5

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

Dense but front-loaded, leading with the artifact and workflow before edge notes. It is a single long paragraph that packs a lot of distinct facts (cards, captions, timing, diagnostics, alternatives, skill, undo), which earns its length but is slightly heavy to parse in one block.

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

Completeness5/5

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

With no output schema, the description still tells the agent what comes back (offBeat and readTime lists, styleframeId, snapped changes) and how to retry via idempotencyKey. For a 16-parameter write tool with 88% schema coverage, nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 88%, so the schema already carries most parameter meaning and the baseline is 3. The description still adds value by explaining timing derivation: durations are snapped to frames, bar.beat derived from bpm/fps, and the duration caption doubles as the retime control. It stops short of covering every parameter but clearly exceeds the schema-only baseline.

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

Purpose5/5

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

States a specific verb and resource ('Lay out a motion piece's storyboard') and immediately describes the concrete artifact: a board of cards in rows, one per panel, with thumbnails and caption rows. It distinguishes itself from close siblings by naming figma_set_keyframes and figma_create_animatic's domain (animation vs. planning), 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.

Usage Guidelines5/5

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

Explicit when-to-use and when-not: 'A plan, not an animation: figma_set_keyframes animates.' It also routes to figma_create_from_spec for sketching thumbnails and figma_get_guide for the storyboard skill, and warns to fix offBeat/readTime before building.

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)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoLeft edge, in the parent's coordinates. Default: below what the parent holds; on the page, right of its content.
yNoTop edge, in the parent's coordinates.
fillNoTable preset or hex.
nameNoLayer name.
rowsNoThe data, row by row; row 0 is the header.
headerNoStyle row 0 as a header. Default true with rows, false for an empty table.
weightNoFont weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold").
numRowsNoAn empty table: with numColumns, not with rows.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
fontSizeNo
parentIdNoA section or frame to put it in (id or Figma link). Default: the current page.
fontFamilyNo
numColumnsNo
rowHeightsNoOne height per row, px.
headerColorNoHeader preset or hex. Default black.
columnWidthsNoOne width per column, px.
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

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, yet the description adds real behavior: fills are never removed ("" is refused), columns cannot shrink below their minimum so actual widths come back, and editors are unverified in FigJam/Slides. These are non-obvious constraints the agent needs, though permission/auth and return-shape behavior are not covered.

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

Conciseness4/5

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

Front-loaded with the identification claim and the input-form rule, and every clause carries substance. It is dense and reads as one long run-on stream rather than a structured list, which slightly impairs scanning but wastes little.

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

Completeness4/5

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

For a 17-parameter tool with no output schema, the description supplies validation rules, defaults, form exclusivity, and the edit handoff, which is substantial. It leaves positioning, naming, parenting, and session parameters to the schema, which is acceptable given 82% coverage.

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

Parameters4/5

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

With 82% schema coverage the baseline is 3, but the description goes further than the schema by enumerating the header-color preset family (black, dark-gray, …, light-green) and explaining defaults and the rows-vs-numRows exclusivity. It adds genuine meaning for rows, header, fill, and sizing beyond the structured field text.

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

Purpose5/5

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

The description names the resource precisely ("A FigJam table") and pins its scope with "the tool for any row-and-column data, never a grid of shapes," which distinguishes it from shape-based siblings like figma_create_shapes_with_text. Combined with the create verb in the name/title, an agent can identify exactly what this produces.

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

Usage Guidelines4/5

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

It supplies an explicit when-not ("never a grid of shapes"), defines the two mutually exclusive input forms ("exactly one form"), and routes cell edits to figma_edit_table after creation. It stops short of naming all competing creation siblings, but the selection logic is clear.

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

figma_create_textCreate textA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
nameNoLayer name, e.g. "Title". Default: the text itself.
alignNo
colorNoDefault #000000 (in FigJam: #1E1E1E, the board's own text colour).
widthNoFixed width in px; the text wraps inside it.
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
weightNoDefault Regular (in FigJam: Medium, the board's own default).
contentYesThe text. Newlines are allowed.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
fontSizeNo
parentIdNoDefaults to the current page (in Slides: the focused slide).
fontFamilyNoDefault Inter.
lineHeightNo"auto", px ("24" or "24px") or percent ("150%"), as in figma_set_text_properties; above 0. A unitless value is px, never a multiplier.
letterSpacingNopx ("0.5") or percent ("-1%"), as in figma_set_text_properties. A unitless value is px.
idempotencyKeyNoCaller-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

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=true and destructive=false, so the safety profile is covered. On top of that the description discloses non-obvious behavior: the font fallback chain, a `fellBack: true` flag in the result, overflow behavior for unwrapped text, and editor support ('Design; unverified: FigJam, Slides'). That is meaningful added context beyond the annotations.

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

Conciseness4/5

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

Three dense sentences that are front-loaded with the placement rule and each carry distinct information. It is on the longer side but virtually every clause earns its place (layout, wrapping, font fallback, editor coverage).

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

Completeness4/5

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

For a 16-parameter mutation tool with no output schema and nested objects, the description covers the interlocking layout/sizing behaviors and even describes the returned font/`fellBack` signal. Remaining gaps (defaults for many parameters) are handled by the schema's own descriptions, so it is close to complete.

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

Parameters4/5

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

Schema coverage is 75%, so the schema carries most of the burden, but the description adds semantics for the trickiest parameters: how `parentId` places the node, how `align` is inherited from the parent column, how `width` triggers wrapping, and how the font is resolved. This goes beyond restating the schema.

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

Purpose4/5

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

The description makes clear it produces a text node and how it is placed ('placed into a frame by `parentId`'), which is a specific resource plus behavior. It stops short of differentiating itself from near siblings such as figma_create_shapes_with_text or figma_set_text, so the agent must infer which to pick.

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

Usage Guidelines3/5

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

It gives real usage context for the layout parameters — 'Inside a vertical auto-layout it fills the column', 'elsewhere give `width` for text that should wrap' — which tells an agent how to obtain the desired result. However, there is no when-to-use-this-tool-vs-alternatives guidance relative to the many text-related siblings, so routing is only implied.

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 styleA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseNo
nameYes
weightNoFont weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold").
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
fontSizeYesRequired: a text style with no size is not usable.
decorationNo
fontFamilyNoDefault Inter (create); the style's own family (update).
lineHeightNo"auto", px ("32") or percent ("150%"). A string, not a number.
descriptionNoWhat the style is for — shown in Figma's style picker.
letterSpacingNopx ("0.5") or percent ("-2%"). A string, not a number.
idempotencyKeyNoCaller-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.
paragraphIndentNopx of first-line indent.
paragraphSpacingNopx between paragraphs.

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, so the safety profile is covered. Beyond that, the description discloses real behavioral traits: the style is 'local' (not a shared/published library style), only Design editors can run it, and lineHeight/letterSpacing now reject bare JSON numbers — a concrete failure mode an agent would otherwise hit. It stays silent on collision behavior when a style of the same name already exists.

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

Conciseness3/5

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

The opening fragment 'A local TEXT style.' is not front-loaded with the action the tool performs, and the middle sentences are a dense em-dash run-on mixing formatting rules with option names. Content is relevant but not prioritized: the string-vs-number trap deserves the lead position rather than following an incomplete noun phrase. Mid-weight and functional but not tight.

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

Completeness3/5

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

For a 13-parameter create tool with no output schema and 77% schema coverage, the description covers the formatting param traps, the update path and the editor restriction reasonably well. The notable gap is the return value: since no output schema exists and the style must subsequently be applied via figma_apply_style_to_node, the agent is never told that an id/handle comes back to chain with. The idempotency key's retry semantics are left entirely to the schema.

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

Parameters3/5

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

Schema coverage is 77%, near the high band, so the schema already carries most parameter meaning — including the 'A string, not a number' warnings for lineHeight and letterSpacing that the description largely restates. The description adds a cross-reference to figma_set_text_properties and a use-case example ('upper for labels') but no new syntax or constraint information. Baseline 3 is appropriate for near-high coverage.

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

Purpose4/5

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

The text establishes a specific resource (a local TEXT style) and the title supplies the create verb; the phrase 'A local TEXT style.' alone is elliptical but unambiguous in combination. It distinguishes itself from siblings by pointing at figma_update_style for later in-place changes, separating create from update. It does not contrast with figma_create_paint_style, figma_create_effect_style or figma_create_grid_style, which are the nearest siblings.

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

Usage Guidelines3/5

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

'Change it later in place with figma_update_style' names one alternative and the condition selecting it, and 'Editors: Design only' states an environment restriction. However, there is no guidance on when to define a reusable style versus applying formatting directly via figma_set_text_properties, nor on when to publish to a library versus staying local. Usage is implied rather than explicit for the main create-vs-set decision.

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

figma_create_variableCreate variableA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
typeYes
valueYesThe value for the declared type: "#1a2b3c" for COLOR, "16" for FLOAT, "Inter" for STRING, "true" for BOOLEAN.
modeIdNoMode id or name. Defaults to the collection's first mode.
scopesNoWhich 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.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
codeSyntaxNoThe name in code per platform, e.g. { "WEB": "var(--color-bg-brand)" }. "" removes that platform.
descriptionNo
collectionIdYes
idempotencyKeyNoCaller-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.
hiddenFromPublishingNoHide it when the file is published as a library.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare the mutation/idempotency profile, and the description goes beyond them: duplicate names are refused, scopes are validated against the type with ALL_SCOPES standing alone, empty scopes hides a primitive, and mode manipulation requires a paid plan. These are runtime behaviors an agent cannot infer from readOnlyHint/idempotentHint.

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

Conciseness4/5

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

Front-loaded with the core action and value encoding, then alternatives and constraints. Dense but every clause carries load. The single-block packing of value formats, scopes, aliasing, and editor support makes it slightly heavy to scan compared to cleanly separated lines.

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

Completeness4/5

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

For an 11-param mutation with nested objects and no output schema, the description covers the high-risk semantics (duplicate refusal, type/scope validation, alias format, plan gating). It stops short of describing what is returned on success, but with no output schema that gap is minor and largely covered by the idempotencyKey retry contract.

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

Parameters4/5

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

Schema coverage is 64% and the description fills key gaps: per-type string encoding for `value`, the 'alias:<name or id>' reference syntax, and intended usage of `scopes` with concrete examples (["FRAME_FILL","SHAPE_FILL"], ["GAP"]). It adds meaning beyond the schema, though it does not touch modeId, idempotencyKey, or session, which the schema already documents.

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

Purpose5/5

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

Opens with a precise verb+resource framing ('One design token') and immediately delimits the scope: creates exactly one variable. It names the batch sibling figma_create_variables and the binding sibling figma_bind_variable_to_node, so an agent can separate it from near-neighbors 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.

Usage Guidelines5/5

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

Explicit routing rules: 'For a whole token set in one call use figma_create_variables', 'Bind one to nodes with figma_bind_variable_to_node', and the paid-plan constraint for 'extra modes (figma_add_variable_mode)'. It also states editor coverage (Design verified; FigJam/Slides unverified), which is actionable context for when this call is valid.

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 collectionA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
modesNoMode names, first is the default. Default ["Default"].
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.2/5.0
Behavior5/5

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), yet the description adds genuinely non-derivable behavior: the first mode is named after modes[0] or "Default" and never Figma's "Mode 1," extra modes are paid-plan gated, and a refused mode surfaces as a `warnings` entry rather than a silent drop. With no output schema, disclosing that warnings channel is especially valuable for an agent interpreting results.

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

Conciseness4/5

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

Roughly four dense sentences, all carrying usable facts, with the resource named up front. The em-dash asides and the "Mode 1" trivia are slightly conversational but earn their place by preventing a real naming mistake; the missing leading verb is the only structural blemish.

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

Completeness4/5

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

For a create tool with no output schema, the description covers naming behavior, plan limits, failure signaling, follow-up editing, and environment support. It only partially addresses what a successful result looks like (it references "the result" and `warnings` but never says a collection is returned/identified), which is a minor gap.

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

Parameters4/5

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

Schema coverage is 75%, so the schema already carries most parameter meaning (notably the idempotencyKey retry semantics). The description adds real interpretation of `modes` beyond its schema text — the default naming rule and the "Mode 1" pitfall — though it says nothing extra about `session` or `idempotencyKey`.

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

Purpose4/5

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

The opening identifies the artifact created — "A new variable collection" — and glosses it helpfully as "a token group," so an agent knows this is a creation tool for a Figma variable collection rather than a variable itself. It does not open with an explicit verb ("Creates"), and it only loosely distinguishes itself from siblings by pointing to figma_update_variable_collection.

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

Usage Guidelines4/5

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

It routes the agent for follow-up work ("Rename or remove modes later with figma_update_variable_collection") and states environment scope ("Editors: Design; unverified: FigJam, Slides"). There is no explicit when-not or prerequisite statement, but the alternative and the plan constraint are named.

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

figma_create_variablesCreate variablesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
ifExistsNoDefault "error".
variablesYes
collectionIdYesThe collection, from figma_get_variable_defs or figma_create_variable_collection.
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

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

Annotations cover readOnly=false, idempotent=true and destructive=false, but the description adds substantially more: atomic validation ('Everything is checked before the first variable exists, so a refusal creates nothing'), the 200-per-call cap with pacing, alias ordering/type constraints, and editor availability (Design verified; FigJam/Slides unverified). No contradiction with the idempotency annotation.

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

Conciseness5/5

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

Front-loaded with the core operation and then proceeds through values, atomicity, ifExists, limits, sibling routing and editor support in one dense but waste-free passage. Every sentence carries information an agent needs; nothing is padding.

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

Completeness4/5

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

Covers atomicity, failure semantics, ordering constraints, rate/limit behavior and idempotency-key retry semantics, which is thorough for a 5-param mutation with no output schema. The only real gap is that it never says what a successful call returns (e.g. created variable ids) that follow-up alias or bind calls would need.

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

Parameters4/5

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

Schema coverage is already 80%, so the baseline is 3, but the description adds cross-parameter meaning the schema cannot: alias targets must exist already or appear EARLIER in the same call with the same type, and ifExists governs what an existing name does. Value string formats largely restate the schema, hence not a 5.

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

Purpose5/5

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

States a specific verb and resource with scope: 'A token set in ONE call (one undo step)' that creates primitives then aliasing semantic tokens. It explicitly distinguishes itself from the sibling figma_create_variable ('For one variable figma_create_variable is enough'), so an agent can route correctly 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.

Usage Guidelines5/5

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

Names the alternatives and the conditions selecting them: use figma_create_variable for a single variable, figma_set_variable_properties to change properties later. It also spells out the ifExists decision (error/skip/update) and the ordering rule for aliases, which is exactly the guidance needed before calling.

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

figma_create_vectorCreate vectorA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
fillNo
nameNo
pathYese.g. "M0 40 C 60 0, 120 80, 180 40 L180 80 L0 80 Z".
widthNo
heightNo
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
strokeNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
strokeWeightNo
idempotencyKeyNoCaller-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

A4.4/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false). The description adds editor-compatibility context (Design verified; FigJam/Slides unverified), which is genuinely behavioral and not in the annotations. It does not, however, describe placement/parenting behavior or what happens with the created node beyond creation.

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

Conciseness5/5

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

It is front-loaded with the core purpose, then progressively adds parameter guidance, the alternative tool, and editor support. Every sentence carries distinct, non-redundant information with no filler.

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

Completeness4/5

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

There is no output schema, and the description never claims to explain return values, which is appropriate. For a 13-parameter mutation tool with only 31% schema coverage it still leaves positioning/parenting and sizing semantics unexplained, but it covers purpose, key parameters, alternative routing, and editor scope well enough to call the tool correctly in the common case.

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

Parameters3/5

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

Schema coverage is only 31%, so the description is expected to compensate. It does add real meaning for `path` (SVG `d` syntax and the allowed command letters), `width`/`height` scaling with aspect-ratio preservation, and stroke/fill interaction. But with 13 parameters, several (x, y, name, sizing, session, parentId, strokeWeight) get no semantic help, leaving the coverage gap only partially filled.

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

Purpose5/5

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

The description states a precise verb+resource - drawing an arbitrary shape from SVG path data - and illustrates it with concrete use cases (blob, wave divider, arrow, logo mark, chart line). It explicitly differentiates from the sibling figma_import_svg, so an agent can pick between 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.

Usage Guidelines5/5

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

It gives an explicit alternative with the condition that selects it: 'For a whole SVG file (an icon) use figma_import_svg.' It also states a usage rule for stroke-vs-fill ('Give `stroke` without `fill` for an open line') and notes which editors are verified vs unverified, so both the routing and the applicability are covered.

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 propertyA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
propertyYesIts name ("Label") or full key ("Label#2:0").
componentIdYesThe COMPONENT or COMPONENT_SET (a variant id is redirected to its set).
idempotencyKeyNoCaller-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

A4.9/5.0
Behavior5/5

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

Annotations declare destructiveHint and idempotentHint, but the description adds the crucial blast radius that annotations cannot: every instance loses the property, overrides included. That is exactly the kind of context an agent needs before a destructive call, plus per-type eligibility and editor-support caveats.

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

Conciseness5/5

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

Three compact sentences, zero filler: the effect, the exception, and the alternative tool, followed by the editor-support note. The destructive consequence is front-loaded rather than buried.

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

Completeness5/5

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

For a destructive, no-output-schema tool with four params fully documented in the schema, the description covers what remains: destructiveness scope, which property types are legal, the VARIANT exception, the alternate tool, and platform support. Nothing an agent needs to call it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds semantic value beyond the schema: it names the four valid property types and clarifies that VARIANT is rejected, and it explains the relationship between a component and its component set that the schema only hints at. It does not add format details for the property key, but the schema already does.

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

Purpose5/5

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

States a specific verb (Delete) and resource (component property), enumerates the exact deletable property types (TEXT, BOOLEAN, INSTANCE_SWAP, SLOT), and explicitly carves out the exception (VARIANT) that an agent would reasonably assume was deletable. It also names the sibling figma_edit_component_property for the adjacent operation.

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

Usage Guidelines5/5

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

Gives a clear when-to-use (delete a property), a when-not with a named alternative (VARIANT cannot be deleted, rename variants instead), and routes to figma_edit_component_property for rename/rewire. Also states editor support (Design verified; FigJam and Slides unverified), which is a usage constraint.

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

figma_delete_nodesDelete nodesA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.7/5.0
Behavior5/5

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

Goes well beyond the destructive/idempotent annotations: partial-failure semantics ('one node failing does not fail the call'), the Ctrl+Z revert behavior, the slide-row refusal rule, and the emptiedRows side effect. This is exactly the operational context annotations cannot convey.

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

Conciseness5/5

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

Front-loads the core action and usage before edge cases and return format. Every sentence carries distinct operational value with no filler.

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

Completeness5/5

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

With no output schema, the description supplies the return shape (items: [{ id, ok, error? }]) and per-item failure behavior. Combined with the destructive annotation and slide edge cases, 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.

Parameters4/5

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

Coverage is 67% with session and idempotencyKey already documented in schema. The description compensates for the undocumented nodeIds by explaining its expected source ('the ids the create call returned'), adding real meaning beyond the bare array type.

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

Purpose5/5

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

States a specific verb and resource ('Delete nodes by id') and distinguishes itself functionally from the similarly-named figma_undo_step by framing itself as 'the correct way to undo agent work.' An agent can tell what it does and why it would choose it over a generic undo.

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

Usage Guidelines4/5

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

Gives explicit when-to-use context ('pass the ids the create call returned') and a concrete precondition (delete slides before deleting a slide row that still holds slides). It stops short of naming the alternative figma_undo_step or stating when NOT to use deletion, so it is clear but not a full comparison.

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

figma_delete_styleDelete stylesA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
styleIdsYes
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior5/5

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

Adds real behavior beyond annotations: dependent nodes 'keep the values it gave them' (the actual consequence of destruction), per-item partial-failure semantics ('one node failing does not fail the call'), and editor scope. This is substantive context that annotations alone (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.

Conciseness5/5

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

Punchy and front-loaded with verb+resource first, then dependency effect, id source, return shape, and editor scope. Every 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.

Completeness5/5

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

Despite no output schema, the description documents the return shape (items array with id/ok/error), partial-failure behavior, the side effect on dependent nodes, and editor availability. 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.

Parameters3/5

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

Schema coverage is 67% and the schema already documents idempotencyKey richly; the description reinforces styleIds ('by id') and its source. It does not mention the session parameter, so it only partially compensates for the coverage gap — baseline 3 is appropriate.

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

Purpose5/5

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

Names a specific verb (delete) and resource (local styles: paint, text, effect, grid) with the keying method (by id). It clearly distinguishes itself from siblings like figma_update_style and figma_create_*_style.

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

Usage Guidelines4/5

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

Provides a prerequisite pointer ('figma_get_styles lists ids') and editor availability ('Editors: Design; unverified: FigJam, Slides'), which tells the agent where the tool works. It lacks an explicit when-not-to-use or a named destructive alternative, 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_delete_variableDelete variablesA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
variableIdsYese.g. ["VariableID:1:2"].
idempotencyKeyNoCaller-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

A4.7/5.0
Behavior5/5

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

Adds real behavior beyond the annotations: bound nodes retain their last resolved value, results are per-item with a partial-failure contract ('one node failing does not fail the call'), and editor support is qualified. Annotations only flag destructive/idempotent; the description explains the actual blast radius and failure semantics.

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

Conciseness5/5

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

Five short sentences, front-loaded with purpose, then side effects, id sourcing, return contract, and environment scope. Each sentence carries distinct information with no repetition of the name or annotations.

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

Completeness5/5

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

With no output schema, the description supplies the return shape (`items: [{ id, ok, error? }]`) and partial-failure behavior, plus the critical side effect on bound 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description still adds value: it establishes that deletion is keyed by id and names the tool that produces those ids, tying variableIds to a concrete source. The idempotencyKey's retry semantics are left to the schema, which already documents them thoroughly.

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

Purpose5/5

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

States a specific verb and resource ('Delete variables (design tokens) by id'), and the parenthetical disambiguates variables from other deletable Figma objects such as styles or variable collections. An agent can tell it apart from siblings like figma_delete_variable_collection 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.

Usage Guidelines4/5

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

Gives clear operational context by pointing at figma_get_variable_defs as the way to obtain valid ids, and states the editor scope where the call is supported. It stops short of explicit when-not guidance (e.g., collections belong to figma_delete_variable_collection), so it is not a full 5.

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

figma_delete_variable_collectionDelete variable collectionA
DestructiveIdempotent

Delete a variable collection together with every variable in it. Editors: Design; unverified: FigJam, Slides.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
collectionIdYes
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

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, but the description still adds real value by disclosing the cascade: every contained variable is destroyed, not just the collection. It does not say whether the operation is undoable or how it fails when the collection is missing.

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

Conciseness5/5

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

Two sentences, no filler, with the destructive scope front-loaded ahead of the platform note. Every clause carries information an agent can act on.

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

Completeness4/5

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

For a destructive, non-read-only tool with no output schema, the description covers the essential risk (cascading variable loss) and environment applicability. Minor gaps remain around failure behavior and reversibility, but the annotations plus schema cover retry/idempotency adequately.

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

Parameters3/5

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

Schema coverage is 67%: session and idempotencyKey are well documented in the schema, but collectionId has no description anywhere, and the description adds no syntax, format, or lookup guidance for it. Nothing beyond the structured fields is contributed, so the baseline 3 fits.

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

Purpose5/5

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

Specific verb (Delete) plus resource (variable collection) plus scope of the effect ('together with every variable in it'), which cleanly separates it from figma_delete_variable and figma_delete_style. An agent can pick this out of the large sibling list without opening the schema.

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

Usage Guidelines3/5

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

The 'Editors: Design; unverified: FigJam, Slides' note gives platform applicability, which is useful context, but it never says when to choose this over figma_delete_variable (single variable), figma_update_variable_collection, or figma_undo_step. Usage is implied by the verb 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_detach_instanceDetach instanceA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.1/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, but the description adds meaningful detail beyond them: the operation cannot be re-attached, the frame receives a new id, partial failures are isolated per item, and editor coverage is noted. Auth/permission requirements and rate limits remain unmentioned.

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

Conciseness5/5

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

Four tight sentences, front-loaded with the core effect before the caveats, return shape, failure semantics, and editor scope. No sentence is filler.

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

Completeness5/5

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

With no output schema, the description still conveys the return shape (items with id/ok/error), irreversibility, partial-failure behavior, and platform applicability. 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.

Parameters3/5

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

Schema coverage is 67%: session and idempotencyKey are self-documented in the schema, while nodeIds has no description. The description's "per item" framing weakly implies a list input but adds no real semantics for nodeIds, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb ("Detach") plus resource ("instances") plus the concrete outcome ("into plain frames that no longer follow their component"). This is precise enough to distinguish it from siblings like figma_create_instance and figma_swap_component.

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

Usage Guidelines3/5

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

The description clarifies the effect and that it is irreversible, and names supported editors, but gives no explicit when-to-use or when-not-to-use guidance relative to alternatives. Usage is only implied by the described outcome.

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

figma_download_assetsDownload assetsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dirNoDirectory for the files. Defaults to the export directory.
scaleNoRaster scale for those renders, default 2. Ignored for SVG/PDF.
formatNoRender format for nodes with no export presets. Default PNG.
nodeIdsYesNodes (ids or Figma links) whose assets to write.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
rawImagesNoAlso write the original bytes of image fills. Default true.
useExportSettingsNoUse each node's own export presets when it has any. Default true.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 propertyA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoA new name.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
propertyYesIts name ("Label") or full key ("Label#2:0").
bindNodeIdsNoLayers inside the component to drive with this property.
componentIdYesThe COMPONENT or COMPONENT_SET (a variant id is redirected to its set).
defaultValueNoText, "true"/"false" for BOOLEAN, a component id for INSTANCE_SWAP.
unbindNodeIdsNoLayers to stop driving.
idempotencyKeyNoCaller-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.
preferredValuesNoINSTANCE_SWAP / SLOT: component or component-set ids offered first. [] clears them.

TDQS

A4.5/5.0
Behavior4/5

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, openWorld=false), so the bar is lower. The description adds real behavioral context beyond that: pre-flight validation rules ('no default for VARIANT or SLOT, preferredValues only on INSTANCE_SWAP and SLOT'), variant-id redirection to the set, and the fact that a rename changes the key and returns it. It stops short of describing what happens to layers left bound or the response shape.

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

Conciseness4/5

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

Front-loaded with the core action, then constraints, then alternatives — a sensible ordering with no filler sentences. The opening sentence is dense with parentheticals, which slightly taxes 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.

Completeness4/5

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

For a 9-parameter, no-output-schema mutation tool it covers the essentials: what changes, validation rules, sibling routing, and editor support. The remaining gap is that it does not describe the returned result beyond noting the key is returned, but an agent has enough to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description contributes cross-parameter semantics the schema cannot: bind/unbind nodeIds are 'matched by name path in every variant of a set', a variant id is redirected to its set, and defaultValue/preferredValues carry type-level constraints. This meaningfully extends rather than repeats the schema.

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

Purpose5/5

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

States a precise verb+resource ('Change a component property that already exists') and enumerates the concrete mutation modes (rename, default change, preferred components, bind/unbind layers). It explicitly names the sibling tools it is not (figma_add_component_property, figma_set_instance_properties), so an agent can separate it from the nearest alternatives 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.

Usage Guidelines5/5

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

Gives explicit routing: 'To add a property use figma_add_component_property; to change one instance's value, figma_set_instance_properties.' It also scopes applicability by editor ('Editors: Design; unverified: FigJam, Slides'), covering both when-to-use and when-an-alternative-applies.

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)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
connectorsYes
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is partly covered. The description adds meaningful non-annotation behavior: full pre-validation before the first change, per-item error handling for missing/non-connector nodes, and per-item result returns, though it doesn't restate idempotency or describe retry semantics beyond the schema.

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

Conciseness5/5

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

Front-loads the purpose, then lists editable fields, then behavioral guarantees, then the editor constraint. Dense but every clause carries usable information with no filler.

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

Completeness5/5

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

With no output schema, the description still specifies the return shape ('per-item results') and the error model, plus the atomic validation order and the FigJam-only editor scope. An agent has everything needed to invoke it correctly inside a batch.

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

Parameters4/5

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

Schema coverage is 67%, so the schema documents most fields itself. The description adds value by cross-referencing the `from`/`to` endpoint string format to figma_create_connectors and grouping the editable properties (label, lineType, caps, color, weight, dash, labelBackground) into a coherent set, going slightly beyond a pure restatement.

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

Purpose5/5

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

States a specific verb and resource ('Change existing FigJam connectors in place') with scope (1–200 per call) and enumerates exactly which properties can be edited. The cross-reference to figma_create_connectors for the endpoint string format clearly distinguishes it from the sibling that creates connectors.

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

Usage Guidelines4/5

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

Explains that the tool edits existing connectors in place and that ids stay stable, so it 'runs inside figma_batch', and points to figma_create_connectors for the endpoint syntax. It gives clear context but stops short of stating explicit when-not-to-use conditions or naming a fuller set of alternatives.

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)A
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cellsNo
nodeIdYesThe TABLE.
moveRowNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
moveColumnNo
removeRowsNo
rowHeightsNo
columnWidthsNo
insertRowsAtNo
removeColumnsNo
idempotencyKeyNoCaller-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.
insertColumnsAtNo

TDQS

A4.7/5.0
Behavior5/5

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

Far exceeds the annotations: it specifies the atomic ordering of operations, that all indices are validated against table size before anything changes, that removed row/column content is lost, that removing every row/column is refused, the 2000-cell cap, the empty-string fill rejection, and the return shape. It also notes editor-verification status for FigJam and Slides, which the annotations 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.

Conciseness4/5

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

Dense but almost every clause carries technical content needed for 12 parameters, and the core action is front-loaded. It is delivered as one run-on block rather than scannable bullet points, which slightly hurts structure for such a complex signature.

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

Completeness5/5

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

For a 12-parameter, no-output-schema, low-coverage mutation tool, the description is remarkably complete: it covers operation ordering, index validity, destructive consequences, refusal cases, cell format, and the return payload ('new size and per-cell results'), leaving no material gap for an agent to call it correctly.

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

Parameters5/5

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

Schema description coverage is only 25%, so the description must carry the load and does: it defines cells as 0-based {row, column} with no ids, explains insert positions are post-removal and that each entry appends one, defines move {from, to} and the [{index, width|height}] shape, and documents fill/textColor value domains and the "#FFFFFF" reset rule.

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

Purpose5/5

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

States a specific verb (Change) and resource (a FigJam table's structure and cells), which cleanly separates it from the sibling figma_create_table. An agent can tell it edits an existing table rather than creating one without opening the schema.

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

Usage Guidelines4/5

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

The context of use is clear — this is the tool for mutating an existing FigJam table's structure and cells — and the description implies creation is a different operation. However, it never explicitly names figma_create_table as the alternative or states when-not to use this tool, so it stops short of full routing guidance.

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

figma_export_frames_to_pdfExport frames to PDFA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
deckNoFigma Slides: true exports every slide of the deck, in order, instead of nodeIds.
nodeIdsNoFrames to export, in page order. Not with `deck`.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
outputPathYesWhere to write the merged PDF. Same path rules as `figma_export_node`'s `saveTo`.
includeSkippedNoWith deck: also the slides skipped in the presentation. Default false.

TDQS

A4.2/5.0
Behavior4/5

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

With readOnlyHint/openWorldHint/destructiveHint already declared, the description still adds real behavior: rendering is done plugin-side and merging bridge-side, ordering is preserved, and unrenderable frames are surfaced in failed[] with no silent substitution. The gap is that the result shape and session-selection behavior are only partially characterized, and with no output schema the description carries that burden.

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

Conciseness5/5

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

A single dense paragraph, front-loaded with the core behavior and then the deck-mode special case and failure policy. Every sentence carries distinct information; nothing is redundant with the title or annotations.

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

Completeness4/5

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

For a 5-parameter tool with no output schema, the description covers ordering, the deck variant, and the failure contract (failed[]), which is what an agent most needs. It stops short of enumerating the full return payload or session disambiguation rules, leaving a small completeness gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3; every parameter (deck, nodeIds, session, outputPath, includeSkipped) is already documented inline. The description mostly restates the schema's semantics (nodeIds ordering, deck override, includeSkipped skip handling) rather than adding new syntax or format detail.

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

Purpose5/5

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

States a specific verb (export), resource (frames), and output format (one multi-page PDF, one frame per page), and explicitly names the ordering source (nodeIds). It is readily distinguishable from sibling exporters like figma_export_node, figma_save_screenshots, and figma_export_video because it names the multi-page PDF artifact.

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

Usage Guidelines4/5

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

It gives a clear conditional rule for the deck-vs-nodeIds fork ('In a Figma Slides file, deck: true instead exports every slide'), which is the main usage decision. However, it never names alternative export tools (figma_export_node, figma_save_screenshots) or states when NOT to use this tool, so guidance is contextual but not routing-complete.

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 nodeA
Read-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. Skill: critique (figma_get_guide). For files a codebase ships (presets, original images), use figma_download_assets.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoExact pixel scale for PNG/JPG; bypasses the size cap.
formatNoPNG (default), JPG, SVG or PDF.
nodeIdNoThe node to render: an id ("12:34") or a Figma link. Default: the one selected layer.
saveToNoWrite to this file instead of returning the render inline.
maxSizeNoLongest side in pixels for PNG/JPG (never upscales). Default 1024 inline.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only carry the read-only/safe profile, but the description adds substantial behavioral detail beyond them: the ≤5 MB inline threshold, the 1024 px inline cap, the `capped` signal, cross-parameter defaults (format vs saveTo extension), and the BRIDGE_EXPORT_ROOTS requirement for write locations. This is rich disclosure about side effects and limits that the annotations 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.

Conciseness4/5

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

Front-loaded with the core purpose, and nearly every clause adds functional information. It is a dense single paragraph with many parenthetical asides, which is slightly heavy to scan, but it avoids padding and repetition.

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

Completeness5/5

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

Despite no output schema, the description explains what comes back in each mode (inline image with bounds and pixel size, SVG markup, or a written file path). Combined with the coverage of defaults, limits, and path rules, 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.

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all six parameters (baseline 3). The description goes further by explaining cross-parameter interactions the schema cannot: scale bypassing the size cap, format being inferred from the saveTo extension when omitted, relative saveTo destinations, and nodeId defaulting to the selected layer.

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

Purpose5/5

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

States a specific verb+resource ('Render a node') plus the intent ('so you can see it — the screenshot to compare against'), making the purpose immediately actionable. It also distinguishes itself from siblings by name (figma_export_video for motion, figma_download_assets for shipped files), 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.

Usage Guidelines5/5

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

Explicit when-to-use vs alternatives: animated frames render at rest, so use figma_export_video then figma_review_video for motion; for files a codebase ships use figma_download_assets. It also names the relevant skill (critique via figma_get_guide). Nothing is left to inference.

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

figma_export_videoExport an animation as videoA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNoMP4/WEBM 12, 24, 30 (default), 60; GIF 8, 12, 15 (default), 24, 30.
waitNoSeconds 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.
finalNotrue 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.
jobIdNoLetters, digits, . _ -. With `nodeId`: your name for this render. Alone: collect or poll that render.
scaleNo0.5, 0.75, 1 (default), 1.5, 2, 3 or 4.
widthNoOutput width in px; height follows the aspect ratio.
cancelNoWith `jobId` only: drop that render. Figma finishes a render it has begun; its result is discarded.
formatNoDefault MP4, or what the saveTo extension implies.
framesNoSeconds to return as PNG stills, each mapped to its nearest frame, e.g. [0, 0.4].
heightNoOutput height in px; width follows the aspect ratio.
nodeIdNoThe animated top-level frame, or any layer inside it (id or Figma link). Starts a render; omit it to collect one by `jobId`.
saveToNoFile to write, .mp4 / .gif / .webm. Same path rules as figma_export_node's saveTo.
qualityNoMP4/WEBM only. Default HIGH.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
loopCountNoGIF only: 0 loops forever (default).
frameIndicesNoFrames to return as PNG stills, exactly: frame k is the timeline at k / fps. Not with `frames`.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 textA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
findYes
regexNoTreat `find` as a regular expression. Default false.
scopeNoDefault "page".
nodeIdNoSubtree root when scope is "subtree".
replaceYesThe new text; "" deletes each match.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
includeCodeNoAlso replace inside code blocks' code. Default false.
caseSensitiveNoDefault true.
idempotencyKeyNoCaller-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

A3.6/5.0
Behavior4/5

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

Goes beyond the annotations by disclosing that other styled runs are preserved, that results are per-item (items: [{id, ok, error?}]) so one failure does not fail the whole call, and notes editor support with FigJam/Slides unverified. These are meaningful behavioral traits not carried by the annotations.

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

Conciseness4/5

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

The purpose is front-loaded and the paragraph is dense but mostly earns its place. It is somewhat packed with parenthetical asides, but not padded or repetitive.

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

Completeness4/5

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

For a 9-parameter mutation tool with no output schema, the description covers return shape, partial-failure semantics, scope mechanics and editor compatibility. It leaves minor gaps (e.g., regex/case-sensitivity interaction, auth needs) but is largely complete.

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

Parameters4/5

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

With schema coverage at 89% the baseline is 3, but the description adds genuine value by documenting the table `cell` "row,column" coordinate format and the includeCode behavior on code blocks, details not present in the schema properties.

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

Purpose4/5

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

States a clear verb+resource (find and replace across text) and enumerates the node types covered, including TEXT nodes, stickies, shapes, connector labels and table cells. It is distinguishable from bulk-rename or set_text siblings, though it never explicitly names an alternative tool.

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

Usage Guidelines2/5

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

The description lists scope options (page/selection/subtree) but offers no explicit when-to-use or when-not-to-use guidance, nor does it name an alternative tool. The agent must infer appropriate contexts on its own.

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 contentA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYesSECTION ids.
paddingNoPadding: one number for all sides ("24"), or four comma-separated ("48,48,32,32") for top,right,bottom,left.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
minWidthNo
minHeightNo
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

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

Annotations only cover the safety profile (non-readonly, idempotent, non-destructive); the description goes well beyond them with ordering semantics (inner-first so outer sections fit final inner sizes), child-movement rules, the fact that connectors never move and follow their ends, empty-section handling with a note, and the min-width/height floor.

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

Conciseness4/5

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

Front-loaded with the core action and every sentence carries distinct information (defaults, ordering, edge cases, exclusions, return shape). It is dense to the point of being crowded, and the trailing 'Editors: unverified in Design, FigJam, Slides' is terse enough to be slightly ambiguous, but there is no filler.

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

Completeness5/5

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

With no output schema, the description still tells the agent what comes back ('per-section results with the new size'), and it covers the mutation's side effects, edge cases, and environment limitations. For a 6-parameter batch mutation tool, nothing needed to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 67% and minWidth/minHeight have no schema description at all; the description compensates by stating the 'never below minWidth / minHeight' semantics. It also supplies the concrete default ('32') and a realistic four-value example ('68,60,100,80') that clarifies the padding format beyond the schema's generic wording.

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

Purpose5/5

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

Opens with a specific verb+resource+scope: 'Resize sections to hug what they hold plus `padding`'. It also explicitly distinguishes itself from the sibling that would otherwise be confused with it ('A size you choose: figma_resize_nodes'), so an agent can route correctly 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.

Usage Guidelines5/5

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

Gives explicit when-not guidance ('Do not fit a participatory zone sized for the activity, or one of a grid of equal sections') and names the alternative tool for the manual-sizing case. It also states the supported editors, which is a real selection condition.

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

figma_flatten_nodesFlattenA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

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

Annotations cover safety/idempotency, and the description adds real domain behavior: the shared-parent requirement, the undo limitation ('Cannot be undone except with Ctrl+Z'), and editor support scope (Design only, FigJam/Slides unverified). The undo caveat sits slightly in tension with destructiveHint=false but is reconcilable since Ctrl+Z restores state.

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

Conciseness5/5

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

Three tight sentences, front-loaded with what the tool does, then the precondition, then the irreversibility warning and platform scope. No filler or restatement of the tool name.

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

Completeness4/5

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

For a mutation tool with annotations present and no output schema, it covers the crucial operational facts (parent constraint, undo caveat, editor support). Minor gaps remain: the effect of the 'name' parameter and whether child styles/attributes survive the merge.

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

Parameters3/5

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

Schema coverage is 50%: session and idempotencyKey are documented in the schema, while name and nodeIds carry no description anywhere. The description contributes only indirectly (the shared-parent constraint on nodeIds) and says nothing about the 'name' parameter or how many nodes can be flattened beyond the schema's maxItems.

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

Purpose4/5

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

States a specific verb and resource ('flatten nodes into one editable vector') and clarifies the outcome ('a single path'), which implicitly separates it from figma_group_nodes, figma_ungroup_nodes and figma_boolean_nodes. It stops short of naming those siblings, so the distinction is inferable rather than explicit.

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

Usage Guidelines4/5

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

Provides concrete triggers ('for a finished icon or a boolean shape that should become a single path') and a hard precondition ('They must share a parent'). It does not state when NOT to use it (e.g. when you still need separately editable child shapes), so alternatives remain unaddressed.

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

figma_get_annotationsGet annotationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoSubtree root: node id or a Figma link. Defaults to the one selected layer, then the current page.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_componentGet one componentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax layer references returned. Default 200.
cursorNoThe nextCursor of a truncated call, unchanged.
nodeIdYesA COMPONENT, COMPONENT_SET, variant or INSTANCE id.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds 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.

Purpose5/5

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

The description states a specific verb and resource ('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.

Usage Guidelines5/5

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 contextA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoLevels to descend: 0 is the node alone. Default 8 (a whole screen).
cursorNoThe nextCursor of a truncated call, unchanged.
nodeIdNoSubtree root: node id or a Figma link. Defaults to the selection, then the current page (in Slides the focused slide).
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
absoluteNoAdd `abs` per node: its box on the page (x/y are relative to the parent). Default false.
maxNodesNoStop after this many nodes. Default 500.
includeCssNoPer-node CSS from Figma's inspect panel (getCSSAsync). Default false; slower.
maxTextCharsNoCharacters of text shown per node. Default 400.
includeStylesNoStyle names, text runs and instance components. Default true.
maxTableCellsNoFigJam table cells read per table before it is cut (tableNote). Default 500.
includeGeometryNoSize, position, auto-layout, constraints, radius, opacity. Default true.
includeVariablesNoBound variable names and values, explicit modes. Default true.
includeAnnotationsNoPer-node annotations (label, category). Default true.
maxChildrenPerNodeNoCap on children per node. Default 50.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 fontsA
Read-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".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoFamilies per call. Default 50.
queryNoAvailable families whose name contains this, case-insensitive, e.g. "mono".
scopeNoDefault "page", or "available" when a filter below is given.
cursorNoThe nextCursor of a truncated call, unchanged.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
familiesNoExact family names to check, e.g. ["Inter", "Playfair Display"]: each found one with its styles; the rest in `missing`.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-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 gear first; a section runs the design skill's section gear; a page or more runs the whole design skill. 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) 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 the keyframe tools wait until this session read the motion or storyboard skill.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoA skill, one of its sections, or "skills". Default "workflow".
sectionNoA section of the skill named by topic; every answer's footer lists them.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, closed-world). The description adds genuinely new behavior: it works without the plugin, every answer ends with exact calls for other sections/skills, and under BRIDGE_PROCESS=strict keyframe tools wait until this session reads the motion/storyboard skill. That gating disclosure is valuable but not exhaustive on caching or response size.

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

Conciseness3/5

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

The purpose is front-loaded, but the body is a dense run-on stitched with semicolons and backticks that takes effort to parse. Given the 41-value enum some length is warranted, yet the routing rules could be structured far more cleanly.

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

Completeness4/5

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

With no output schema, the description carries the return burden and does so (Markdown playbook, footer lists of follow-up calls). Combined with the strict-mode gating note, an agent has enough to call it correctly; only response size/shape detail is thin.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real semantics beyond the terse schema text: it explains what topic values select (a skill, one of its sections, or 'skills'), gives the task-to-topic routing, and describes what section does and where the valid list comes from.

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

Purpose5/5

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

States a specific verb and resource: read this before a design/motion/review task, returning a skill playbook as Markdown. An agent can immediately distinguish this documentation/routing tool from the ~90 mutation and query siblings.

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

Usage Guidelines5/5

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

Explicit when-to-use routing: 'Read this before a design, motion or review task', then 'a motion piece starts with storyboard, keyframes with motion, and a review with critique.' It maps task type to the correct topic value, so nothing is left to inference.

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

figma_get_library_variablesList library variablesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNoMax variables. Default 200.
queryNoName substring, case-insensitive (collections: name or library name).
cursorNoThe nextCursor of a truncated call, unchanged.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
collectionKeyNoA collection key from a call without it.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 componentsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNoOnly this page. Omit for the whole document.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds meaning 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.

Purpose5/5

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.

Usage Guidelines4/5

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 metadataA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNoThe nextCursor of a truncated call, unchanged.
nodeIdNoLayer or frame (id or Figma link). Defaults to the selection, then the current page.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
maxNodesNoLayers inspected per call. Default 500.
recursiveNoInclude descendants. Default true; false reads only the given layers (a page is always walked).

TDQS

A4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines4/5

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 nodeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoHow many child levels to include. Default 1.
formatNo"dto" (default) or "rest" (Figma REST JSON, bounded).
nodeIdYesNode 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.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
includeGeometryNoLayout, size, position, padding, radius, fill. Default true.
maxChildrenPerNodeNoCap on children listed per node. Default 50.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 nodesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoChild levels per node. Default 0.
nodeIdsYesNode ids or Figma links to fetch.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
includeGeometryNoLayout, size, position, padding, radius, fill. Default true.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 pagesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 reactionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax nodes per call for subtree/page. Default 200.
scopeNoDefault "node".
cursorNoOpaque cursor from a previous truncated call.
nodeIdNoNode id or Figma link. Required unless scope is "page" (then: the page it sits on).
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description 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.

Purpose5/5

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.

Usage Guidelines4/5

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 selectionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoChild levels per selected node. Default 0.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
includeGeometryNoLayout, size, position, padding, radius, fill. Default true.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 gridA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoSlides per call. Default 500.
cursorNoThe nextCursor of a truncated call, unchanged.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
rowIndexNoRead one row (section) only.
includeNotesNoEach slide's speaker notes (markdown). Default true.
includeSummaryNoPer slide: background, title, interactive elements. Default true.
includeTransitionsNoEach slide's transition, or transitionError. Default false.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

The description states a specific verb and resource: 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.

Usage Guidelines5/5

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 stylesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOnly this style type. Omit for all.
limitNoMax styles. Default 500.
cursorNoThe nextCursor of a truncated call, unchanged.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 valuesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax variables (file-wide list). Default 500.
cursorNoThe nextCursor of a truncated call, unchanged.
nodeIdNoRead the tokens this subtree uses instead of the file-wide list.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
maxNodesNoNodes walked with `nodeId`. Default 2000.
collectionIdNoOnly this collection.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning 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.

Purpose4/5

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.

Usage Guidelines4/5

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 nodesB
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

B3.4/5.0
Behavior3/5

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

Annotations already declare non-destructive, idempotent, non-read-only behavior. The description adds useful context beyond them: the shared-parent constraint and which editors are verified. It still omits what happens to the resulting group (returns an id? changes selection?) and whether the source nodes are consumed.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core action and immediate constraint. Nothing superfluous, though the editor-support note is somewhat tangential to invoking the tool.

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

Completeness3/5

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

For a mutation tool with no output schema and half its parameters undocumented, the description covers the key precondition and environment limits, which is decent. It still leaves the return value and the fate of the child nodes unexplained.

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

Parameters3/5

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

Schema coverage is 50% (only session and idempotencyKey are documented in the schema), so the description must carry more. It adds a real constraint on nodeIds ('must share one parent'), but the 'name' parameter is never explained and there is no hint about the 200-item cap.

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

Purpose4/5

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

States a specific verb ('Wrap') and resource ('nodes into a GROUP'), and the uppercase GROUP clarifies the resulting node type, which distinguishes it from figma_boolean_nodes or figma_flatten_nodes. It does not name a sibling explicitly, but the operation is unambiguous.

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

Usage Guidelines3/5

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

It gives one precondition ('all nodes must share one parent') and environment support ('Editors: Design; unverified: FigJam, Slides'), but offers no guidance on when to group vs. frame, boolean, or combine-as-variants. Usage is implied rather than contrasted with alternatives.

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

figma_import_imageImport imageA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
urlNo
nameNo
pathNoA file inside an allowed root; relative paths resolve from the export directory.
widthNo
heightNo
nodeIdNoFill this existing node instead of creating a rectangle.
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
scaleModeNoDefault "fill".
renderWidthNoPixel width of the render; its height follows the layer. Default twice the target's width, within 4096 px a side.
cornerRadiusNo
renderNodeIdNoA layer of this file to render as the picture. Not with `url` or `path`.
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

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 layers on genuinely useful behavior: accepted formats (PNG/JPEG/GIF), the 4096 px per-side limit, what placement does to the target node (becomes its fill vs creates a rectangle), and editor support ('Design; unverified: FigJam, Slides'). It omits retry/idempotency semantics, which live only in the schema field text, so it is not fully self-contained.

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

Conciseness4/5

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

Front-loads the core action and keeps everything to a single dense passage with no filler sentences. The heavy em-dash and parenthetical nesting makes it slightly harder to scan than ideal, but each clause carries distinct information rather than restating the name or schema.

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

Completeness4/5

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

For a complex 16-parameter mutation tool with a nested object and no output schema, it conveys the decision points an agent needs: source selection, placement behavior, format limits, and environment support. The remaining omissions (position/name params, idempotency guidance) are minor and partly carried by the schema.

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

Parameters4/5

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

Against 50% schema coverage it compensates on the differentiating parameters: it explains how url, path and renderNodeId differ in who fetches/reads the bytes, that nodeId turns the image into a fill, and that width/height govern the new rectangle. Several params (x, y, name, parentId, cornerRadius) remain undocumented in both description and schema, leaving a real gap.

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

Purpose5/5

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

States a specific verb and resource ('Place a picture') and immediately enumerates the three input modes (url, path, renderNodeId) plus the two placement outcomes (fill an existing nodeId vs create a new rectangle). It cleanly distinguishes itself from siblings like figma_export_node and figma_create_rectangle without the agent opening any schema.

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

Usage Guidelines4/5

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

Gives explicit conditional routing: 'To look at a layer yourself, figma_export_node returns its picture to you instead of placing it' names the alternative and the condition that selects it. It also explains what each source mode does, giving clear context for which parameter to reach for. It stops short of stating hard exclusions (e.g., when not to use a url vs a render), so it 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_import_library_assetsImport library assetsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

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

Annotations already declare non-readonly, idempotent, non-destructive; the description adds context annotations cannot: only published assets import, unpublished ones return Figma's reason per item, the exact per-item result shape, and editor support (Design supported, FigJam/Slides unverified). This is rich disclosure beyond the structured fields.

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

Conciseness4/5

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

Front-loads the core action and outcome, then key provenance, then the alternative, then the return shape and editor support. Dense with backticked identifiers and slightly run-on, but each clause carries unique information.

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

Completeness5/5

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

No output schema exists, so the description carries the burden of the return contract — and it delivers the exact per-item shape (`key, kind, ok, id?, name?, type?, error?`) plus failure behavior. Combined with the usage and provenance guidance, 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.

Parameters4/5

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

Schema coverage is 67% and documents key, session and idempotencyKey; the description adds genuine meaning by explaining where keys are sourced and which sibling tools consume the returned ids. It doesn't elaborate on `kind` values or the assets array shape, but the enum is self-explanatory, so the added value is above the schema baseline.

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

Purpose5/5

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

States a specific verb (bring/import) and resource (published library assets: components, component sets, styles, variables), and frames the outcome — the local ids other tools consume. It explicitly names the consuming siblings (figma_create_instance, figma_apply_style_to_node, figma_bind_variable_to_node), making it immediately distinguishable from them.

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

Usage Guidelines5/5

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

Gives the when (published assets only), the where the keys come from (figma_get_design_context, figma_get_component, or a library file opened as another session), and a clear when-not/alternative: placing a single library component is handled by figma_create_instance's `componentKey`. Nothing is left to inference.

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

figma_import_svgImport SVG (icon / vector)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
svgYesThe SVG markup, starting with <svg …>.
nameNoe.g. "Icon / Search".
colorNo
widthNoScale to this width, keeping proportions.
heightNoOr to this height.
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdNo
colorVariableNoA COLOR variable name or id, e.g. "color/icon/default". Not with `color`.
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

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

Annotations already declare the safety profile (idempotent=true, destructive=false, readOnly=false). The description goes beyond them by disclosing the return shape ('The result lists the painted layers as `vectorIds`') and the recolouring behaviour ('recolours every painted vector'), which matter because there is no output schema and no way to know the return form otherwise.

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

Conciseness4/5

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

Front-loaded with the purpose, then parameter behaviour, then environment caveats — a sensible order with no filler sentences. The parameter sentence is long and clause-stacked, which slightly hurts scannability but does not waste words.

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

Completeness4/5

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

For a 12-parameter mutation with no output schema, the description covers the design-critical pieces: what gets created, how colour binding works, where it lands, and the returned `vectorIds`. Parameters like x/y, name, sizing and session are left to the schema with no compensating text, which is the only real gap.

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

Parameters4/5

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

With 67% schema coverage, the description still adds real semantics: `width`/`height` 'scales the drawing with its vectors', `color` recolours all painted vectors, `colorVariable` 'binds them to a COLOR variable' so the icon follows the token, and `parentId` places it into a frame. This is meaningful guidance the schema text does not supply.

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

Purpose5/5

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

Specific verb + resource: 'Place SVG markup as editable vectors', scoped to icons, logos and illustrations. This is clearly distinct from figma_create_vector (drawn geometry) and figma_import_image (raster assets), 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.

Usage Guidelines4/5

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

Gives concrete usage context — when to use `color` ('the usual way to put an icon in the brand colour') vs `colorVariable` (token-driven, stroke-only icons stay stroke-only) — and states platform availability ('Editors: Design; unverified: FigJam, Slides'). It never names a sibling alternative or an explicit when-not-to-use, 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_move_nodesMove nodesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
relativeNoTreat x/y as a delta. Default false (absolute).
positioningNoChildren of an auto-layout only: absolute = out of the flow, placed by x/y.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, and the description adds substantial context beyond them: auto-layout ownership of x/y, a fill axis becoming fixed, partial-failure semantics ('one node failing does not fail the call'), per-item error reporting, and editor support (Design verified; FigJam/Slides unverified). It stops short of permission/rate-limit or positional-conflict caveats, so 4 rather than 5.

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

Conciseness4/5

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

Front-loaded with the two core modes, and every clause carries information; however the parenthetical asides ('a fill axis becomes fixed first; the item says so') add minor verbosity. Dense but largely justified.

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

Completeness5/5

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

With no output schema, the description carries the burden and delivers: it documents the return shape (items: [{id, ok, error?}]), failure semantics, and editor coverage. Nothing critical to calling it correctly is missing.

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

Parameters4/5

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

Schema coverage is 57%; the description compensates for the key ambiguous params by clarifying relative, positioning, and that x/y are 'written together and read back.' It doesn't touch nodeIds, session, or idempotencyKey (the latter is well-documented in the schema), so it adds meaningful but not exhaustive value.

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

Purpose5/5

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

States a specific verb+resource ('Move nodes') with two modes (absolute position vs delta via relative:true), and explicitly differentiates from siblings figma_move_slides and figma_reparent_nodes. An agent can tell what this does and what it is not without opening the schema.

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

Usage Guidelines5/5

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

Explains when to use positioning:'absolute' (badge on a card's corner, close button on a modal) vs 'auto' (put it back), and routes the agent to alternatives for slides and reparenting. This is explicit when/when-not/alternative guidance.

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

figma_move_slidesMove slidesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
colNoWith `row`: their position in it; default its end.
rowNoPut them in this row (section); the row count opens a new last row.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
slideIdsYesThe slides to move, in the order they should end up.
afterSlideIdNoPut them right after this slide.
beforeSlideIdNoPut them right before this slide.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

With annotations declaring readOnlyHint=false, idempotentHint=true and destructiveHint=false, the description still adds rich behavior: an anchor that is itself being moved is refused before any change (atomicity), every slide stays in the deck, an emptied row persists as an empty section listed in emptiedRows, and per-slide results are returned. This goes well beyond the structured safety hints.

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

Conciseness4/5

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

Dense but front-loaded: the core action and anchor options lead, followed by edge-case behavior, return shape, and the sibling pointer. Every sentence carries information, though the single block paragraph is somewhat heavy.

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

Completeness5/5

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

Although there is no output schema, the description explains the return ('per-slide results with the new row, col and index'), the atomicity guarantee, side effects on emptied rows, permissions scope, and the alternative tool. Nothing essential to correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter, but the description adds real semantic detail: exactly one anchor must be chosen, row/col are counted after the moved slides are removed, and the row count opens a new last row. It clarifies interplay between row, col, and the anchor ids beyond the field-level descriptions.

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

Purpose5/5

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

States a specific verb (move) and resource (slides) with clear scope: moving slides within a Figma Slides deck as one ordered block to a single anchor. It explicitly names the sibling figma_set_slide_grid as the tool for a different operation, so an agent can distinguish it without opening schemas.

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

Usage Guidelines4/5

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

Gives concrete routing ('To restate the whole deck's grouping use figma_set_slide_grid') and enumerates the mutually exclusive anchor modes (after/before/row), which tells the agent how to invoke it. It stops short of explicit when-not-to-use conditions or prerequisites beyond 'Editors: Slides only'.

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

figma_navigate_pageGo to pageA
Read-only

Switch the editor to another page, by id or exact name. figma_get_pages lists them. Changes no design data.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageIdNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
pageNameNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so 'Changes no design data' largely restates the safety profile. The one genuinely additive behavioral detail is that name matching must be exact (no fuzzy resolution), plus the implicit note that editor view state changes even though document data does not.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, then the lookup helper, then the safety note. No filler, no restatement of the title.

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

Completeness3/5

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

For a simple navigation tool with no output schema this is nearly sufficient, but with zero required parameters the description never says the caller must supply pageId or pageName, nor what happens when an exact name is not found. Those omissions matter for correct invocation.

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

Parameters4/5

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

Schema coverage is only 33% (only `session` is documented), so the description must carry the load — and it does, clarifying that pageId and pageName are alternative selectors and that the name must be exact. It still leaves the mutual-exclusivity/precedence rule and the fact that one of the two is effectively required (0 required params) unstated.

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

Purpose4/5

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

States a specific verb (switch) and resource (page) with the editor as target, which cleanly separates it from the many figma_create_* and figma_get_* siblings. It does not explicitly contrast itself with other navigation-ish siblings (figma_select, figma_zoom_to), so it falls 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.

Usage Guidelines3/5

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

The pointer 'figma_get_pages lists them' usefully implies the prerequisite lookup step, but there is no statement of when to prefer this over alternatives such as figma_select or figma_zoom_to, nor any exclusion or precondition beyond that hint. 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_remove_keyframesRemove keyframes (Motion)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoFields as figma_get_motion_context names them, e.g. ["OPACITY", "fill:0"].
nodeIdYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

Annotations only cover safety flags, and the description adds real behavioral detail beyond them: non-animated fields surface in `notAnimated` rather than erroring, each removal is read back after Figma settles and retried, a stuck track fails INTERNAL with `partial.notRemoved`, and returned `removed`/`remaining` are read-back values. It also discloses that animation styles are untouched and the strict-mode gating.

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

Conciseness4/5

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

Front-loaded with the core action and scope before the failure/retry and prerequisite clauses. Dense but nearly every clause carries operational information; only the closing editor-support list is marginal.

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

Completeness5/5

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

No output schema exists, yet the description describes the return shape (`removed`, `remaining`) and failure payloads, plus the prerequisite and retry model. For a mutation with no output schema, nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

With 75% schema coverage the schema already documents `fields`, `session` and `idempotencyKey`; the description adds the semantics the schema omits — that omitting `fields` removes every track, and that fields are named as figma_get_motion_context names them. No value added for `nodeId`, but the omission behavior is the key gap the schema leaves open.

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

Purpose5/5

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

States a specific verb and resource ('Remove a layer's manual keyframe tracks') with scope ('the given `fields`, or every track when omitted'), and explicitly marks the boundary against the sibling that writes tracks ('figma_set_keyframes writes tracks'). An agent can route this without opening any schema.

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

Usage Guidelines4/5

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

Gives concrete preconditions: under BRIDGE_PROCESS=strict this returns PROCESS_REQUIRED until the session has read the motion skill via figma_get_guide and the frame has a plan via figma_set_motion_plan, and it names figma_set_keyframes as the counter-operation. It stops short of an explicit when-not-to-use statement, but the prerequisite chain is unusually actionable.

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 reactionsA
Idempotent

Remove every prototype interaction from a node. Editors: Design; unverified: FigJam, Slides.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A3.7/5.0
Behavior4/5

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

Annotations already establish non-readonly, idempotent, and non-destructive behavior, so the description adds the two things they don't: the removal is wholesale ('every' interaction, not a targeted one) and it is only verified on the Design editor surface. That is genuine added context. The tension with destructiveHint=false (this does erase existing interactions) and the lack of any reversibility or error-behavior note keep 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.

Conciseness5/5

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

Two short sentences, no filler, and the core action is front-loaded ahead of the editor-scope caveat. Every clause carries information.

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

Completeness3/5

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

For a single-node bulk mutation with no output schema, the description covers the action and the editor surfaces it is verified on. It omits what a caller gets back, what happens on an unsupported surface, and whether the change is recoverable — gaps that matter for a wholesale removal operation.

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

Parameters3/5

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

Schema coverage is 67%: session and idempotencyKey are well documented in the schema, and nodeId has no description at all. The phrase 'from a node' only weakly signals that nodeId is the node whose reactions are cleared and offers no format hint (e.g., Figma node id syntax). With the schema doing most of the work, a baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb and resource with an explicit scope qualifier: 'Remove every prototype interaction from a node.' This clearly separates it from figma_get_reactions and figma_set_reactions, whose names imply reading or replacing rather than clearing. It stops short of naming those siblings, but the action is unambiguous.

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

Usage Guidelines3/5

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

The 'Editors: Design; unverified: FigJam, Slides' clause gives real applicability context — the agent knows this is a design-mode operation that may not work on FigJam/Slides boards. However, it never says when to reach for this tool versus figma_set_reactions for partial edits, nor what happens when the node has no reactions to remove. Usage 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_rename_nodeRename nodeA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
nodeIdYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A3.8/5.0
Behavior4/5

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

The description discloses that the previous name is returned, which adds value beyond the annotations. Annotations already indicate idempotentHint=true and destructiveHint=false, so the idempotency isn't novel, but the return behavior is not documented in the schema. The editor support note also adds behavioral context.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core action, and includes only essential contextual details. No wasted words.

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

Completeness4/5

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

For a single-node rename tool with no output schema and partial schema coverage, the description covers the key behavior (return of previous name) and editor compatibility. It does not explain what happens if the node doesn't exist or if the name is invalid, but those are minor gaps. Overall, it provides sufficient context for an agent to invoke correctly.

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

Parameters3/5

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

Schema coverage is 50%, meaning two parameters (session and idempotencyKey) have descriptions in the schema. The description does not add further meaning to any parameters. The baseline for 50% coverage is around 3, and no extra parameter details are provided beyond what's already in the schema.

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

Purpose4/5

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

The description clearly states 'Rename one node' – a specific verb and resource. It also distinguishes the single-node scope from the sibling figma_batch_rename_nodes by saying 'Rename one node', though it doesn't explicitly name the sibling. The editor compatibility note adds helpful context.

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

Usage Guidelines3/5

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

There is no explicit guidance on when to use this tool versus figma_batch_rename_nodes. The mention of 'Rename one node' implies it's for single-node renaming, but no conditions or alternatives are spelled out. The editor compatibility note ('Editors: Design; unverified: FigJam, Slides') is useful but not usage guidance.

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

figma_reorder_nodesReorder nodesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
positionYes"front", "back", "forward", "backward", or an index as a string ("3").
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that ordering is confined to the existing parent (no reparenting side effect), that the call returns per-item results where a single node failure does not fail the whole call, and which editors are supported vs unverified. With destructiveHint=false and idempotentHint=true already given, these added traits are exactly the extra behavioral context 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.

Conciseness5/5

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

Four compact clauses, front-loaded with the core action and scope, then the sibling disambiguation, return contract, and editor matrix. No filler or repeated schema content; every sentence carries distinct information.

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

Completeness5/5

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

There is no output schema, and the description compensates by spelling out the return shape (`items: [{ id, ok, error? }]`) and its partial-failure semantics. Combined with scope, sibling routing, and editor support, 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.

Parameters3/5

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

Schema description coverage is 75%, so the schema already documents `position`, `session`, and `idempotencyKey` in detail. The description's 'z-order' phrasing gives thematic meaning to `position` but adds no enumeration, index-syntax, or multi-node ordering semantics beyond what the schema states. Baseline 3 applies.

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

Purpose5/5

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

States a precise verb+resource+scope: 'Change z-order within each node's current parent', which immediately separates it from figma_reparent_nodes and figma_move_nodes by locking the operation to the existing parent. It also names figma_move_slides as the sibling that handles the slide case, so an agent can route correctly 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.

Usage Guidelines4/5

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

Gives a clear routing rule for the slide case ('Slides keep their deck order: figma_move_slides reorders them') and implicitly excludes reparenting by scoping to the current parent. It does not explicitly contrast with figma_reparent_nodes or state ordering-direction prerequisites, but the context is unambiguous.

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

figma_reparent_nodesReparent nodesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoIn the new parent's coordinates, set after the move. Not with keepPosition.
yNo
indexNoInsertion index. Omit to append.
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
parentIdYesThe new parent.
keepPositionNoKeep each node's place on the canvas. Default false.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

Beyond the annotations (idempotentHint, destructiveHint false), it discloses per-item result semantics with partial-failure tolerance, a connector 'warning' on moved items, the keepPosition canvas behavior, and editor support (Design verified; FigJam/Slides unverified). This is substantial behavioral context the annotations do not carry.

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

Conciseness4/5

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

Front-loaded with the core action, then details in roughly priority order; almost no filler and the sticky example is illustrative rather than padding. It is dense across several clauses in one sentence, which slightly taxes readability.

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

Completeness5/5

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

With no output schema, the description compensates by describing the return shape (items: [{ id, ok, error? }]) and the partial-failure contract, plus editor support and connector caveats. 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.

Parameters4/5

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

Schema coverage is 75%, but the description adds real meaning: it explains the interplay between keepPosition and explicit x/y (mutually exclusive placement modes) and that x/y are interpreted in the new parent's coordinates after the move. That goes beyond the schema's field-level notes.

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

Purpose5/5

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

The opening sentence states a specific verb (move/reparent) and resource (nodes), and enumerates the valid parent types (frame, group, component, section, slide, page). This lets an agent distinguish it from siblings like figma_move_nodes or figma_reorder_nodes 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.

Usage Guidelines4/5

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

It explicitly routes slides to the sibling figma_move_slides and clarifies the two position modes (retain x/y vs keepPosition vs explicit x/y), which is genuine usage context. It stops short of stating when to use this over figma_move_nodes or figma_reorder_nodes, so it is clear context without full when/when-not coverage.

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

figma_reset_slotReset slotA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYesSLOT layers inside instances.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.9/5.0
Behavior5/5

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

Annotations already declare destructive=true and idempotent=true, but the description adds what is destroyed ('what was added into them'), partial-failure semantics ('one node failing does not fail the call'), the per-item result shape, and editor support. That is substantive behavioral context beyond the structured fields.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the action and its destructive effect, then the routing guidance, then the return contract. No sentence is wasted and nothing important is buried.

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

Completeness5/5

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

Despite having no output schema, the description supplies the return contract (items: [{ id, ok, error? }]) and partial-failure behavior, plus editor availability. For a destructive mutation tool, nothing an agent needs to call it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description goes further by specifying that nodeIds must be SLOT layers of instances and pointing to figma_search_nodes type SLOT as the way to find them. session and idempotencyKey are left 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.

Purpose5/5

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

States a specific verb and resource with precise scope: putting slots inside instances back to the component's own slot content and dropping added content. An agent can distinguish this from figma_create_slot and figma_delete_nodes without opening any schema.

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

Usage Guidelines5/5

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

Names an explicit alternative and the condition that selects it ('To empty one layer at a time use figma_delete_nodes instead'), and tells the agent how to obtain valid targets (figma_search_nodes with type SLOT). Both when-to-use and when-to-use-something-else are covered.

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

figma_resize_nodesResize nodesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNo
heightNo
sizingNoHow it sizes, as in Figma's panel: { "horizontal": "fill" } to take the parent column's width; "hug" fits content; "fixed" keeps the number.
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
maxWidthNo
minWidthNo
maxHeightNo
minHeightNo
clearLimitsNoLimits to remove.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

Discloses behavior well beyond the annotations: per-item refusal for sticky/table/connector/code block/slide nodes, partial-failure semantics ('one node failing does not fail the call'), text wrap-and-grow behavior, and editor support tiers ('Editors: Design; unverified: FigJam, Slides'). This adds substantial context on top of the readOnly/destructive/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.

Conciseness4/5

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

Front-loaded with purpose, then behaviors, then return shape, then editor scope. Dense but each clause contributes; slightly long but no clearly wasted sentence.

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

Completeness5/5

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

For an 11-parameter mutation tool with a nested object and no output schema, the description supplies the return format ('items: [{ id, ok, error? }]'), failure semantics, refusal behavior, and editor scope. 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.

Parameters4/5

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

Schema coverage is only 36%, so the description carries the burden and largely does: it explains width/height interaction (the other dimension is kept), the sizing enum semantics, min/max limit behavior, and clearLimits. It does not cover nodeIds' 500-item cap, but nodeIds itself is self-evident.

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

Purpose5/5

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

Opens with a specific verb+resource ('Resize nodes') and immediately extends it to a second capability ('or change how they size'), distinguishing it from siblings like rotate_nodes, move_nodes and reorder_nodes. An agent can tell what it does without opening the schema.

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

Usage Guidelines4/5

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

Gives concrete when-to-use context: 'fill' sizing is prescribed as 'the fix for text that overflows', min/max limits are scoped to 'auto-layout frames and their direct children', and refused node types are routed to 'the tool that sizes it'. It lacks explicit naming of alternative sibling tools, but the selection 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_review_videoReview a rendered videoA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
cutsNoFrames where a cut is meant: the frame that first shows the new picture.
pathYesThe video: the `path` figma_export_video returned, or a file inside the export roots.
everyNoContact sheet: one tile every N frames, by frame index. Default: about 90 tiles.
holdsNoIntended still stretches: inclusive frames, e.g. [{ fromFrame: 120, toFrame: 179 }], or seconds, e.g. [{ from: 4, to: 5.97 }].
stillsNoFrames to return full size, exactly (frame k = k / fps).
columnsNoContact sheet tiles per row. Default 9 portrait, 6 landscape.
metricsNoPer-frame analysis. Default true.
saveDirNoWhere the images go. Default: the video's folder. Same rules as figma_download_assets `dir`.
closeupsNoWindows to show frame by frame, e.g. around each transition.
maxImagesNoImages returned inline (sheet, close-ups, stills, in that order). Default 4.
tileWidthNoTile width in px, for the sheet and close-ups. Default 180 portrait, 240 landscape.
thresholdsNoOverride the metric thresholds.
expectFramesNoFrames the file should have, e.g. figma_export_video's expectedFrames.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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_rotate_nodesRotate nodesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleYesDegrees, counter-clockwise as in Figma's rotation field (negative turns clockwise). Absolute, not a delta.
pivotNoDefault "center".
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it explains that auto-layout re-places the node and reports pivot 'layout', that the turn is read back and a non-kept item returns ok:false with its actual rotation/position, and that per-item failures don't fail the whole call. These are exactly the behavioral traits (write semantics, partial failure, verification) not covered by idempotentHint/destructiveHint.

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

Conciseness4/5

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

Dense but front-loaded: the core behavior (absolute rotation, pivot meaning) leads, followed by edge cases and return shape. Most sentences earn their place, though the parentheticals make it slightly harder to scan than an ideal definition.

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

Completeness5/5

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

With no output schema, the description supplies the return contract (items: [{ id, ok, error? }] with partial-failure semantics), the pivot/auto-layout caveats, and the verification read-back. This is enough for an agent 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.

Parameters4/5

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

Schema coverage is 80%, so the baseline is 3, but the description adds real meaning for pivot ('origin' turns about the top-left corner, Figma's raw behaviour, vs the editor-style centre default) that the schema only labels. Angle semantics are already fully documented in the schema, so it's incremental rather than comprehensive.

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

Purpose5/5

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

States a specific verb and resource ('Set an absolute rotation', nodes) and explicitly distinguishes itself from the sibling figma_move_nodes ('moves without turning'). An agent can tell what this does and how it differs from adjacent operations without opening any schema.

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

Usage Guidelines4/5

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

Names the alternative operation (figma_move_nodes) and the condition that separates them (turning vs moving), and notes editor support (Design; unverified FigJam, Slides). However, it never states explicit when-to-use/when-not guidance for rotation scenarios, so it's clear context rather than full routing logic.

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

figma_save_screenshotsSave screenshotsA
Read-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[].

ParametersJSON Schema
NameRequiredDescriptionDefault
dirNoDirectory for the files. Defaults to the export directory.
scaleNoRaster scale, default 2. Ignored for SVG.
formatNoDefault PNG.
nodeIdsYesNodes to render.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 typesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results. Default 200.
typesYesNode types, e.g. ["FRAME","COMPONENT"], or on a board ["STICKY","CONNECTOR"].
cursorNoOpaque cursor from a previous truncated call.
nodeIdNoSubtree root: node id or a Figma link. Defaults to the one selected layer, then the current page.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax text items. Default 500.
typesNoOnly these holders. Default all six.
cursorNoOpaque cursor from a previous truncated call.
nodeIdNoSubtree root: node id or a Figma link. Defaults to the one selected layer, then the current page.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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 typeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoContent substring (case-insensitive). query/type then optional.
typeNoFigma node type, e.g. FRAME, TEXT, COMPONENT, INSTANCE, RECTANGLE.
limitNoMax results. Default 50.
queryNoName substring (case-insensitive).
scopeNoWhere to search. Default "page".
cursorNoOpaque cursor from a previous truncated call.
nodeIdNoSubtree root when scope is "subtree": node id or a Figma link.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
exactNameNoMatch the name exactly instead of as a substring. Default false.
componentIdNoA COMPONENT or COMPONENT_SET id (or link): find its instances. query/type then optional.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 nodesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo
nodeIdNoOne node.
nodeIdsNoOr several nodes (all on one page).
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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-layoutA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
gapNoSpace between items, px; negative overlaps them.
modeNo
wrapNo
alignXNo
alignYNo
nodeIdYes
rowGapNoSpace between wrapped rows, px. Needs wrap.
paddingNoPadding: one number for all sides ("24"), or four comma-separated ("48,48,32,32") for top,right,bottom,left.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
alignContentNoHow wrapped rows share the height. Needs wrap.
counterSizingNo
primarySizingNo
reverseZIndexNoDraw the first item on top (with a negative gap).
idempotencyKeyNoCaller-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.
strokesInLayoutNoCount the frame's stroke as space, so children sit inside it.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare idempotent=true, destructiveHint=false, and readOnlyHint=false, but the description adds real behavioral context on top: mode:'none' removes auto-layout, negative gap overlaps items, 'every value is checked before the frame changes' (validation/atomicity), and editor support (Design; unverified FigJam, Slides). This is exactly the kind of extra context the annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the field inventory, then constraints, then sibling routing and editor support. Every sentence carries a distinct constraint, but it is a dense run-on block that is harder to scan than a broken-out list would be.

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

Completeness4/5

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

For a 15-parameter mutation tool with 53% schema coverage, no output schema, and present annotations, the description covers the behaviorally risky parameters (mode, wrap, gap, alignment) well and correctly omits return-value explanation. Remaining gaps are the loosely-specified axis sizing pair and session handling, which the schema partly carries.

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

Parameters4/5

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

Schema coverage is only 53%, so the description has to compensate, and it does well: it defines alignX/alignY semantics, wrap's horizontal requirement, rowGap defaulting to gap, alignContent sharing wrapped-row height, and negative-gap overlap with reverseZIndex. Axis sizing is covered only loosely ('axis sizing') and counterSizing/primarySizing specifics are left to the schema, so it stops short of full compensation.

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

Purpose5/5

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

States a specific verb+resource ('Full auto-layout configuration on one node') and enumerates the exact fields it governs (mode, gap, padding, alignment, wrap, axis sizing). It also routes clipping responsibility to the sibling figma_set_clips_content, so an agent can separate this tool from adjacent layout tools.

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

Usage Guidelines4/5

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

Gives clear usage conditions (wrap needs a horizontal layout; baseline only as alignY of a row; space-between only along the layout direction) and names an alternative for the clipping case. It does not explicitly contrast with figma_check_layout or other layout-adjacent siblings, so it falls short of full when/when-not routing.

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

figma_set_blend_modeSet blend modeA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYesNodes to change.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
blendModeYes
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

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

Adds context beyond the annotations: per-item result shape, the guarantee that a single node failing does not fail the call, and editor/platform support (Design vs unverified FigJam/Slides). Annotations already cover the idempotency/safety profile, so this is meaningful extra disclosure, though it doesn't address permissions or reversibility.

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

Conciseness4/5

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

Front-loads the core action, then scoping, then alternative, then return contract, then platform support. Dense with zero filler sentences, though the return-shape notation is slightly heavier than needed inline.

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

Completeness4/5

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

With no output schema, the description correctly supplies the return shape and partial-failure behavior, and adds editor compatibility. A mutation tool of this complexity could still note required permissions or what happens to nodes whose blend mode is invalid, but coverage is strong.

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

Parameters4/5

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

With 75% schema coverage the baseline is 3, and the description earns above that by clarifying that PASS_THROUGH is limited to frames and groups, adding a semantic constraint on blendMode not present in the enum. nodeIds/session/idempotencyKey semantics remain carried by the schema.

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

Purpose5/5

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

States a specific verb+resource ('set how nodes blend') and it maps directly to the tool name. It explicitly distinguishes itself from the sibling figma_set_opacity by routing transparency work there, so an agent can tell the two 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.

Usage Guidelines4/5

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

Names the alternative (figma_set_opacity) and the condition that selects it, and notes PASS_THROUGH applies to frames/groups only. There are no explicit when-not-to-use exclusions beyond that one routing hint, so it stops 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_board_propertiesSet board properties (FigJam)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
wideNoStickies: 416 wide instead of 240.
colorNoA palette name for each node's type, or a hex.
shapeNoShapes with text: a shape type such as "diamond".
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
languageNoCode blocks: typescript, javascript, python, go, rust, ruby, css, html, json, graphql, sql, swift, kotlin, cpp, bash, plaintext, dart.
authorVisibleNoStickies: show the author.
contentsHiddenNoSections: hide what they hold.
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

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

Annotations already declare idempotent/non-destructive, so the lower bar is met; the description adds genuinely new behavior — a field that doesn't match a node's type errors only for that node and leaves it unchanged, i.e. per-node partial failure. It also flags that editing is unverified in FigJam/Slides.

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

Conciseness4/5

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

Front-loads scope and the color rule, and each clause carries field/type mapping. The trailing 'Editors: unverified in FigJam, Slides' is cryptic and slightly undercuts an otherwise tight, information-dense block.

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

Completeness4/5

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

For a 9-param mutation tool with no output schema, it covers which fields apply to which node types and what happens on mismatch. It stops short of describing the success response, but the behavioral picture is otherwise complete.

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

Parameters4/5

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

Schema coverage is 89% (baseline 3), but the description goes beyond it by explaining that `color` resolves per node type to sticky fill, shape preset, connector line, table fill, or text fill, and that a section accepts hex only — real semantic detail the schema omits.

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

Purpose4/5

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

States a specific verb+resource (set FigJam board properties) and a concrete scope (1–500 nodes, applied by node type). It also distinguishes itself from a sibling by routing hex paints 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.

Usage Guidelines4/5

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

Names one clear alternative with a selecting condition ('Hex paints on any node: figma_set_fills'), and specifies per-field node-type applicability. However it gives no broad when-to-use guidance versus other mutation siblings like set_text_properties or edit_table.

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 contentA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
clipsContentYes
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior4/5

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

Annotations cover safety (idempotent, non-destructive, not read-only), and the description adds genuinely new behavior: per-item results where 'one node failing does not fail the call', plus editor coverage (Design verified; FigJam/Slides unverified). It does not mention permission/auth requirements or whether the change is undoable/reversible, so it falls short of fully rich disclosure.

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

Conciseness5/5

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

Front-loaded with the action and target, then usage, then return shape, then platform scope. Every clause carries information (semantics, error handling, platform support) with no filler or restatement of the name.

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

Completeness4/5

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

With no output schema, the description supplies the return contract (`items: [{ id, ok, error? }]`) and partial-failure behavior, plus platform caveats — enough to call it correctly. Minor gaps remain: the 500-node maximum and whether the toggle applies uniformly to instances with nested clipping children are not addressed.

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

Parameters4/5

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

Schema coverage is only 50% (nodeIds and clipsContent are undocumented in the schema), and the description compensates well: it explains what true/false mean semantically and which node types are valid targets. It omits the 500-node batch cap and says nothing about how nodeIds are resolved across files/sessions.

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

Purpose5/5

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

States a specific verb+resource ('Turn "Clip content" on or off on frames, components and instances') and immediately scopes what it applies to, explicitly excluding sections and shapes. An agent can distinguish this from sibling mutation tools like figma_set_mask or figma_set_visible without opening the schema.

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

Usage Guidelines5/5

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

Gives concrete when-to-use for both settings (on = crop photo/overflow to the rounded edge; off = stop a frame cutting off a shadow or overhanging badge) and names the triggering workflow, the check_layout `clipped` finding, tying it to a specific sibling tool. It also states the negative case: sections and shapes get ok:false.

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

figma_set_constraintsSet constraintsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
verticalNo
horizontalNo
idempotencyKeyNoCaller-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

A4.7/5.0
Behavior5/5

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

Beyond the annotations (idempotent=true, destructive=false), it discloses partial-failure semantics ('one node failing does not fail the call') and the per-item return shape, plus the axis-omission rule and editor support. This is meaningful behavioral context the annotations do not carry.

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

Conciseness5/5

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

The core concept is front-loaded, and each following clause earns its place: value lists, axis-omission rule, auto-layout exception, return shape, editor scope. Dense but zero filler.

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

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, it covers what an agent needs: valid values, default axis behavior, failure semantics, return format, and editor applicability. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 40% schema coverage, the description compensates well by spelling out the accepted values for both horizontal and vertical (including Figma's MIN/MAX/CENTER/STRETCH/SCALE aliases) and the omission semantics. It leaves nodeIds (max 500) and session unaddressed, so not fully complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description defines the exact resource and scope: responsive constraints governing how nodes follow their parent frame on resize, with both axes and their accepted values enumerated. The auto-layout caveat ('Children of an auto-layout frame are positioned by the layout instead') distinguishes it from layout-oriented siblings 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear when-not ('children of an auto-layout frame are positioned by the layout') and a usage rule ('omit one axis to keep it'), plus editor applicability. It stops short of naming an explicit alternative tool to use instead, so it lands just under full marks.

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 radiusA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
radiiNo[topLeft, topRight, bottomRight, bottomLeft].
radiusNoSame radius for every corner.
nodeIdsYesNodes to change.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
smoothingNoCorner smoothing 0–1 (0 = circular arcs).
idempotencyKeyNoCaller-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

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: partial failure semantics (one node failing does not fail the call), the return payload shape, and editor support (Design verified; FigJam/Slides unverified). Annotations already cover idempotency and non-destructive nature. The description still doesn't clarify whether this mutates the underlying component or only instances, but the failure and environment details are valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the main action and modes in the first sentence, then layers failure semantics and editor support. Dense but each clause carries operational information. Slightly overloaded with the return-shape example, which could live in an output schema, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers mode selection, smoothing semantics, partial-failure behavior, and environment support. With six parameters and no output schema, the description fills the gap for return values and failure handling. It doesn't explain the interaction between radius and radii (which wins if both are supplied), leaving a small correctness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter is documented in the schema itself. The description reiterates the corner order and the smoothing squircle value (0.6), adding minor user-oriented context beyond the raw schema. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Round) and resource (corners of nodes), and immediately disambiguates the two mutually exclusive modes (radius vs radii) with a per-corner array shape. An agent can distinguish this from siblings like figma_resize_nodes or figma_set_auto_layout without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Notes that `radii` applies to frames and rectangles and that `smoothing` can be set alone, which implies usage constraints. However, it gives no explicit guidance on when to prefer this tool over alternatives like figma_set_auto_layout or figma_set_constraints for corner-adjacent properties, nor any exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_set_descriptionSet descriptionA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
markdownNoTreat `description` as markdown (bold, lists, links). Default false.
targetIdYesA COMPONENT / COMPONENT_SET id, a style id ("S:…,") or a variable id ("VariableID:…").
descriptionNoThe text. "" clears it.
idempotencyKeyNoCaller-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.
documentationLinkNoOne https:// address. "" removes the link.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and idempotentHint=true, so safety and retry semantics are covered. The description goes further with real behavioral facts: only one https link is allowed, an empty string clears the value, variables accept plain text only (no link), and library assets are read-only here. Editor support (Design; unverified FigJam, Slides) adds environment context beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then constraints, then rename routing, then editor support. Dense but each clause carries a distinct rule; only the editor-support sentence is arguably peripheral to the write operation, which keeps it just under a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description covers the meaningful surface of a 6-parameter write tool: valid targets, allowed formats, link limits, clearing behavior, read-only cases, and tool routing. What it returns is not described, which is a minor gap given the write-only nature of the operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds constraints the schema omits: variables take plain text only with no link (relevant to both description and markdown), and the one-link maximum for documentationLink. It still largely restates the target types and clearing behavior already documented on the fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (write) plus the exact resource written (the description and documentation link shown in the assets panel and Dev Mode) and enumerates the applicable target types: component, component set, local style, local variable. It is immediately distinguishable from rename/update siblings because it names those tools explicitly for the rename case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: "A set's description is the one people see — put it there rather than on a variant," and directs rename intent to figma_rename_node, figma_update_style, or figma_set_variable_properties with the exact field. It also states when the tool is unavailable (library assets are read-only) and which editors are supported vs unverified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_set_effectsSet effectsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
effectsYesEffects in Figma's order.
nodeIdsYesNodes to change.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose a non-read-only, idempotent update. The description adds substantive behavior beyond that: empty array removes all effects, validation happens before any node change, fields from other effect types are refused, per-item results isolate failures, and editor support is noted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and effect list, then compactly covers removal semantics, validation, style alternative, return shape, and editor support. Every sentence carries useful information, and the return-shape sentence is especially valuable because no output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex effects-replacement tool, the description covers purpose, validation behavior, partial-failure semantics, alternative style application, supported editors, and the return shape. With the fully documented schema and annotations, an agent has enough context to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all parameter names, defaults, ranges, and nested progressive details are already documented in the schema. The description only restates that progressive can ramp blurs and lists effect types, adding little parameter meaning beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Replace the effects of nodes,' and enumerates the supported effect kinds. It also routes named effect styles to figma_apply_style_to_node, distinguishing this tool from style-creation and style-application siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use figma_apply_style_to_node for named effect styles and frames the tool as replacing node effects. It does not fully state when not to use this versus sibling property setters such as figma_set_fills or figma_set_strokes, so it is clear but not complete when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_set_fillsSet fillsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fillsYesBottom to top, as in Figma's fill list.
nodeIdsYesNodes to change.
opacityNoDefault opacity for entries that do not set their own.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which cover read/write, idempotency, open-world), the description discloses important behavior: all entries are validated before any node mutates, per-item results mean one bad node does not fail the call, and editor support is flagged (Design verified; FigJam/Slides unverified). It also describes the return shape, which is not in any output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then semantics, then routing, then return contract. It is dense and occasionally restates schema detail (the angle convention appears in both), but nearly every clause carries actionable information for a complex nested-schema tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with a deeply nested schema and no output schema, the description covers purpose, per-entry validation, partial-failure semantics, the exact return object, idempotency implications, and environment caveats. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds conceptual grouping beyond the per-field schema text — which gradient type takes `angle` vs `center` vs `radius`, that linear angles use CSS convention and are fitted per node size, and that a stacked `fills` array is ordered bottom-first. This reduces mis-assembly of nested paint objects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource — 'Replace the fill paints of nodes' — and enumerates the payload kinds (solid colours, gradients, images, stacked fills). It explicitly distinguishes itself from figma_apply_style_to_node (named styles) and figma_set_strokes (outlines), 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names alternatives with the condition that selects them: 'to apply a named local style use figma_apply_style_to_node; for outlines use figma_set_strokes', and routes new images to figma_import_image. It also states the empty-fills case ('An empty `fills` removes every fill'). When/when-not guidance is explicit.

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 propertiesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe INSTANCE.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
propertiesYesJSON object, e.g. {"Label": "Buy now", "Size": "Large", "Show icon": "false"}.
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readonly, non-destructive, idempotent behavior, yet the description adds real context: the instance stays linked to its component (i.e. this does not detach), names may omit the #id suffix, SLOTs are out of scope, and editor support is qualified ('Design; unverified: FigJam, Slides'). That editor caveat is exactly the kind of extra signal 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, stays dense but readable, and every sentence contributes (scope, naming rule, companion tools, slot exception, editor support). Slightly information-packed for a single paragraph, but nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers behavior, discovery prerequisites, the slot edge case, and environment caveats. It stops short of describing the return value or failure semantics, which the absence of an output schema leaves unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics beyond the schema: the '#id suffix optional' rule for property names in the JSON, and the SLOT parentId convention. It does not elaborate on session or idempotencyKey, both of which the schema already documents well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Change an instance's component properties') and enumerates the concrete property kinds (label text, variant, boolean, swapped icon), with the analogy 'the way the right panel does'. An agent can distinguish this from component-definition siblings like figma_edit_component_property without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to figma_get_design_context to discover an instance's properties and figma_get_component for available options, and states a clear when-not case ('A SLOT is not set here: create layers inside it (parentId = the slot)'). It does not, however, contrast with adjacent mutation siblings such as figma_set_text or figma_swap_component.

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)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe layer to animate — inside a top-level frame, not the frame itself.
tracksNoOne entry per field.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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.
timelineDurationNoSeconds. Applied as given, even if shorter than the keyframes.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare safety profile (readOnly=false, idempotent=true, destructive=false); the description adds far more: read-back/re-apply semantics, tracks[].status values, timeline object shape, INTERNAL + partial.notApplied failure mode, timeline growth/shrink rules, and the exact refusal list (top-level frame, WIDTH/HEIGHT on group/vector, non-SOLID paint, EASE_IN_OUT spelling). This is exceptional behavioral disclosure beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then failure modes, refusals, prerequisites, and cautions in roughly priority order. It is dense – a long run-on with semicolon-joined clauses – but nearly every clause earns its place. Slightly overpacked for a single paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description supplies the return contract (tracks[].status, timeline {id, duration, topLevelFrameId}) plus failure contract and the full refusal/prerequisite list. Nothing an agent needs to invoke or recover correctly appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema carries the field-level detail, but the description still adds real meaning the schema doesn't state: the 'replace vs. other tracks stay' semantics, the timelineDuration behavior ('Applied as given, even if shorter'), and the tracks:[] + timelineDuration-only edge case. Baseline 3 would understate the added semantics, but it stops short of 5 since most parameter syntax lives in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Animate a layer on its frame's timeline') and immediately scopes the semantics ('each track replaces that field's keyframes; other tracks stay'). It explicitly distinguishes from figma_set_reactions, figma_check_motion, and figma_set_motion_plan, so an agent can select it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-not rules ('Not prototype transitions (figma_set_reactions)'), explicit prerequisites (BRIDGE_PROCESS=strict PROCESS_REQUIRED until motion skill read and figma_set_motion_plan called), and explicit post-call check (figma_check_motion). Also states 'UNSUPPORTED means stop, not retry'. Alternatives and conditions are named.

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 gridsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
gridsYes
nodeIdsYesNodes to change.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, destructive=false, idempotent=true, and the description adds real behavioral content on top: grids render only in the editor and never in exports, an empty array deletes grids, per-item results mean one node failing does not fail the call, and FigJam/Slides support is unverified. These are exactly the traits an agent cannot infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the purpose before behavioral notes, return shape, and editor availability. No filler or restatement of the tool title; every clause carries new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return shape (`{ updated, items: [{ id, ok, error? }] }`) and the partial-failure semantics, which is the main thing an agent would otherwise have to discover blindly. Combined with the removal behavior and editor support notes, nothing needed to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the schema already carries most parameter documentation (session, idempotencyKey, nodeIds, and the nested properties). The description still adds semantic value by giving a concrete grid example ("12 columns, 24 gutter, 80 margin") and by defining the empty-array removal case, which the schema does not express.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Replace the layout grids of frames") and then defines the resource concretely with the three supported patterns (columns, rows, square grid) and a worked example. This is enough to separate it from siblings like figma_create_grid_style and figma_set_slide_grid 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one concrete usage rule ("An empty `grids` removes them") and states editor availability, which is genuinely useful context. However, it never says when to prefer this over figma_create_grid_style or figma_set_slide_grid, nor any prerequisite such as the target nodes needing to be frames. Usage is implied rather than directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_set_lockedSet lockedA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
lockedYes
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds non-annotation behavior: per-item results and the partial-failure contract ("one node failing does not fail the call"), which is genuinely useful for retry/error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action, then the return contract, then environment scope. No filler or redundancy; every sentence carries information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description helpfully inlines the return shape and failure semantics, and the editor/unsupported-surface note sets expectations for FigJam and Slides. It stops short of documenting the 500-node batch ceiling or session-selection behavior, but is complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% — session and idempotencyKey are documented in the schema, while nodeIds (max 500) and locked are not. The description only obliquely conveys the boolean semantics of `locked` via "lock or unlock" and adds nothing about nodeIds batching constraints, so it does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Lock or unlock nodes") that an agent can immediately distinguish from siblings like figma_set_visible, figma_move_nodes, or figma_set_mask. The bidirectional nature of the operation is made explicit rather than left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The "Editors: Design; unverified: FigJam, Slides" line gives environmental applicability, which counts as implied usage guidance, but the description never states when to prefer this over related state-change tools or what conditions warrant locking. No explicit when/when-not or alternatives are provided.

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 maskA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
isMaskNoDefault true; false turns the mask off.
nodeIdYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
maskTypeNo
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare mutating, non-destructive, idempotent behavior, and the description adds real context beyond them: masks crop the layers ABOVE in the same parent, ordering matters, grouping is needed, and editor support is Design (unverified FigJam/Slides). It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then the critical ordering/grouping caveat, then maskType values, then editor availability — each sentence carries distinct information. Slightly dense but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, the non-obvious ordering requirement, maskType detail, and environment support. With no output schema and no return-value contract needed, the only untouched items (session, idempotencyKey) are already fully described in the schema, so it is complete enough to call safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, and the description compensates by explaining maskType semantics beyond the raw enum — alpha (default), vector defined as 'the shape's outline', luminance — and implies the isMask toggle via 'stop it being one'. It does not address session or idempotencyKey, but those are already documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action on a specific resource — 'Make a shape a mask (or stop it being one)' — including the toggle direction, so an agent knows both what it sets and how to undo it. No sibling in the list performs masking, so no further differentiation is required.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong operational context: place the mask BELOW the layers it crops and group them via figma_group_nodes to keep it local, which tells the agent how to invoke it correctly. It does not state when-not-to-use or name an alternative, but no competing mask tool exists, so the practical guidance is adequate.

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 frameA
Idempotent

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. Checked before anything is stored, every problem listed at once: 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), [picture notes] untimed; accents within a frame of the beat grid with bpm; every transition named. Stored on the frame in shared plugin data, so every session sees it; figma_get_motion_context returns it; a new call replaces it. figma_check_motion judges the frame against it: its bpm, holds, brandId, ctaId, and accept, the findings the brief intends (a still open: cold_open), each with its reason. Under BRIDGE_PROCESS=strict (the default) figma_set_keyframes and figma_remove_keyframes refuse a frame without a plan. Editors: Design only.

ParametersJSON Schema
NameRequiredDescriptionDefault
cutsNoPlanned hard cuts, in seconds.
beatsYesThe beat sheet, in order, back to back from 0 to brief.durationS.
briefYesThe motion brief.
ctaIdNoThe call-to-action layer in the frame, for cta_short.
holdsNoIntended stillness, in seconds: what figma_check_motion's `holds` exempts.
acceptNoFindings the brief intends (a still open, a hard-cut grammar, a loop): figma_check_motion lists them in `accepted`, not against ok.
nodeIdYesThe animated top-level frame, or any layer in it (id or Figma link).
brandIdNoThe brand layer in the frame, for figma_check_motion's brand_late.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: 'Checked before anything is stored, every problem listed at once' discloses the validation model and error-reporting shape, including the concrete rules (grid alignment, no gaps/overlaps, max(5/6 s, 0.3 s/word) read time, accents on the beat grid). It also discloses persistence semantics ('stored on the frame in shared plugin data, so every session sees it; a new call replaces it'), which explains the idempotentHint, and the Design-only editor restriction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and packed with load-bearing content — validation rules, storage, downstream consumers — with little filler. However it is delivered as one dense semicolon-chained block, which hurts scannability for a 10-parameter tool; bulleted grouping of validation rules would read better at the same length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex write tool with nested brief/beats/accept objects and no output schema, the description covers what is validated, when errors surface (all at once), where the plan is persisted, who can see it, and which tools read it. There is no output schema, yet the description still conveys the effective response behavior, so 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds rules the schema does not encode: the reading-time heuristic for onScreen copy, '[picture notes] untimed', and the linkage of holds/brandId/ctaId/accept to specific figma_check_motion outputs. These clarify how values are actually consumed downstream rather than restating field names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'Record the plan of one animated top-level frame before animating it.' It also positions itself against the siblings it interacts with (figma_get_motion_context returns it, figma_check_motion judges against it), so an agent can place it in the motion workflow without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the ordering condition ('before animating it') and the hard dependency: under BRIDGE_PROCESS=strict (default) figma_set_keyframes and figma_remove_keyframes refuse a frame without a plan. It also names the editors allowed ('Design only') and tells the caller which sibling returns or consumes the stored plan. This is explicit 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_opacitySet opacityA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
opacityYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safety profile (idempotent, non-destructive, not read-only), so the bar is lower. The description adds genuinely useful behavior beyond that: per-item result shape and the partial-failure contract ('one node failing does not fail the call'), plus editor support caveats. It stops short of noting how locked/invisible or cross-page nodes behave.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, front-loaded with the core action and range then the return/failure semantics. Every clause (range, partial failure, editor support) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema declared, the description usefully specifies the return shape and partial-failure semantics, and flags editor support limits. For a batch mutation tool it is nearly complete; the remaining gap is behavior on locked, invisible, or unmounted nodes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: session and idempotencyKey are well documented in the schema, but the two required parameters nodeIds and opacity carry no schema descriptions. The description restates the 0–1 range, which the schema already enforces via min/max, and adds nothing about nodeIds (e.g., 1–500 items, batch semantics). Baseline 3 for mid coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (set) and resource/property (opacity) with the valid range, so the agent knows exactly what mutation occurs. It does not, however, explicitly contrast itself with adjacent property-setting siblings like figma_set_visible, figma_set_blend_mode, or figma_set_effects, leaving the agent to infer the distinction from the property name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (call it on node IDs to change opacity), and the 'Editors: Design; unverified: FigJam, Slides' note gives useful applicability context. But there is no explicit when-to-use vs. alternative guidance, no prerequisite/permission note, and no statement about when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_set_prototype_flowsSet prototype flowsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flowsNo
pageIdNoDefault: the current page.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
backgroundNoPrototype background, e.g. "#111111".
idempotencyKeyNoCaller-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

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write, idempotent, non-destructive, and the description reinforces this with replace semantics that match idempotentHint=true. It adds genuine behavioral detail beyond the annotations: the ordered-list meaning (first flow = play button start), that each flow must anchor to a top-level frame, and that an empty array wipes all flows.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, then alternates, then ordering constraint, then editor note. Dense but every clause carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param mutation tool with no output schema, it covers replacement semantics, ordering, the reset case, the sibling alternative, and editor availability. Remaining details (session/idempotency behavior) are already carried by 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the schema does most of the work, but the description adds meaning the schema does not: `flows` is an ordered list where position determines play-button start, each `nodeId` must be a top-level frame, and `flows: []` is the reset gesture. These are semantic clarifications rather than restatements.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: replacing a page's prototype flow starting points and prototype background colour. It explicitly names the sibling it is not (figma_set_reactions handles per-layer interactions), so an agent can route 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: replacement semantics, ordering meaning, `flows: []` as the removal path, and the editor scope (Design; unverified FigJam, Slides). It names figma_set_reactions as the alternative for per-layer interactions. It stops short of an explicit when-not-to-use statement, but the context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_set_reactionsSet prototype reactionsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
reactionsYesJSON array of reactions; [] removes all.
idempotencyKeyNoCaller-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

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description's added value is editor coverage (Design verified; FigJam/Slides unverified) and semantic defaults (NAVIGATE, duration in seconds). It does not note that existing interactions are overwritten or whether the op is undoable, which would be the remaining useful disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense paragraph, front-loaded with the operation, then examples, then defaults, then editor support. Every clause earns its place, though the reaction-shape shorthand could be split for scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description supplies the non-obvious payload grammar, editor availability, and defaults, while idempotency retry semantics are handled by the schema. It omits error/failure behavior and the effect on previously existing reactions, which would round it out for a mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only says 'JSON array of reactions; [] removes all', so the description carries real weight: it documents the per-entry shorthand, the trigger/action fields, all three alternative action types (BACK, CLOSE, URL), the transition and duration units, and the default navigation behavior. nodeId is left unexplained, though it is self-evident.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: replace a node's prototype interactions, which an agent can distinguish from figma_get_reactions and figma_remove_reactions by the verb alone. It stops short of explicitly routing the agent away from those siblings, so it is clear rather than fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied rather than spelled out: 'Replace' plus the schema note that '[] removes all' tells the agent when this tool absorbs the clearing case, and the round-trip note ('what figma_get_reactions returns is accepted as is') ties it to a sibling. There are no explicit exclusions or prerequisite statements.

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 layersA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesA frame, component or instance (an instance: `overflow` only).
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
overflowNo
fixedNodeIdsNoDirect children to fix (e.g. a nav bar), bottom to top.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true (which the description doesn't repeat, correctly), but the description adds real behavioural context beyond them: fixed layers are reordered to the top of the layer list, and instances won't have their layers moved at all. Editor support is disclosed with unverified surfaces flagged. It stops short of describing error/failure modes, but the mutation side effects are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded: the purpose and the two knobs come first, constraints and the sibling alternative follow. It is one dense paragraph rather than a list, and the clause about auto-layout/instance rules is tightly packed, but every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description covers what an agent needs for a 5-param mutation tool: effect on layer order, instance limitations, prerequisite for auto-layout, editor support, and the alternative tool for the adjacent behaviour. The retry/idempotency contract is handled by the idempotencyKey schema description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so much is already documented, but the description adds meaning the schema lacks: `fixedNodeIds` ordering ('bottom to top', '[] fixes none') and the empty-array sentinel, plus the instance caveat on `nodeId`. It enumerates the `overflow` values that are already in the enum, which is redundant but harmless.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Prototype scrolling for a frame') and immediately names the two controllable dimensions: `overflow` and `fixedNodeIds`. It explicitly distinguishes itself from figma_set_clips_content ('to cut content off on the canvas use...') and references figma_move_nodes for the absolute-positioning prerequisite, so an agent can place it among siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit alternative and the condition that selects it: presentation behaviour here vs. canvas clipping in figma_set_clips_content. It also states when-not constraints (instances take `overflow` only and must be fixed in the main component; auto-layout frames need absolute positioning first) and the supported editors (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_set_slide_gridRegroup the slide gridA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses that validation happens up front and atomically ('before anything changes'), that bad ids are refused and listed by id, that no slide is ever removed, and what the call returns. It also flags the scope/auth caveat ('Editors: Slides only, unverified'), which the annotations do not carry. Nothing here contradicts readOnlyHint=false, destructiveHint=false or 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense paragraph, but front-loaded with the core action and validation rule before the alternative-tool routing. Every clause carries information, though the semicolon-chained packing makes it slightly harder to scan than an ideally structured definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the return-value burden and does so ('the rows as they are afterwards, how many slides moved and rows were renamed, and rows left empty or removed'). Combined with atomicity, validation and editor-scope caveats, 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the description closes much of the gap with cross-parameter semantics the schema cannot express: the 'every slide exactly once' invariant, row ordering, and the 1–3 word name convention with '' restoring the default label. It does not add anything about `session`, but that gap is minor relative to what it does explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'Restate a whole Figma Slides deck's grouping in one step'. It explicitly names the sibling tools it is not (figma_move_slides for partial moves, figma_rename_node for single-section renames), so an agent can pick it without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use routing ('To move a few slides without restating the deck use figma_move_slides') and a named alternative for the adjacent task ('to rename one section use figma_rename_node on its row id'). It also states the precondition (every slide exactly once) that selects this tool over the incremental siblings.

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 propertiesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slidesYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.8/5.0
Behavior5/5

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 behavioral detail beyond them: markdown subset support vs. literal headings/code/links with a warning, refusal-before-mutation when notes are unsupported, per-slide results, and the editor/scope caveat ('Editors: Slides only, unverified'). That is substantive disclosure the structured fields do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the two properties and their semantics, then the markdown caveats, guidance, failure mode, and sibling routing in that order. Every clause earns its place, though the second half is densely stacked into a single run-on paragraph rather than broken into shorter units.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers everything needed: what changes, markdown limitations, refusal behavior, result granularity ('per-slide results'), and which editor must be active. Acknowledging that the Slides-only restriction is 'unverified' is honest handling of uncertainty rather than a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description supplements it by explaining what `skipped` actually does ('left out of the presentation, kept in the deck'), how `speakerNotes` renders markdown, and that an empty string clears notes. It adds real meaning over the schema, though it does not touch `session` or the idempotency key (both already well documented in the schema).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the exact verb and resource ('per slide of a Figma Slides deck') and names the two properties it controls, `skipped` and `speakerNotes`, with their meanings. It is immediately distinguishable from siblings like figma_set_slide_transition or 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes adjacent concerns to alternatives — slide names to figma_rename_node, backgrounds to figma_set_fills, transitions to figma_set_slide_transition — and gives a when-to policy for notes ('only when asked or for a deck meant to be presented'). It also states the when-not condition (build without speaker notes support causes a refusal).

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 transitionsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
curveNoEasing (EASE_IN_AND_OUT, not EASE_IN_OUT).
delayNoSeconds, with timing after-delay only.
styleYesThe transition style; NONE removes it.
timingNoWhat starts it.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
durationNoSeconds.
slideIdsYes
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the annotations: partial-update semantics ('Fields left out keep each slide's current value'), a pre-flight read with refusal if the build lacks transitions ('nothing changed'), the validation rule that on-click plus delay is refused and coerced to 0, and the return value ('each slide's transition as read back'). Annotations (idempotent, non-destructive, not open-world) already cover safety, so a 4 is warranted rather than 5 – nothing about permissions or partial-failure behavior across 500 slides is stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph that front-loads the action and the enumerable fields, then behavioral caveats, then sibling disambiguation. Every clause carries information, though the packed list of field constraints makes it read more like a spec than a blurb; slightly tight trimming would still be possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no output schema, the description covers mutation semantics, partial updates, refusal/rollback cases, cross-parameter validation, editor scope, and the return value. There is no meaningful gap an agent would need to fill before invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 88% (baseline 3), but the description adds cross-parameter semantics the schema cannot express: duration's 0.01–10 s range, delay's 0–30 s range, that delay only applies with after-delay, and that a delay combined with on-click is refused. That interaction rule is genuine added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set the transition into each of these Figma Slides slides') and immediately lists the controllable fields (style, duration, curve, timing). It then explicitly rules out the two closest siblings, figma_set_reactions and figma_set_keyframes, so the agent can separate this from other motion/prototype 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternatives it is NOT for ('Not prototype interactions (figma_set_reactions) or layer animation (figma_set_keyframes)') and constrains eligibility ('Editors: Slides only, unverified'), which is exactly the when/when-not guidance needed given ~100 sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_set_strokesSet strokesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
capNoEnd decoration of open paths and lines, as in figma_create_line.
joinNoHow corners of the path are joined.
alignNo
colorNoStroke colour, #rgb / #rrggbb / #rrggbbaa.
sidesNoPer-side weights in px — a bottom border, a table-row divider, an input underline.
removeNoRemove every stroke instead; give nothing else with it.
weightNoStroke weight in px.
nodeIdsYesNodes to change.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
gradientNoA gradient stroke instead of `color`.
dashPatternNoDash and gap lengths in px, e.g. [4, 2].
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring non-readOnly, non-destructive and idempotent, the description still adds real context: per-item return shape ('{ updated, items: [{ id, ok, error? }] }') and the partial-failure guarantee that one node failing does not fail the call. It also discloses platform support ('Editors: Design; unverified: FigJam, Slides'), which 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences that lead with the core action and the mutual-exclusion rule, then sides semantics, then the sibling pointer and return contract. Slightly packed but every clause carries information; nothing is redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with nested objects and no output schema, the description supplies the return format, the partial-failure behaviour, the exclusivity rule and platform caveats. Remaining gaps (auth/permission requirements, whether omitted stroke properties are preserved or reset) are minor but real.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92% so the baseline is 3, but the description adds semantics the schema does not encode: the exactly-one-of constraint across color/gradient/remove, and the 'sides' rule that a side left out is 0 while a supplied 'weight' fills the gaps. Those are non-obvious behaviours that materially change invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set the outline (stroke) of nodes') and immediately distinguishes itself from the sibling that handles the other half of the paint model: 'for the inside colour use figma_set_fills'. An agent can route between 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative tool (figma_set_fills) and the condition that selects it, and clarifies that 'remove: true' takes the stroke off entirely. It does not state exclusions or prerequisites (e.g. permission needs), 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_set_textSet textA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYes
contentYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations: it discloses that the current font is loaded first (so foreign text works), that mixed-style nodes are flattened with only the first character's style retained, and that the result carries flattened.runs so the segments can be reapplied. That is exactly the kind of lossy-mutation detail the annotations (destructiveHint=false, idempotentHint=true) do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and scope, then the behavioral caveat about style flattening. The heavy parenthetical nesting makes it dense, but every clause (font loading, style loss, editors) carries real operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, it covers target node types, editor support, font handling, and the risky style-flattening side effect and its recovery path. The main omission is any indication of the response shape or confirmation behavior after a successful set.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: session and idempotencyKey are self-documented in the schema, while nodeId and content have no schema descriptions. The description explains what 'content' semantically replaces and that a node is targeted, but adds no nodeId format or identification guidance, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Replace the content') and resource (TEXT node), then enumerates the additional node kinds it covers (sticky, shape/connector label, code block) and names the sibling to use for tables (figma_edit_table). An agent can distinguish it from figma_create_text and figma_set_text_range 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It routes the agent to alternatives for tables (figma_edit_table) and for restyling after flattening (figma_set_text_range), and states supported editors (Design; unverified FigJam/Slides). It stops short of an explicit when-to-use statement against figma_set_text_properties or figma_find_replace_text, so it is 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_text_propertiesSet text propertiesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseNo
listNoNumbered or bulleted paragraphs; none removes the list.
alignNo
colorNo
weightNoFont weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold").
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
fontSizeNo
maxLinesNoTruncate with an ellipsis after this many lines.
truncateNoTurn ellipsis truncation on or off.
wrapStyleNoFigma's textWrapStyle.
autoResizeNohug = one line that grows; wrap = fixed width, grows down; truncate = a fixed box ending in an ellipsis.
decorationNo
fontFamilyNoA family available in this Figma (figma_suggest_fonts lists ranked ones).
lineHeightNo"auto", px ("24"), or percent ("150%").
leadingTrimNocap-height removes the vertical space above and below the glyphs.
alignVerticalNoWhere the text sits in a box taller than it.
letterSpacingNopx ("0.5") or percent ("-1%").
idempotencyKeyNoCaller-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.
paragraphIndentNopx the first line of each paragraph is offset from the left.
paragraphSpacingNoVertical px between paragraphs.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-read-only, idempotent, non-destructive, but the description adds real behavior beyond them: per-run vs whole-node weight resolution, `fellBack` reporting for substituted fonts, ellipsis truncation via maxLines, board/table text restyling with no alignment/resizing of their own, and per-item failure isolation. That is substantive context an agent cannot derive 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and scope, then semantics, then the alternative and return contract. It is dense and information-rich rather than padded, though a few clauses (editor support, leading trim, wrap style) could be tightened without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by documenting the return shape (`items: [{ id, ok, error? }]`) and partial-failure semantics. Combined with the alternative-tool pointer, edge cases for board/table text, and editor support, 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 21 params and 71% schema coverage, the schema carries most syntax (lineHeight, letterSpacing formats, enum meanings), and the description supplies the taxonomy of properties plus the weight-matching/`fellBack` nuance that the schema only hints at. It does not add format detail for the several params lacking schema descriptions (case, align, color, decoration, fontSize), so it is strong but not exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (change typography on whole text nodes) and enumerates the covered property set, making its scope explicit. It also names the sibling it is not — figma_set_text_range for partial text — so an agent can separate 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit routing rule: 'For part of a text use figma_set_text_range,' and adds applicability per editor context (Design supported; FigJam/Slides unverified). This is exactly the when/when-not/alternative guidance the dimension rewards.

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 textA
Idempotent

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: 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
caseNo
linkNoA URL, or "node:<id>" for a layer in this file.
listNoNumbered or bulleted paragraphs; none removes the list.
colorNo
matchNoThe text to style, e.g. "Pro".
startNo
indentNoList level of the lines, 0–5 (1 = a top-level item); with `list` for nested bullets.
nodeIdYes
weightNoFont weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold").
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
fontSizeNo
fillStyleNoA paint style id or exact name for the text colour.
textStyleNoA text style id ("S:…") or exact name, e.g. "Body/Strong".
variablesNoBind 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.
decorationNo
fontFamilyNoA family available in this Figma (figma_suggest_fonts lists ranked ones).
lineHeightNo"auto", px ("24"), or percent ("150%").
occurrenceNoOnly the nth match. Default: all.
colorVariableNoA COLOR variable name or id, e.g. "color/text/link".
letterSpacingNopx ("0.5") or percent ("-1%").
idempotencyKeyNoCaller-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.
paragraphIndentNopx the first line of each paragraph is offset from the left.
paragraphSpacingNoVertical px between paragraphs.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and the description does not contradict them. It adds real behavioral context beyond the annotations: 'Everything is checked before the text changes' (atomic validation), the single-colour-source constraint, and environment verification status. It stops short of describing failure modes or the returned result, but the additions are substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: scope first, then selection mechanics, then design-system binding, then the colour-source exclusivity caveat, then the sibling pointer and environment note. Every sentence carries information an agent needs; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter mutation tool with no output schema and only 71% schema coverage, this description supplies the critical selection semantics, variable-binding guidance, colour-source constraint and pre-write validation. The gaps (error/return behavior, a few undocumented scalar params) are minor given the annotations and sibling pointer, so it is close to but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 24 parameters and 71% schema coverage, the description compensates well: it explains that paragraph spacing, paragraph indent, list and indent widen to the whole paragraphs the part touches — a non-obvious behavioral rule absent from the schema — plus the exclusivity of color/fillStyle/colorVariable and the 'node:<id>' link form. It does not cover every remaining undocumented parameter (weight, fontSize, case, decoration), so it falls short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a precise verb+resource ('Style part of one text node') and enumerates the concrete use cases (bold word, coloured price, underlined link, bulleted paragraph). It explicitly distinguishes itself from the sibling figma_set_text_properties, which handles whole-node properties, so an agent can route 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: it names the alternative tool for whole-node properties (alignment, resizing, truncation) and states the selection rule (match/occurrence vs start/end). It also flags the editor support matrix (Design; unverified: FigJam, Slides). No explicit 'when not to use' beyond the single sibling pointer, so not quite 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_variable_modeSet variable modeA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoMode name or id, e.g. "Dark". Give this or `clear`.
clearNoRemove the pinned mode instead.
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
collectionIdNo
collectionNameNoOr the collection's exact name.
idempotencyKeyNoCaller-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

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond annotations: idempotentHint is declared but the description explains inheritance semantics, that clear:true removes the pin, that per-item results are returned and one item failing does not fail the whole call, and the editor-support caveat (Design yes; FigJam/Slides unverified). This is rich, non-redundant behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then inheritance rationale, then the clear escape hatch, then return shape and editor support. Dense but every clause carries load; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema and no annotations covering return format, the description supplies return shape, failure semantics, inheritance rules, the clear path, and platform caveats. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 71% and the description adds meaning beyond it: collection may be given by id or name, mode by name or id, and clear:true removes the pin. The idempotencyKey retry semantics are left to the schema, so it does not fully cover the 7 params, but the description meaningfully compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (pin/set a mode) and resource (nodes in a variable mode), and the opening sentence distinguishes it from the sibling family: figma_add_variable_mode creates modes, this one assigns an existing mode to nodes. An agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the key context: without it every node uses the collection's default mode, so a Dark mode can exist but never render. This is a clear when-to-use signal. It lacks explicit named alternatives (e.g. 'to remove the pin use clear:true' is covered, but no pointer to sibling tools), so 4 not 5.

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 propertiesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoRename — only when one variable is targeted.
scopesNoWhich 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.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
codeSyntaxNoThe name in code per platform, e.g. { "WEB": "var(--color-bg-brand)" }. "" removes that platform.
descriptionNo
variableIdsNoGive this or `variableNames`.
variableNamesNoExact full names, e.g. "color/bg/brand".
idempotencyKeyNoCaller-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.
hiddenFromPublishingNoHide it when the file is published as a library.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations by disclosing partial-failure semantics ('one item failing does not fail the call') and the per-item return shape. It also adds behavioral constraints the annotations cannot express: scopes validated against each variable's type, rename only for single-variable targets, and empty string removes a platform.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and fields, then terse routing and return-shape notes; nearly every clause carries information. It is dense with parenthetical asides, which slightly reduces scannability, but there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, nested-object, no-output-schema mutation tool, the description covers the return shape (items with id/ok/error), error isolation, targeting modes, scope validation, and editor support. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 89%, so the baseline is 3, but the description adds meaningful semantics: type-checking of scopes, the one-variable-only constraint on `name`, and the '"" removes a platform' convention for codeSyntax. Some of this restates schema descriptions, so it is value-added rather than transformative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource ('change what a token carries besides its value') and enumerates the exact mutable fields, explicitly excluding values and routing those to figma_set_variable_value. An agent can distinguish this from create_variable, set_variable_value, and set_description without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the sibling alternative for the complementary operation ('Values per mode: figma_set_variable_value') and states the targeting modes (by id or exact name, many at once). It also gives the editor support boundary ('Editors: Design; unverified: FigJam, Slides'), which tells the agent when the call is safe to make.

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 valueA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesThe value for the declared type: "#1a2b3c" for COLOR, "16" for FLOAT, "Inter" for STRING, "true" for BOOLEAN.
modeIdNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
variableIdNoe.g. "VariableID:1:2".
variableNameNoOr its full name, e.g. "color/bg/default".
idempotencyKeyNoCaller-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

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, idempotent=true, and destructive=false, so the bar is lower. The description adds real behavioral context beyond them: modeId defaults to the collection's first mode, the alias syntax creates references to other variables, and it discloses editor support ("Design; unverified: FigJam, Slides"), which is genuinely useful platform-scope information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action, then value formats, then mode behavior, then environment notes. Every sentence carries operational information, though the editor-support clause reads slightly as an addendum.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the value syntax per type, the mode default, aliasing, and editor scope. It does not state failure conditions or whether the target variable must already exist, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83% (above the 80% baseline), yet the description still adds meaning the schema lacks: modeId accepts an id OR a name and defaults to the first mode, and the "alias:..." value form is documented only here, not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Set a variable's value") and adds a scope qualifier ("in one mode") that meaningfully separates it from figma_create_variable and figma_set_variable_properties. It does not explicitly name any sibling, 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The value-format and mode-default details imply how to call the tool, but there is no explicit when-to-use/when-not guidance and no routing to alternatives such as figma_set_variable_properties or figma_bind_variable_to_node. Usage is inferred 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_set_visibleSet visibilityA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
visibleYes
idempotencyKeyNoCaller-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

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (idempotent, non-destructive, not read-only), and the description adds genuinely new behavior: per-item results (`items: [{ id, ok, error? }]`) and the fact that one node failing does not fail the whole call. The editor-support scope (Design verified, FigJam/Slides unverified) is also useful context. It does not cover permission/auth needs or the 500-node cap's implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, front-loaded with the action, then return/error semantics, then environment scope. Nothing is wasted and there is no preamble.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the return contract and partial-failure semantics, which is exactly what an agent needs before batching up to 500 nodes. Remaining gaps (parameter formats, whether hiding is reversible via undo) are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: `session` and `idempotencyKey` are documented in-schema, while `nodeIds` and `visible` are bare. The description implies the boolean semantics of `visible` and ties per-item `id` back to nodeIds, but adds no format, ordering, or batching guidance beyond that, so it neither compensates for the gap nor falls below the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb pair and resource: 'Hide or show nodes'. This is unambiguous and cannot be confused with adjacent siblings like figma_set_locked, figma_set_opacity, or figma_set_mask, which operate on different properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never says when to reach for this tool versus alternatives (set_locked, set_opacity, delete_nodes) or what prerequisites apply. The 'Editors: Design; unverified: FigJam, Slides' note is environment applicability, not usage guidance, so no routing help is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_statusFigma bridge statusA
Read-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 motion process mode and whether the motion skill was read (process), 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real context beyond that: it discloses that the bridge answers this even when no plugin is connected, that the plugin window shows its own token/fingerprint, and enumerates the return fields (auth, process, videoExport, skills). This goes beyond what annotations provide, though it stops short of e.g. rate limits or staleness caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, but the middle clause is a very long enumerated run-on listing every status field, which is hard to parse and borders on over-specification. The critical 'call this first' guidance is buried at the end rather than near the top.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description justifiably describes the returned fields (connections, skills, process, auth, videoExport) and the next-step hint. Combined with the annotations, an agent has enough to invoke and interpret it, though the field list is dense rather than organized.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4. The description appropriately does not invent parameters and instead spends its budget on the return-shape terms the agent needs to interpret.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific diagnostic resource (bridge and plugin connection status) and enumerates the exact fields returned, making it clearly distinct from every sibling figma_ operation tool. An agent can tell this is the status/health 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this first, and whenever another figma_ tool returns NO_SESSION, PORT_IN_USE, or UNSUPPORTED naming an editor.' Both the proactive and reactive triggers are named, and the specific error codes make the routing unambiguous.

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 designA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
useNoWhat the text is for. Default "ui".
moodNoWords for the feel, e.g. "modern minimal", "editorial elegant", "playful", "technical".
limitNoPairings to return. Default 5.
nodeIdNoThe design to fit. Defaults to the selection, then the page.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 componentA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe INSTANCE to swap.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
variantNoFor a set: which variant, e.g. "Size=Large, State=Hover".
componentIdNoThe COMPONENT or COMPONENT_SET to show instead. Exactly one of componentId, componentKey, componentSetKey.
componentKeyNoA published library component's key.
idempotencyKeyNoCaller-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.
componentSetKeyNoA published library component set's key.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, lowering the bar. The description still adds real behavior: overrides are preserved 'where Figma can' (implying partial loss is possible), library components given by key are imported first, and editor support is scoped (Design; unverified FigJam/Slides). It does not state the failure modes when overrides cannot be mapped, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation, then alternatives, then environment constraints; every sentence carries information and none repeats the schema verbatim. It is a single dense paragraph rather than cleanly segmented lines, which is the only reason it is not a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, it covers purpose, routing, prerequisite import behavior, and platform availability, while annotations cover idempotency and non-destructiveness. The idempotencyKey retry semantics live in the schema. It stops short of describing the result of a swap or partial-override-failure behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents nodeId, variant, componentId/componentKey/componentSetKey, and idempotencyKey. The description adds only one genuine nuance beyond the schema — that omitting `variant` yields the set's default variant, and that keyed components are imported first. Useful but marginal against fully documented params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Precise verb+resource ('make an existing instance show a different component') with the exact mechanism spelled out, including the default-variant behavior for component sets. It explicitly distinguishes itself from figma_set_instance_properties and figma_create_instance by name, so an agent can route without opening a sibling schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use routing: '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.' The alternative and the condition selecting it are both stated, plus the library-import prerequisite for key-based swaps.

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)A
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoUndo steps, default 1.
confirmYesMust be true: you have read the warning.
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the critical nuance they cannot: it reverts to the plugin's checkpoint, discarding hand edits made since the last tool call. It also discloses the confirm:true precondition and per-editor verification 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, immediately follows with the WARNING, then the safer alternative, the precondition, and editor support. Dense but every clause carries distinct, load-bearing information with zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no output schema, the description covers the action, the data-loss risk, the safe alternative, the required confirmation, and platform caveats – everything an agent needs to decide and call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so count, confirm, session, and idempotencyKey are all already documented in the schema. The description only reinforces the confirm requirement, adding no syntax or meaning beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and target ("Trigger Figma's undo") plus the exact behavioral scope: it returns to the plugin's last committed checkpoint. This is unambiguous and clearly distinct from all the create/delete/mutation siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the preferred alternative (figma_delete_nodes with ids a create call returned) and the condition that selects it (undoing agent work safely). It also states the when-not case: hand-made user changes will be lost. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

figma_ungroup_nodesUngroupA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYes
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
idempotencyKeyNoCaller-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

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true and idempotent=true, but the description adds real substance beyond them: what is destroyed (the group node itself), where its children go, the partial-failure contract ('one node failing does not fail the call'), the per-item result shape, and editor support bounds (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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core effect, then the scope constraint, then return semantics, then editor support — every sentence mostly earns its place. The 'Each item reports childIds' clause is the one weak spot, adding ambiguity without matching the described result objects.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return contract itself (items: [{id, ok, error?}] with per-item failure isolation), which it does. Combined with the destruction semantics, alternative routing, and editor scope, an agent has everything needed to call this mutation safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%: session and idempotencyKey are documented in the schema itself. nodeIds (the sole required param) has no schema description and the description doesn't clarify it either; 'Each item reports childIds' is ambiguous and does not line up with nodeIds or with the stated result shape. Baseline 3 for mid coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Unwrap groups') and immediately explains the resulting structural change: children move up to the parent and the group disappears. It also explicitly names the sibling it is not (figma_reparent_nodes for frames), 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('Only GROUP nodes') and routes the adjacent-but-different case to the correct alternative ('to move children out of a frame use figma_reparent_nodes'). This is a genuine when/when-not/alternative statement 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 styleA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseNo
nameNoRename the style.
typeNoOnly to tell same-named styles apart.
colorNoA solid colour. Give this or `fills`.
fillsNoSeveral paints or a gradient, entries as in figma_set_fills.
gridsNoReplaces the grids; entries as in figma_set_layout_grids.
weightNoFont weight as a number ("600") or a Figma style name ("Semi Bold" — Inter uses spaces, not "SemiBold").
effectsNoReplaces the effects; entries as in figma_set_effects.
opacityNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
styleIdNoA style id from figma_get_styles.
fontSizeNo
styleNameNoOr its exact name, e.g. "Heading/H1".
variablesNo
decorationNo
fontFamilyNoDefault Inter (create); the style's own family (update).
lineHeightNo"auto", px ("32") or percent ("150%"). A string, not a number.
descriptionNoWhat the style is for — shown in Figma's style picker.
letterSpacingNopx ("0.5") or percent ("-2%"). A string, not a number.
idempotencyKeyNoCaller-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.
paragraphIndentNopx of first-line indent.
paragraphSpacingNopx between paragraphs.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (destructiveHint=false, idempotentHint=true), and the description aligns rather than contradicts it. It adds real behavioral context the annotations cannot carry: refusal semantics ('a field that does not fit the style's kind, and a library style, are refused before anything changes'), in-place propagation to every consuming node, and editor support (Design verified; FigJam/Slides unverified). It does not describe the return payload, which is why it stops at 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The most important fact (in-place change) is front-loaded, and the dense telegraphic style ('Text: font, size, line height, letter spacing, case, decoration, paragraph spacing/indent.') is proportionate to 22 parameters and five style kinds. It is a single long block rather than grouped bullets, so scanning cost is higher than it needs to be, but almost every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter mutation tool with no output schema, the description covers addressing, per-kind fields, variable binding, failure/refusal behavior, caveats, and editor support — enough for an agent to invoke it correctly. The remaining gaps are the response shape and whether omitted fields are left untouched.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Well beyond the 77% schema coverage: it groups fields by style kind (text/fill/effect/grid), explains `variables` binding semantics (text fields by name, a paint's 'color', 'effect.radius', 'grid.count', with `index` for the entry), and states non-obvious behavior such as '`opacity` alone fades every paint and keeps bound colours.' The gradient-angle-on-a-style caveat explicitly resolves a schema field whose per-node description would otherwise mislead here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb + resource and immediately distinguishes itself from the create/delete siblings: 'Change a local style IN PLACE — every node using it follows; deleting and recreating would detach them all.' The agent can tell this apart from figma_create_paint_style, figma_delete_style, and figma_apply_style_to_node without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete routing: address by `styleId` (from figma_get_styles) or `styleName` plus `type`, and explicitly redirects for the gradient-angle case — 'for an exact CSS angle on a known node use figma_set_fills, or give `transform`.' It also implies the when-to-use rationale (in-place edit vs. delete+recreate). What's missing is an explicit when-not-to-use framing and prerequisites such as required permissions, so it lands 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_update_variable_collectionUpdate variable collectionA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.
removeModesNoMode names or ids.
renameModesNo
collectionIdYes
idempotencyKeyNoCaller-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.
hiddenFromPublishingNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint and idempotentHint, but the description adds real substance beyond them: removing a mode deletes the value every variable holds for it, the last mode is never removed, and 'everything is checked before anything changes' documents a transactional guarantee. It does not restate the idempotency annotation, which is fine.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operations, then the destructive warning, then the alternative routing. Dense but nearly every sentence earns its place; the trailing editor note is compact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-param mutation tool with no output schema and 43% schema coverage, the description covers what changes, what gets destroyed, safety of the operation, and the alternative tool. Only session-selection semantics are left entirely to the schema, a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 43%, so the description must carry weight. It maps the core mutating parameters (name, hiddenFromPublishing, renameModes, removeModes) to concrete operations and warns about delete blast radius, but adds no detail on session or idempotencyKey beyond what the schema already documents. Baseline 3 is appropriate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (variable collection) and enumerates the exact operations: rename, hide from publishing, rename modes, remove modes. It even names the sibling figma_add_variable_mode, 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing for one action ('To add a mode use figma_add_variable_mode (paid plans)') and states editor availability. It lacks broader when-not guidance (e.g. how it differs from figma_set_variable_properties or figma_delete_variable_collection), 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_zoom_toZoom to nodesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoFigma Slides only: the grid of all slides, or one slide.
zoomNo"fit" or a zoom level like "1.5".
nodeIdNoOne node.
nodeIdsNoOr several nodes (all on one page).
sessionNoOptional sessionId or file name, to pick a Figma file when more than one is connected.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 133 tool updatesv0.1.1
    • First observedfigma_add_component_property
    • First observedfigma_add_variable_mode
    • First observedfigma_apply_style_to_node
    • First observedfigma_batch
    • First observedfigma_batch_rename_nodes
    • First observedfigma_bind_variable_to_node
    • First observedfigma_boolean_nodes
    • First observedfigma_check_layout
    • First observedfigma_check_motion
    • First observedfigma_clone_node
    • First observedfigma_combine_as_variants
    • First observedfigma_convert_to_component
    • First observedfigma_create_animatic
    • First observedfigma_create_code_block
    • First observedfigma_create_connectors
    • First observedfigma_create_effect_style
    • First observedfigma_create_ellipse
    • First observedfigma_create_frame
    • First observedfigma_create_from_spec
    • First observedfigma_create_grid_style
    • First observedfigma_create_instance
    • First observedfigma_create_line
    • First observedfigma_create_link_preview
    • First observedfigma_create_page
    • First observedfigma_create_paint_style
    • First observedfigma_create_polygon
    • First observedfigma_create_rectangle
    • First observedfigma_create_section
    • First observedfigma_create_shapes_with_text
    • First observedfigma_create_slides
    • First observedfigma_create_slot
    • First observedfigma_create_star
    • First observedfigma_create_stickies
    • First observedfigma_create_storyboard
    • First observedfigma_create_table
    • First observedfigma_create_text
    • First observedfigma_create_text_style
    • First observedfigma_create_variable
    • First observedfigma_create_variable_collection
    • First observedfigma_create_variables
    • First observedfigma_create_vector
    • First observedfigma_delete_component_property
    • First observedfigma_delete_nodes
    • First observedfigma_delete_style
    • First observedfigma_delete_variable
    • First observedfigma_delete_variable_collection
    • First observedfigma_detach_instance
    • First observedfigma_download_assets
    • First observedfigma_edit_component_property
    • First observedfigma_edit_connectors
    • First observedfigma_edit_table
    • First observedfigma_export_frames_to_pdf
    • First observedfigma_export_node
    • First observedfigma_export_video
    • First observedfigma_find_replace_text
    • First observedfigma_fit_sections
    • First observedfigma_flatten_nodes
    • First observedfigma_get_annotations
    • First observedfigma_get_component
    • First observedfigma_get_design_context
    • First observedfigma_get_fonts
    • First observedfigma_get_guide
    • First observedfigma_get_library_variables
    • First observedfigma_get_local_components
    • First observedfigma_get_metadata
    • First observedfigma_get_motion_context
    • First observedfigma_get_node
    • First observedfigma_get_nodes_info
    • First observedfigma_get_pages
    • First observedfigma_get_reactions
    • First observedfigma_get_selection
    • First observedfigma_get_slide_grid
    • First observedfigma_get_styles
    • First observedfigma_get_variable_defs
    • First observedfigma_group_nodes
    • First observedfigma_import_image
    • First observedfigma_import_library_assets
    • First observedfigma_import_svg
    • First observedfigma_move_nodes
    • First observedfigma_move_slides
    • First observedfigma_navigate_page
    • First observedfigma_remove_keyframes
    • First observedfigma_remove_reactions
    • First observedfigma_rename_node
    • First observedfigma_reorder_nodes
    • First observedfigma_reparent_nodes
    • First observedfigma_reset_slot
    • First observedfigma_resize_nodes
    • First observedfigma_review_video
    • First observedfigma_rotate_nodes
    • First observedfigma_save_screenshots
    • First observedfigma_scan_nodes_by_types
    • First observedfigma_scan_text_nodes
    • First observedfigma_search_nodes
    • First observedfigma_select
    • First observedfigma_set_auto_layout
    • First observedfigma_set_blend_mode
    • First observedfigma_set_board_properties
    • First observedfigma_set_clips_content
    • First observedfigma_set_constraints
    • First observedfigma_set_corner_radius
    • First observedfigma_set_description
    • First observedfigma_set_effects
    • First observedfigma_set_fills
    • First observedfigma_set_instance_properties
    • First observedfigma_set_keyframes
    • First observedfigma_set_layout_grids
    • First observedfigma_set_locked
    • First observedfigma_set_mask
    • First observedfigma_set_motion_plan
    • First observedfigma_set_opacity
    • First observedfigma_set_prototype_flows
    • First observedfigma_set_reactions
    • First observedfigma_set_scroll_behavior
    • First observedfigma_set_slide_grid
    • First observedfigma_set_slide_properties
    • First observedfigma_set_slide_transition
    • First observedfigma_set_strokes
    • First observedfigma_set_text
    • First observedfigma_set_text_properties
    • First observedfigma_set_text_range
    • First observedfigma_set_variable_mode
    • First observedfigma_set_variable_properties
    • First observedfigma_set_variable_value
    • First observedfigma_set_visible
    • First observedfigma_status
    • First observedfigma_suggest_fonts
    • First observedfigma_swap_component
    • First observedfigma_undo_step
    • First observedfigma_ungroup_nodes
    • First observedfigma_update_style
    • First observedfigma_update_variable_collection
    • First observedfigma_zoom_to

TDQS

B3.4/5.0

Scored across 133 tools

Disambiguation3/5

Descriptions are exceptionally detailed and often explicitly point to the right sibling tool, but with 133 tools there are many closely related operations (e.g., figma_get_node vs figma_get_nodes_info, figma_set_text vs figma_set_text_range vs figma_set_text_properties, figma_move_nodes vs figma_reparent_nodes vs figma_reorder_nodes, and several export/check tools). An agent can usually disambiguate with effort, but the sheer number and overlapping boundaries will cause occasional misselection.

Naming Consistency5/5

Every tool uses the same predictable pattern: the `figma_` prefix followed by snake_case verb_noun (e.g., figma_create_variable, figma_get_design_context, figma_set_fills, figma_delete_nodes). There are no camelCase or mixed-style exceptions, making the set highly consistent and readable.

Tool Count1/5

133 tools is an extreme mismatch for an MCP tool surface, far beyond the typical 3–15 range and well past the 50+ threshold for a severe overload. Even accounting for the broad Figma Design/FigJam/Slides/motion domain, the count makes the set unwieldy for an agent to navigate.

Completeness5/5

The surface covers create, read, update, and delete for nodes, variables/tokens, styles, components, instances, prototypes, FigJam boards, Slides decks, and motion, plus export and review workflows. No obvious lifecycle gaps remain for the stated Figma automation purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that provides write access to Figma through the Plugin API, enabling AI agents to create, modify, and manage Figma designs programmatically.
    23
    -
  • A
    license
    B
    quality
    A
    maintenance
    A 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.
    12
    16 npm
    1
    MIT