Skip to main content
Glama


figmcp is a local MCP server that gives your coding agent the Figma file you have open in Figma Desktop. A development plugin streams the file to a server on your machine over localhost, so reads never touch the Figma REST API: no access token, no quota, no rate limit.

  • Design to code. Flutter widgets for Flutter projects, React + Tailwind for everything else, with the assets and a screenshot to compare against.

  • Design in Figma. The agent creates and edits frames in the open file with Figma plugin API scripts, one undo step per script.

  • Your components. Map design components to code components with Code Connect.

  • Works offline. Read saved snapshots when the plugin is closed.

  • Any plan. Works on every Figma plan, including the free Starter plan. No Dev Mode seat needed.

Works with Claude Code, Cursor, Claude Desktop and any MCP client that runs stdio servers.

Quick start

Needs Node.js 18+ and Figma Desktop on macOS or Windows.

1. Run setup

npx -y @irshad.io/figma-local-mcp@latest setup

It registers the server with Claude Code, copies the Figma plugin to your home folder, and prints your pairing code and the config for other MCP clients.

2. Import the plugin (once)

In Figma Desktop, go to Plugins › Development › Import plugin from manifest… and choose:

macOS

Windows

~/.figma-local-mcp/plugin/manifest.json

%USERPROFILE%\.figma-local-mcp\plugin\manifest.json

On macOS, press ⌘ ⇧ G in the file picker and paste the path. On Windows, paste it into the File name box.

3. Pair and ask

Restart your coding agent. In Figma Desktop, run Plugins › Development › figmcp and enter the pairing code. The dot turns green once it's connected. Then select a frame and ask:

implement the selected Figma frame

Keep the plugin window open while you work. Full guide: figmcp.web.app/docs/installation.

Related MCP server: figma-proxy-mcp

Usage

Design to code

Select a frame, or paste a Figma link that has a node-id:

implement this frame as a Flutter screen and match the spacing exactly
build this frame as a React component with Tailwind, using our existing Button
compare your screen with the Figma screenshot and fix the differences

Projects with a pubspec.yaml get Flutter widgets, and SVGs and images are saved into the asset folders the pubspec declares. Everything else gets React + Tailwind. The code is a reference that your agent adapts to your project. More →

Design in Figma

Open the file in Figma Desktop, run the plugin and ask:

design a settings screen for a 390x844 phone in Figma
add a dark mode version of the selected frame next to it

The agent builds the design with use_figma and checks each step with a screenshot. Each script is one undo step. More →

Code Connect

map the selected button to AppButton in lib/widgets/app_button.dart
which components in this frame are not mapped yet?

Mapped instances come back as your own components. Mappings are saved in .figma-local/code-connect.json in your project. More →

MCP clients

Claude Code is registered by setup. Restart it and check with /mcp.

Cursor, Claude Desktop and other clients: add the config that setup prints. It looks like this, with paths for your machine:

{
  "mcpServers": {
    "figma-local": {
      "command": "/usr/local/bin/node",
      "args": ["/Users/you/.figma-local-mcp/app/node_modules/@irshad.io/figma-local-mcp/bin/figma-local-mcp.js"]
    }
  }
}

Client

Config file

Cursor

~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project)

Claude Desktop (macOS)

~/Library/Application Support/Claude/claude_desktop_config.json

Claude Desktop (Windows)

%APPDATA%\Claude\claude_desktop_config.json

Step-by-step for each client, on macOS and Windows: figmcp.web.app/docs/configuration.

Tools

Tool

What it does

get_design_context

Reference code (Flutter or React + Tailwind), assets, a screenshot and variables for a node. The main tool.

get_metadata

Layer tree as XML: ids, types, names, positions and sizes.

get_screenshot

PNG of a node or the selection.

get_variable_defs

Variables and styles used by a node, resolved for its mode.

download_assets

Exported renders, original image fills and vector SVGs.

verify_code

Render Flutter code with flutter test and compare it with Figma's render: analyzer and runtime errors, differing pixels and a diff image.

use_figma

Run Figma plugin API scripts to create and edit designs.

search_design_system

Components (with properties and variants), styles and variables of the open file, to reuse while designing.

place_image

Put a local PNG, JPG, GIF or SVG into the open file, as a new layer or a layer's fill.

get_code_connect_map

Which instances map to which code components.

add_code_connect_map

Map a design component to a code component.

remove_code_connect_map

Remove a component mapping.

whoami

Connection status, pairing code, open file, selection and snapshots.

save_design_export

Write a full design export of a node to JSON.

import_design_export

Load an export JSON as a snapshot.

Arguments for each tool: figmcp.web.app/docs/tools.

How it works

Figma Desktop  ── WebSocket 127.0.0.1:3947 ──▶  figma-local-mcp  ── MCP stdio ──▶  Coding agent
(dev plugin)       paired with your code        (node server)                     (Claude Code, Cursor, …)

The plugin reads the open file with the Figma plugin API and runs the scripts your agent sends. The server turns that into code, assets, screenshots and metadata. When the plugin is closed, reads fall back to the newest saved snapshot. More →

Configuration

Set these in the env of your MCP client config.

Variable

Default

Description

FIGMA_LOCAL_MCP_DIR

~/.figma-local-mcp

Data folder: plugin, pairing code, snapshots and assets.

FIGMA_LOCAL_MCP_FRAMEWORK

Force flutter or react when the client doesn't say.

FIGMA_LOCAL_MCP_CODE_CONNECT

.figma-local/code-connect.json

Path of the Code Connect mappings file.

FIGMA_LOCAL_MCP_ALLOW_ORIGINS

Comma separated extra origins the server accepts for the plugin.

Update

npx -y @irshad.io/figma-local-mcp@latest setup

Then restart your coding agent and run the plugin again. The plugin updates itself, so there's no need to import it again.

Troubleshooting

  • The dot stays grey: start your coding agent first, then run the plugin again.

  • Lost the pairing code: run setup again, or ask your agent to run whoami.

  • use_figma can't edit the file: switch the file from Dev Mode back to Design mode.

More fixes: figmcp.web.app/docs/troubleshooting. Still stuck? Open an issue with the output of whoami.

Development

npm install
npm test

Path

What

bin/, src/

The MCP server, plugin bridge and code generators

plugin/

The Figma development plugin

tools/

Visual and Flutter checks for generated code

test/

Tests (node --test)

web/

The website and docs (figmcp.web.app), Next.js on Firebase Hosting

To work on the site: cd web && npm install && npm run dev. To publish it: npm run deploy.

License

MIT

Figma is a trademark of Figma, Inc. This project is not affiliated with Figma, Inc.

Available Tools

15 tools
add_code_connect_mapA

Map a design component to a code component, so get_design_context names the code component for every instance of it. Pass an instance, component or component set id; a component in a set maps the whole set.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoFramework, e.g. Flutter or React.
nodeIdYesThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
sourceYesPath of the code component in the project.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
componentNameYesCode component name, e.g. AppPrimaryButton.

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose one genuinely non-obvious behavioral trait: mapping a component inside a component set maps the entire set. It also discloses the cross-tool effect on get_design_context. However, it says nothing about whether an existing mapping is overwritten, whether the mapping persists across sessions, or what a successful call returns.

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, and the purpose plus downstream benefit are front-loaded before the input-scope caveat. Every clause earns its place.

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 annotations and no output schema, the description covers purpose, target selection, and the set-wide side effect, but omits overwrite/conflict behavior on re-mapping and any indication of the response. It is adequate to make the call correctly but not fully sufficient to predict the result.

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, and the description earns above baseline by explaining that nodeId may be an instance, a component, or a component set id and by clarifying the scope consequence of choosing a component inside a set. That scope semantics is behavior the schema's pattern-only nodeId 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 verb+resource ('Map a design component to a code component') and immediately names the downstream effect on get_design_context, which cleanly separates it from the sibling get_code_connect_map (read) and remove_code_connect_map (delete). An agent can identify this as the write-side of the Code Connect mapping trio 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 Guidelines3/5

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

The description implies when this matters ('so get_design_context names the code component for every instance of it') and constrains which node types may be passed, but it never states when to prefer this over remove_code_connect_map/get_code_connect_map, nor any prerequisites or conditions under which it should not be called. Usage is inferable rather than stated.

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

download_assetsA

Download assets for a single node: an exported render (export), the original images used as fills (rawImages, up to 20) and SVGs of the vector layers (svgAssets, up to 20). defaultFormat and defaultScale set the export format (png, jpg, svg, pdf) and scale (default png at 1).

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
defaultScaleNo
defaultFormatNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations present, the description carries the full burden, and it does disclose useful behavior: three distinct output categories with caps (up to 20 rawImages, up to 20 svgAssets) and default formatting. It omits where downloads land, whether anything is mutated, and error/limit behavior beyond the counts.

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 packed sentences with no filler; the what-is-downloaded inventory is front-loaded before the format/scale controls. 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 tool with no output schema and no annotations, the description effectively substitutes as a return-value spec by naming the three asset groups and their caps, plus format/scale defaults. It stops short of describing response shape or failure modes, but covers what an agent needs 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 50% and the two undocumented parameters are exactly the ones the description explains: defaultFormat (png, jpg, svg, pdf) and defaultScale (default png at 1). This meaningfully compensates for the gap, though the scale's 0.01-4 bounds and the fileKey no-op behavior are not restated.

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 (Download) and resource (assets) for a single node, then enumerates exactly what is produced: `export`, `rawImages`, and `svgAssets`. It does not, however, differentiate itself from overlapping siblings such as get_screenshot or save_design_export.

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 get_screenshot, save_design_export, or place_image, nor does it state prerequisites or exclusions. Usage is only implied by the enumerated asset types, leaving the agent to infer the route.

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

get_code_connect_mapA

Get the mapping from the component instances in a node to code components: { nodeId: { codeConnectName, codeConnectSrc, label } }, plus the components that are not mapped yet. Mappings live in the project (.figma-local/code-connect.json under the working directory).

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.

TDQS

A3.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does add genuine context: it composes the response into mapped vs unmapped components and discloses where the data lives (.figma-local/code-connect.json under the working directory), which implies a local read. It does not discuss permissions needed to read the file or whether it can fail.

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 content is packed into essentially one compound sentence with the return shape front-loaded and no filler. It is dense but not padded, and every clause 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?

There is no output schema, so the description usefully explains the return value itself (the nodeId-keyed mapping and the unmapped components). The remaining gap is usage context relative to the add/remove siblings, but for a read tool with a 100%-covered schema and full return description it is largely complete.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both parameters (including that nodeId can be omitted to use the current selection, and that fileKey is accepted only for compatibility). The description mentions operating on 'a node' but adds no syntax or format detail beyond the schema, so the baseline of 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 names a specific verb (Get) and resource (the code-connect map), and details what is returned: a nodeId-to-code-component mapping plus the components not yet mapped. It is clearly distinguishable from add_code_connect_map and remove_code_connect_map by name and semantics, though it never explicitly names those siblings.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives like add_code_connect_map, remove_code_connect_map, or the other read tools. The read-only intent is only implied by the word 'Get'. An agent gets no explicit routing guidance.

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

get_design_contextA

Get design context for a Figma node — the primary tool for design-to-code workflows. Returns reference code (Flutter widgets for Flutter projects, React + Tailwind otherwise), the assets it uses, a screenshot and the variables in the node. The code must be adapted to the target project. Use the nodeId parameter to specify a node id; from a URL like https://figma.com/design/:fileKey/:fileName?node-id=1-2 the node id is 1:2. With no nodeId the current selection in Figma is used. Large nodes return metadata instead of code unless forceCode is set.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
screenNoFlutter: draw the node as a phone screen that fills the screen and scrolls when tall (default: portrait frames 300-480 wide).
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
assetsDirNoFlutter: folder of the asset paths in the code (default: the svg/png/images folders of the project's pubspec.yaml, else assets/figma).
forceCodeNoAlways return code, even for very large nodes.
frameworkNoCode to generate: flutter or react. Default: from clientFrameworks / clientLanguages, else FIGMA_LOCAL_MCP_FRAMEWORK, else flutter when the project has a pubspec.yaml, else react.
screenUtilNoFlutter: write lengths with flutter_screenutil (.w, .h, .r, .sp) so the layout scales from the design size (default: when the project's pubspec.yaml depends on flutter_screenutil).
skillNamesNoAccepted for compatibility (logging only).
clientLanguagesNoComma separated languages of the client, e.g. "dart" (picks the framework).
clientFrameworksNoComma separated frameworks of the client, e.g. "flutter" (picks the framework).
excludeScreenshotNoLeave the screenshot out of the response.
disableCodeConnectNoDraw mapped components from their layers instead of naming the code component.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses the return payload (reference code, assets, screenshot, variables), that the code must be adapted to the target project, framework-dependent output, and the large-node fallback governed by forceCode. This is material behavioral context 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?

Dense but front-loaded: purpose first, then return contents, then nodeId usage, then the large-node caveat. Every sentence contributes actionable 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?

For a 12-parameter tool with no annotations and no output schema, the description covers the critical behaviors (output shape, framework selection, node targeting, size fallback). Remaining per-parameter Flutter nuances (screen, assetsDir, screenUtil) are left to the schema, which documents them at 100% 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond the schema by explaining the Figma URL → node id translation ('node-id=1-2' becomes '1:2') and the selection default, which the schema only partly 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 a specific verb+resource ('Get design context for a Figma node') and explicitly positions itself as 'the primary tool for design-to-code workflows', distinguishing it from siblings like get_screenshot and get_metadata. It also enumerates the concrete artifacts returned (code, assets, screenshot, variables).

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?

Give clear operational context: nodeId specifies the node, the URL-to-node-id mapping is spelled out, and omission falls back to the current Figma selection. It also warns when large nodes yield metadata rather than code. It stops short of naming alternative siblings or 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.

get_metadataA

IMPORTANT: Always prefer to use get_design_context. Get metadata for a node or page in XML format: node IDs, layer types, names, positions and sizes, useful for an overview of the structure. nodeId can be a page id (e.g. 0:1). When nodeId is omitted, returns the pages of the document (and saved snapshots) instead. When something is selected in Figma, the response starts with a "Currently selected nodes:" block.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden and largely meets it: it discloses the XML output format, the default behavior when nodeId is omitted (returns pages and saved snapshots), and the injected 'Currently selected nodes:' block when a selection exists. It does not discuss result size limits or permission requirements, which is a modest omission for a read-only 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 routing warning is front-loaded ahead of the functional description, which is the right order for an agent deciding between tools. Sentences are dense and mostly earn their place, though the parenthetical page-id example slightly overlaps with schema documentation.

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 and no annotations, the description must convey the return shape, and it does reasonably well: XML structure, field set, page-mode fallback, and the selection block. It stops short of noting what it deliberately omits (styles, variables, text content), which would help an agent decide against 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 100%, so the baseline is 3, but the description adds genuine meaning: nodeId may be a page id (e.g. 0:1), and omitting nodeId returns the document's pages rather than merely 'using the current selection' as the schema states. It also clarifies that fileKey is accepted for compatibility only and the desktop file is always used.

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 ('Get metadata for a node or page'), names the exact output format (XML), and enumerates the fields returned (node IDs, layer types, names, positions, sizes). It also explicitly positions itself against the sibling get_design_context, 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 Guidelines4/5

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

It names the alternative (get_design_context) and strongly deprioritizes itself with 'Always prefer to use get_design_context.' The implied use case ('useful for an overview of the structure') gives context, but it never states the positive condition under which this tool is the right pick, so it falls short of the full when/when-not/alternatives bar.

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

get_screenshotA

Generate a screenshot for a given node or the currently selected node in Figma. maxDimension (default 1024) caps the longer edge of the PNG (up to 2x the node size). The response gives a local URL and file path plus width/height and original_width/original_height. Set enableBase64Response to also get the image inline.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
contentsOnlyNoRender the node in isolation, without overlapping content.
maxDimensionNoLongest edge of the PNG in pixels (default 1024).
enableBase64ResponseNoAlso include the PNG inline as base64.

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the burden and largely does so: it discloses the return payload (local URL, file path, width/height, original_width/original_height) and the resolution-capping behavior (maxDimension, up to 2x node size). It does not explicitly state side effects, permissions, or whether the file key is ignored beyond the schema note, but the payload disclosure is genuinely useful context.

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

Conciseness5/5

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

Three dense sentences, front-loaded with what the tool does, then resolution semantics, then return shape. No filler or restatement of the name; every sentence carries new 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?

There is no output schema, so the description correctly takes on the return-shape explanation, and a 5-param tool with full schema coverage is otherwise well served. The one gap is that contentsOnly is never explained in prose, leaving its practical effect to the schema alone.

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: maxDimension "caps the longer edge," clarified as up to 2x node size, and enableBase64Response is framed as getting the image inline. It omits contentsOnly and fileKey behavior, which the schema covers instead.

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 ("Generate a screenshot") plus the target scope ("a given node or the currently selected node in Figma"). This distinguishes it from data-oriented siblings like get_metadata or get_design_context, but it never names an alternative, so the differentiation is implicit 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 Guidelines3/5

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

Usage is only implied: "Omit it to use the current selection in Figma" tells the agent what happens without a nodeId, and "Set enableBase64Response to also get the image inline" hints at a workflow preference. There is no when-to-use-this-vs-download_assets or get_design_context guidance and no exclusions.

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

get_variable_defsA

Get variable definitions for a given node id. E.g. {'icon/default/secondary': #949494}. Variables and styles are reusable values applied to colours, fonts, sizes and spacings. Values resolve for the node's own mode. Read-only; with no nodeId it uses the selection. Use it for design tokens, and get_design_context for the layout. Without the plugin, a saved snapshot gives the raw values only, without names.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.

TDQS

A4.6/5.0
Behavior5/5

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

No annotations exist, so the description carries the whole burden, and it does so well: it declares the operation read-only, discloses the no-nodeId default, explains that values resolve against the node's own mode, and warns that without the plugin a saved snapshot yields raw values without names. These are non-obvious behaviors an agent could not 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.

Conciseness4/5

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

Front-loads the core purpose and the example, then packs routing and caveats into a few tight sentences. The clause defining variables and styles is useful background but is the least load-bearing sentence; otherwise there is no 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 two optional params, no output schema, and no annotations, the description supplies everything needed: what comes back (example value shape), how the node is chosen, how values are resolved, and what changes when the plugin is unavailable. Nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented in the schema, including the omit-to-use-selection behavior and the fileKey compatibility note. The description adds only the mode-resolution context for the returned values, not node syntax or fileKey semantics. Baseline 3 is warranted.

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

Purpose5/5

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

States a specific verb+resource ('Get variable definitions for a given node id') and grounds it with a concrete example value. It also pre-empts confusion with the get_design_context sibling by stating 'Use it for design tokens, and get_design_context for the layout.' The scope (resolvable design tokens attached to a node) is unambiguous.

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

Usage Guidelines5/5

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

Explicitly names when to use it ('design tokens') and names the alternative (get_design_context for layout), plus states the fallback when no nodeId is supplied ('with no nodeId it uses the selection'). It also flags the degradation path when the plugin is absent, which tells the agent when the output can and cannot be trusted for names.

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

import_design_exportA

Save a design export JSON (frames with node trees, as the plugin produces) as a snapshot, so its nodes can be read without the plugin. Use it for an export made earlier with save_design_export or the plugin. Copies the file into the local snapshot store, replacing an earlier snapshot of the same frames; the source file and the Figma file are not changed. Fails if the JSON is not a design export.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path of the export JSON file.

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses that the file is copied into a local snapshot store, that an earlier snapshot of the same frames is replaced (overwrite/idempotency semantics), and that the source file and the Figma file are left unchanged. It also states the failure mode for non-export JSON. This is unusually rich behavioral disclosure for an unannotated 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?

Four sentences, all of which carry information, with the core purpose front-loaded before the operational details. It is slightly denser than needed but there is no padding or repetition.

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

Completeness4/5

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

For a one-parameter, unannotated tool with no output schema, the description covers mutation semantics, source safety, and failure behavior, which is most of what an agent needs. It stops short of describing what the call returns (e.g., a snapshot handle) that would be read back later, which is the only meaningful 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 coverage is 100% and the sole parameter already documents itself as 'Absolute path of the export JSON file.' The description adds context about what that JSON should contain ('frames with node trees, as the plugin produces'), but no new syntactic or format guidance. Baseline 3 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+resource (import a design export JSON as a snapshot) and explains the payoff ('so its nodes can be read without the plugin'). It explicitly separates itself from the sibling that produces such exports ('an export made earlier with save_design_export or the plugin'). An agent can distinguish it from save_design_export 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 for when to reach for it ('Use it for an export made earlier with save_design_export or the plugin') and names the failure condition ('Fails if the JSON is not a design export'). It does not spell out an explicit when-not-to-use case or a preferred alternative for other situations, 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.

place_imageA

Put an image file from this computer into the file open in Figma Desktop: a PNG, JPG or GIF becomes a rectangle with the image fill (or the fill of the layer nodeId), and an SVG becomes editable vector layers. Use it for the project's own assets (logos, icons, photos) while designing; use_figma with figma.createImageAsync(url) takes images from the web. The new layer goes into parentId (default: the current page, right of its content), sized by width/height (one keeps the aspect ratio; default: the image's own size). Images larger than 4096 px on a side are scaled down by Figma.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
nameNoLayer name (default: the file name).
pathYesPath of the image file (absolute, or relative to the project).
widthNo
heightNo
nodeIdNoSet the image as the fill of this layer instead of making a new one (not for SVG).
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
parentIdNoFrame or group to put the new layer in.
keepFillsNoWith nodeId: add the image above the existing fills instead of replacing them.
scaleModeNoHow the image fills the layer (default FILL).

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so well: it discloses format-dependent results, that nodeId replaces/creates fills (and is invalid for SVG), where the new layer is placed by default, how sizing defaults work, and a real platform constraint ('Images larger than 4096 px on a side are scaled down by Figma'). It also warns that fileKey is ignored in favor of the open desktop file.

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 with zero filler; the core action leads, followed by format outcomes, the alternative tool, and placement/sizing defaults. Every clause carries information an agent needs to call it correctly.

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-parameter mutation tool with no annotations and no output schema, the description covers outcomes, placement, sizing, limits, and the sibling alternative. It stops short of describing what is returned (e.g., the created layer's id) and leaves x/y and scaleMode/keepFills entirely to the schema, which is a minor but 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?

Schema coverage is 64%, and the description compensates on the weakest spots: width/height have no schema description but are explained ('one keeps the aspect ratio; default: the image's own size'), as are nodeId, parentId defaults, and fileKey. However x/y placement and scaleMode/keepFills behavior get no narrative treatment in the description beyond their 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 ('Put an image file from this computer into the file open in Figma Desktop') and immediately names the outcome variants (raster -> image-fill rectangle, SVG -> editable vectors). It explicitly contrasts itself with the sibling use_figma, 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 an explicit when-to-use rule ('Use it for the project's own assets (logos, icons, photos) while designing') and names the alternative with its exact call signature ('use_figma with figma.createImageAsync(url) takes images from the web'). It also states a within-tool branch condition (nodeId applies to fills and is not for SVG).

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

remove_code_connect_mapA

Remove the code component mapping saved by add_code_connect_map, so get_design_context stops naming that code component. Pass an instance, component or component set id. Only the local mapping file changes, never the design; returns how many mappings were removed (0 when none existed). Add it again with add_code_connect_map to undo.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that only the local mapping file changes and never the design, and that the return value is the number of mappings removed (0 when none existed). It omits auth/permission requirements and any side effects on other consumers, so it is not exhaustive.

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

Conciseness5/5

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

Front-loaded with the action and effect, then the parameter, then the scope guarantee and return value, closing with the undo path. Every clause 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?

For a simple two-parameter mutation with no annotations and no output schema, the description covers the action, its scope limitation, the return value, and the reversal path. 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.

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 nodeId (with pattern and instance-id examples) and fileKey. The description adds only that an instance, component or component set id is acceptable, which is largely redundant with the schema. Baseline 3 applies 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 (Remove) and resource (the code component mapping), and immediately scopes it against siblings by naming add_code_connect_map as the source and get_design_context as the consumer. An agent can distinguish it from add_code_connect_map/get_code_connect_map 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 clear context: use it to stop get_design_context from naming a component, and points to add_code_connect_map as the inverse operation to undo. It does not explicitly state exclusions or prerequisites (e.g. permissions, whether the node must currently be mapped), so it stops short of a full when/when-not treatment.

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

save_design_exportA

Write a full design export of a node (default: the selection) to a JSON file: the node tree with every layout, paint, text, variable, style, component and interaction detail, icon SVGs, renders of masked or rotated groups, image fills and a 2x preview. Mapped components carry their code component. Use it to hand a frame to a build script.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoAbsolute .json path to write (default: the data folder).
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses the default target (the selection), the default destination (data folder), and exactly what the file will contain (tree, paints, styles, SVGs, renders, 2x preview). It stops short of file-level side effects such as overwriting an existing path or failure behavior.

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

Conciseness4/5

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

Two sentences, front-loaded with the action and scope, followed by a short purpose statement. The content list in sentence one is long but each item is informative 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?

No output schema and no annotations, yet the description explains what gets written to disk, where, and from which node, which is everything an agent needs for a file-writing export tool. Return value detail is unnecessary since the artifact is the JSON file itself.

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 path, nodeId and fileKey, including the 'omit to use the current selection' default and the fileKey compatibility note. The description repeats the selection/path defaults without adding syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Write a full design export of a node ... to a JSON file') and scopes the default operand (the selection). The enumeration of exported content clearly separates it from siblings like import_design_export, download_assets and get_screenshot.

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?

One use case is given ('hand a frame to a build script'), which implies when to reach for it, but there is no explicit when-not guidance or named alternative (e.g., get_design_context vs download_assets). 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.

search_design_systemA

Search the design system of the file open in Figma Desktop: local components and component sets (with their properties and variant options), library components the file already uses (with an instance to copy), and local paint, text and effect styles and variables (with their default-mode values). Every word of query must appear in the name or description; leave it empty to list everything. Call it before designing with use_figma, and reuse what it finds: figma.getNodeByIdAsync(id) then component.createInstance(), instance.clone() for a library component, figma.getStyleByIdAsync and figma.variables.getVariableByIdAsync. Libraries the file does not use yet are not visible to the plugin; instancesNotScanned means the page was too large to look through all its instances. Needs the plugin and Design mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindsNoWhat to search (default: all of components, styles, variables).
limitNoMost results per kind (default 50).
queryNoWords to look for, e.g. "button primary".
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
allPagesNoSearch components on every page, not just the current one (slower on large files).

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the prerequisite (plugin and Design mode), a real limitation (libraries not yet used by the file are invisible to the plugin), and the meaning of the instancesNotScanned field. What is missing is anything about result caps or how the limit interacts with the per-kind results, so the behavioral picture is strong but not exhaustive.

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

Conciseness4/5

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

Purpose and scope are front-loaded in the first sentence, and each following sentence adds distinct information (query semantics, when to call, reuse recipe, caveats). It is dense rather than padded, though the inline figma API call recipe is long and could be tightened without losing meaning.

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 five-parameter read tool with no output schema and no annotations, the description covers what is returned per kind, the matching semantics, when to invoke it relative to use_figma, prerequisites, and known blind spots. An agent has everything needed to call it correctly and interpret the 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?

Schema coverage is 100%, so the baseline is 3; the description goes beyond it by defining query semantics (every word must appear in name or description; empty lists everything) and by clarifying the visible scope that kinds draws from. It does not add anything for allPages or limit beyond what the schema already says.

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 (Search) and resource (the design system of the open Figma file), then enumerates exactly what is covered: local components/component sets with properties and variants, used library components with an instance to copy, and local styles/variables with default-mode values. This is enough for an agent to distinguish it from siblings like get_design_context or get_variable_defs 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 instructs 'Call it before designing with use_figma' and describes the follow-up reuse pattern (getNodeByIdAsync + createInstance, clone, getStyleByIdAsync, getVariableByIdAsync). It also states the query matching rule and the empty-query fallback ('leave it empty to list everything'), leaving no inference required.

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

use_figmaA

Create or edit designs in the file open in Figma Desktop by running JavaScript against the Figma plugin API. code is the body of an async function with figma in scope: use await, and return a value (nodes come back as {id, name, type, x, y, width, height}); console.log output is returned too. The whole run is one undo step. If the script throws, the changes it made before the error stay.

Rules of the plugin API here:

  • The file uses dynamic page loading: use figma.getNodeByIdAsync, figma.setCurrentPageAsync, await page.loadAsync() before reading another page, getMainComponentAsync, and the *Async style/variable getters.

  • Load every font before setting text or text properties: await figma.loadFontAsync({ family: "Inter", style: "Regular" }). Check figma.listAvailableFontsAsync() when unsure a font exists.

  • Colours are 0-1 RGB: fills = [{ type: "SOLID", color: { r: 1, g: 0.4, b: 0 } }]. Paint arrays are immutable: assign a new array.

  • Prefer auto layout: layoutMode, itemSpacing, padding*, primaryAxisAlignItems, counterAxisAlignItems; set layoutSizingHorizontal/Vertical ("FILL", "HUG", "FIXED") only after the node is appended to an auto-layout parent.

  • New nodes land on the current page: place top-level frames clear of existing ones, and append children with parent.appendChild(node).

  • Reuse what the file has: find its components, styles and variables with search_design_system first, and set bound variables with figma.variables.setBoundVariableForPaint.

  • Images from the web: const img = await figma.createImageAsync(url), then fills = [{ type: "IMAGE", imageHash: img.hash, scaleMode: "FILL" }]. fetch(url) works too (e.g. an SVG for figma.createNodeFromSvg). Local files go in with place_image.

  • figma.currentPage.selection = [node] and figma.viewport.scrollAndZoomIntoView([node]) show the result.

Build a screen in a few calls (structure, then sections), return the ids, and check each step with get_screenshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesBody of an async function run with `figma` in scope.
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
timeoutMsNoHow long to wait for the script, in ms (default 60000).

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: it discloses undo semantics ("one undo step"), partial-failure behavior (changes before a throw persist), class-scoping of `code`, what is returned (nodes as {id, name, type, x, y, width, height} plus console.log), and many API constraints. These are exactly the side-effect and failure traits an agent needs before executing arbitrary code.

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?

Long, but front-loaded with purpose and structured as a scannable rules list where each bullet is directly actionable for writing plugin-API code. Some API detail (colour format, auto-layout properties) is verbose, but for a code-execution tool the density is largely justified and nothing reads as 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 no-annotation, no-output-schema code-execution tool, the description supplies what an agent needs to call it correctly: input contract, return shape, error behaviour, environment constraints, and a workflow loop with sibling tools. 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 100%, so the baseline is 3. The description adds meaning beyond the schema for `code` by specifying it is the body of an async function with `figma` in scope, that await should be used, and what a returned value looks like, which shapes how the agent authors the parameter. It adds little for fileKey/timeoutMs, but those are already fully documented in the schema.

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

Purpose5/5

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

States a specific verb pair and resource ("Create or edit designs in the file open in Figma Desktop") plus the mechanism (running JavaScript against the Figma plugin API). This is clearly distinguishable from siblings like get_screenshot, place_image, or search_design_system, which are read/lookup 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?

Routes the agent to siblings explicitly: use search_design_system first to reuse components/styles/variables, place_image for local files, and get_screenshot to check each step. It also frames the workflow ("Build a screen in a few calls... return the ids"). It lacks an explicit when-not-to-use statement, but the conditional routing is clear and actionable.

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

verify_codeA

Check Flutter code against the design: analyzes it, renders it with flutter test at 2x, and compares the render with Figma's own 2x render of the node. Returns analyzer errors, runtime errors (overflows, missing assets), the share of differing pixels and a diff image (the design in grey, differing pixels in red).

With file, it checks that widget inside its own Flutter project: the project's packages and assets, inside a MaterialApp, scaled by flutter_screenutil to the frame size when the project uses it. The widget needs a constructor without arguments. Without file, it checks the reference code get_design_context generates and also compares every layer's box. Use it after implementing a frame, and fix what it reports. Text in fonts it cannot find is drawn in a fallback font, and emoji have no colour font in the test, so text after them shifts. A run takes from 20 seconds to a few minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNoThe .dart file with the widget, under the project's lib/ (absolute, or relative to the project).
fontsNoFolders with font files (default: the project's assets/fonts and the system fonts).
nodeIdNoThe ID of the node, eg. "123:456" or "123-456" (instance ids like "I1:2;3:4" work too). Omit it to use the current selection in Figma.
widgetNoThe widget class in `file` (default: its first widget class).
fileKeyNoThe key of the Figma file. Accepted for compatibility; the file open in Figma Desktop is always used.
flutterNoPath of the flutter tool, when it is not on PATH.
viewportNoLay the code out on a screen of this size, e.g. "360x780", and report runtime errors (overflows) and layers pushed off screen instead of comparing.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: it discloses the return artifacts (analyzer errors, runtime errors such as overflows/missing assets, differing-pixel share, diff image), runtime cost (20 seconds to a few minutes), and fidelity caveats (fallback fonts for missing fonts, emoji lacking color fonts shifting subsequent text). These are exactly the traits an agent needs to interpret 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?

The core purpose and outputs are front-loaded in the first sentence, and subsequent sentences add mode-specific instructions, a usage trigger, caveats, and timing. It is dense but nearly every clause carries information; the only mild cost is that the mode differences are packed into 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?

Despite having no output schema and no annotations, the description fully explains return values, both execution modes, preconditions for the `file` path, and the runtime envelope. For a verification tool with seven optional parameters, an agent has everything required to invoke and interpret 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 genuinely adds meaning beyond the schema: it explains that `file` runs the widget inside its own Flutter project with its packages/assets, inside a MaterialApp, scaled by flutter_screenutil, and that the widget needs an argument-less constructor. It also clarifies that `viewport` switches from comparison to overflow/off-screen reporting.

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 ('Check Flutter code against the design') and goes further to explain the mechanism (flutter test at 2x, comparison with Figma's 2x render) and the exact outputs. An agent can distinguish this verification tool from siblings like get_design_context or get_screenshot 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?

It gives a clear condition for use: 'Use it after implementing a frame, and fix what it reports', and it distinguishes the two operating modes (with `file` vs without). It stops short of naming sibling tools or explicit when-not-to-use exclusions, so it lands just below the top tier.

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

whoamiA

Status of the local Figma connection: whether the plugin is connected, the pairing code it needs, the open file, page and selection, the project and its Code Connect file, and the saved snapshots. Use it when a read fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden, and it discloses the entire return payload (connection state, pairing code, current file/page/selection, project/Code Connect file, snapshots). It does not describe failure semantics or how to interpret the pairing code, which are minor gaps for a read-only status 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 sentences: purpose plus a field inventory, then the usage trigger. It is front-loaded with the resource and wastes little, though the comma-separated field list is dense.

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 must describe the return values — and it does, itemizing the status fields. An agent has enough to know what it will receive and when to call it; only interpretation guidance for the pairing code 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?

The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate and no schema gap to compensate for.

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 resource — the local Figma connection status — and enumerates exactly what it reports (connection state, pairing code, open file/page/selection, project and Code Connect file, saved snapshots). The generic name 'whoami' is fully rescued by the description, though it does not explicitly contrast itself with siblings like get_metadata or get_design_context.

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

Usage Guidelines4/5

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

It gives a concrete trigger: 'Use it when a read fails,' which tells the agent this is a diagnostic fallback. It offers no exclusions or named alternatives, but for a zero-param diagnostic tool the single condition is sufficient context.

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. 15 tool updatesv1.5.1
    • First observedadd_code_connect_map
    • First observeddownload_assets
    • First observedget_code_connect_map
    • First observedget_design_context
    • First observedget_metadata
    • First observedget_screenshot
    • First observedget_variable_defs
    • First observedimport_design_export
    • First observedplace_image
    • First observedremove_code_connect_map
    • First observedsave_design_export
    • First observedsearch_design_system
    • First observeduse_figma
    • First observedverify_code
    • First observedwhoami

TDQS

A4/5.0

Scored across 15 tools

Disambiguation4/5

Most tools have clearly distinct purposes (editing via use_figma, reading via get_design_context/get_metadata/get_screenshot, asset download, code-connect mapping). The main overlap risk is among the read/inspect tools (get_design_context, get_metadata, get_variable_defs, get_screenshot, download_assets) and between the export/snapshot tools (save_design_export, import_design_export, download_assets), though descriptions explicitly steer usage (e.g. 'Always prefer get_design_context').

Naming Consistency4/5

Nearly all tools follow a verb_noun snake_case pattern (get_design_context, add_code_connect_map, search_design_system, place_image, download_assets, verify_code). The lone outlier 'whoami' breaks the convention, a minor deviation in an otherwise predictable scheme.

Tool Count5/5

15 tools is at the top of the well-scoped range and each maps to a distinct capability (edit, inspect, verify, assets, mappings, status). No filler tools; the count fits a design-to-code Figma integration.

Completeness4/5

The surface covers the full lifecycle: design export/snapshot (save/import), code-connect mapping (add/get/remove), reading (context, metadata, screenshot, variables, design system search), editing (use_figma, place_image), verification (verify_code), and asset download. Minor gaps exist (e.g. no dedicated snapshot listing/removal tool beyond whoami), but core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Figma MCP server that lets agents execute arbitrary JavaScript inside a running Figma desktop app via a local development plugin, enabling real-time document inspection and manipulation while avoiding REST API rate limits.
    3
    MIT