Figma Local Bridge
Provides a local MCP server and development plugin for reading and editing a Figma Design file via the Figma Plugin API, creating editable layers (frames, text, shapes, SVG, image fills, components, instances) rather than flattened screenshots. Tools cover connection/document status, font listing, node creation and updates, PNG export of nodes, viewport focus, prototype screen navigation via click reactions, moving frames between pages, and node deletion.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Figma Local BridgeCheck which Figma file is connected, then add a login screen with email and password fields."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Figma Local Bridge
Русская инструкция · Agent instructions · Security
An unofficial, local MCP server and Figma development plugin for reading and editing a Figma Design file. It creates editable layers, not flattened screenshots, using the Figma Plugin API. No Figma personal access token, OpenAI API key, hosted bridge, or cloud Figma MCP is required by this project. Your AI client's authentication, usage limits and Figma permissions still apply.
Requirements
Node.js 22 or newer, with npm.
Figma Desktop with access to a Design file you can edit and permission to run development plugins.
An MCP client that can launch a local stdio server on the same machine, such as Codex. Other clients need equivalent stdio configuration; their individual UIs are not tested here.
Internet for installing npm dependencies and normal Figma/client operation. The bridge itself listens only on loopback.
This is not a remote HTTP MCP endpoint, not an official Figma/OpenAI integration, and not a way around either product's access restrictions. Figma and the MCP server must run on the same computer; a remote container or browser-only chat cannot reach the desktop plugin by adding this URL.
Related MCP server: Figma Bridge MCP
Quick start
1. Install and build locally
Clone this repository, or download its source ZIP, then open a terminal in its folder:
cd figma-local-bridge
npm ci
npm run check
npm run buildThe build prints the absolute path to dist/manifest.json. It also creates a random pairing token in .local/settings.json and embeds it in your local plugin UI. Do not share .local/ or dist/: every user must build their own plugin.
2. Connect your MCP client
For Codex CLI, replace the placeholder with the real absolute path:
codex mcp add figma_local_bridge -- node "/absolute/path/figma-local-bridge/server.mjs"
codex mcp listAlternatively, add this to Codex's ~/.codex/config.toml:
[mcp_servers.figma_local_bridge]
command = "node"
args = ["/absolute/path/figma-local-bridge/server.mjs"]On Windows a valid TOML path is 'C:\tools\figma-local-bridge\server.mjs'. For any stdio-capable MCP client, the equivalent generic configuration is:
{
"mcpServers": {
"figma_local_bridge": {
"command": "node",
"args": ["/absolute/path/figma-local-bridge/server.mjs"]
}
}
}Merge the server entry into your client's existing configuration; do not overwrite other servers. Use your client's documented location/schema. If a desktop client cannot find node, replace command with its absolute executable path (command -v node on macOS/Linux, (Get-Command node).Source in PowerShell). Restart the MCP connection/client after configuration. You do not need a fixed working directory.
Codex configuration follows official OpenAI documentation. This repository does not install or change your client configuration automatically.
3. Import and run the Figma plugin
Open your editable file in Figma Desktop.
Choose Plugins → Development → Import plugin from manifest… and select the generated
dist/manifest.json.Run Plugins → Development → Figma Local Bridge.
Keep the plugin window open. It should say Connected to local bridge after the MCP client or
npm run statusstarts the bridge.
If Figma requests a plugin ID, create a development plugin using Figma's Create new plugin flow. Copy its assigned numeric id into your private .local/settings.json as a string named pluginId, keeping port and token intact, then run npm run build again. Do not invent or copy another project's ID. See the Figma manifest documentation.
Only one plugin/file can be connected at a time. To change files, close the old plugin window and run it in the new file. Each plugin run produces a new session documentId; it is not a permanent Figma file key.
4. Give your agent the rules
Before design work, ask your agent:
Read
/absolute/path/figma-local-bridge/AGENTS.md, then use thefigma_local_bridgeMCP tools. Check status and read the document first. Tell me which file is connected. Do not modify anything until the task requires it.
AGENTS.md is automatically discoverable only when your agent's project rules include this repository. If you work in another folder, explicitly supply the file or copy the Using the MCP tools section into that project's agent instructions.
Tools
Client namespaces may add a prefix; the stable tool names are:
Tool | Purpose |
| Connection status; does not require an open plugin |
| Pages, selection, bounded tree and current session |
| Available fonts, optionally filtered by family |
| Editable frames, text, shapes, SVG, image fills, components and instances |
| Change existing layers; partial changes are possible on error |
| PNG preview, maximum edge 4096 px |
| Select layers and focus the editor viewport |
| Click navigation to a frame; replaces the source's existing reactions |
| Move exact frames to the current page while preserving canvas position |
| Remove exact nodes; use only with task authorization |
Create/update tools take JSON strings in nodesJson/updatesJson. The CLI uses ordinary JSON arrays named nodes/updates instead. Read the live tool schemas for all supported properties.
Supported basics: auto-layout, padding, sizing, colors, typography, images, local components/instances and prototype navigation. Not implemented: arbitrary JavaScript evaluation, a full Figma API wrapper, variables, component variant sets, library publishing, remote component import, FigJam or Slides. Fonts must be available in the connected editor; prefer explicit font family/style after figma_fonts.
CLI and examples
npm run status
node cli.mjs document
node cli.mjs fontsnpm run status and the MCP server automatically start a shared background bridge when needed. Default address: 127.0.0.1:3848. connected: false means the server is healthy but the plugin is not connected yet. Never paste status output publicly without removing file names/session identifiers.
For a scratch file, copy examples/card.json, replace REPLACE_WITH_DOCUMENT_ID with the result of document, inspect existing bounds and choose clear x/y coordinates, then run:
node cli.mjs create_nodes examples/card.jsonCopy the returned keys.card node ID into examples/export.json, update its targetDocumentId, then:
node cli.mjs export_node examples/export.json preview.pngWrite preview files outside the repository or keep them untracked: they can contain private designs. The CLI exits non-zero on errors; JSON output may include partial or possiblyChangedNodeIds. Inspect before retrying.
To stop this copy's bridge:
npm run stopStop is authenticated and refused while a command is in progress. If already stopped it exits non-zero without starting another bridge. Closing only the Figma plugin revokes access to its file, but the shared local process can remain running. A connected MCP client may start it again on its next command; disable the client entry first if you want it to stay off.
For foreground diagnostics, stop the background bridge first, then run npm run bridge and use Ctrl+C to stop it.
Configuration and troubleshooting
.local/settings.json is private local state, not a file to commit. Optional FIGMA_BRIDGE_STATE_DIR selects another private state directory; build and runtime must use the same directory. It is mainly useful for isolated testing or a read-only checkout. No cloud credentials are needed.
Symptom | What to do |
MCP tools missing | Check the absolute server/Node paths; restart the client connection; run |
Waiting for local bridge | Start the MCP connection or run |
Port occupied / wrong service / HTTP 401 | Do not stop unrelated processes. Use another port: stop this bridge, change only |
Invalid pairing | Ensure server and plugin came from the same checkout/state directory. Rebuild, close the old plugin and reopen it. |
Another plugin connected | Close the previous file's plugin before connecting another. |
Target document changed | Read |
Missing font | Use |
Timeout / partial error | The design may already have changed. Inspect it before reconnecting or retrying; never blindly replay a write. |
Bridge will not start | Read your private |
If a pairing token is exposed, stop/disable this MCP, replace the token in your private settings with a fresh 32-byte random hex value, rebuild, and reopen the plugin. Never weaken authentication or bind to 0.0.0.0 to fix connectivity.
Development and sharing
npm ci
npm run check
npm run build
npm testTests exercise authenticated HTTP/WebSocket transport, a simulated plugin and a real MCP SDK stdio handshake. They do not prove every editor-side operation in real Figma. Smoke-test a scratch Design file after changing plugin code: read → create → update → export → remove only the test-created layers. Normal Figma Undo remains available; operations are not universally transactional.
GitHub Actions is configured for Node 22 on Linux, macOS and Windows; these runners will execute after publication. This is source-first distribution, not a published npm package (private: true prevents accidental npm publication).
Share the repository or a source archive, not the working directory. The Git and npm ignore rules exclude generated pairing data and plugin bundles. Never attach .local/, dist/, .env, logs, private design exports or node_modules/ to a release. Each recipient runs npm ci and npm run build locally.
Licensed under MIT. Dependency licenses remain their respective owners'.
Available Tools
10 toolsfigma_connect_screensA
Set a click navigation from a node to a destination FRAME. Replaces source reactions.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | ||
| destinationId | Yes | ||
| targetDocumentId | Yes | documentId returned by figma_document; protects against editing a different file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses a key behavioral trait: existing source reactions are replaced. This tells the agent what prior data is affected. It still omits permissions, error behavior, and return details, but the overwrite warning is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and followed by a critical side-effect warning. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with full annotations and no output schema, the description plus schema gives enough information to invoke the tool correctly. The main gaps are usage routing and failure-mode detail, which are minor for this simple operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: targetDocumentId is described, but nodeId and destinationId are undocumented. The description partially compensates by clarifying that the source is a node and the destination must be a FRAME, but it does not explain ID formats or the exact role of targetDocumentId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Set a click navigation from a node to a destination FRAME.' It is clear what the tool does, but it does not explicitly distinguish the tool from sibling tools such as figma_update_nodes or figma_create_nodes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Set a click navigation...' implies the intended use case, and 'Replaces source reactions' provides a caution about overwriting. However, there is no explicit when-to-use guidance, no prerequisites, and no comparison to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_create_nodesA
Create editable layers from a JSON array (max 500 nodes). Each node: type FRAME|RECTANGLE|ELLIPSE|TEXT|SVG|COMPONENT|INSTANCE; optional key for returned ID map; name,x,y,width,height,fill/stroke (#RRGGBB or transparent),strokeWeight,opacity,radius,clipsContent. Frames/components: layout NONE|HORIZONTAL|VERTICAL,gap,padding or paddingTop/Bottom/Left/Right,primaryAlign MIN|CENTER|MAX|SPACE_BETWEEN,counterAlign MIN|CENTER|MAX,children. Sizing: horizontalSizing/verticalSizing FIXED|HUG|FILL, with FILL only inside auto-layout and HUG only text/auto-layout. Text: text,fontFamily,fontStyle,fontSize,lineHeight,letterSpacing,textAlign LEFT|CENTER|RIGHT; explicit width wraps text. SVG requires svg source. INSTANCE requires local componentId. Images: imageBase64 PNG/JPEG bytes. Nodes are parented before sizing. Entire creation is rolled back if it fails. Use fonts from figma_fonts; position new roots clear of existing content.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Page ID to select before running. | |
| parentId | No | ||
| nodesJson | Yes | ||
| targetDocumentId | Yes | documentId returned by figma_document; protects against editing a different file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses important behavior: the entire creation is rolled back if it fails, nodes are parented before sizing, and there is a hard cap of 500 nodes. It also states validation rules like INSTANCE requiring a local componentId and SVG requiring an svg source.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and every sentence carries technical specification rather than filler. However, it is a dense run-on paragraph with semicolon-separated field lists, so structure and readability could be improved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex creation tool with no output schema and only partial schema descriptions, the definition covers the critical nodesJson contract, atomic rollback, limits, fonts, and positioning. It still leaves parentId semantics and some return-value detail implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, but the description compensates heavily by documenting the nodesJson format in detail, including node types, styling, layout, sizing, text, SVG, and image fields. The main gap is parentId, which is undocumented in both the schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create editable layers from a JSON array (max 500 nodes).' It clearly distinguishes creation from sibling operations like figma_update_nodes and figma_delete_nodes by describing bulk node construction from JSON.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives practical usage constraints: max 500 nodes, use fonts from figma_fonts, position new roots clear of existing content, FILL only inside auto-layout, and HUG only for text/auto-layout. It does not explicitly say when to choose this tool over figma_update_nodes, which keeps it from 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_nodesADestructive
Delete exact node IDs. Use only for explicitly requested removal or cleaning nodes created by the current task. Normal Figma Undo remains available.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeIds | Yes | ||
| targetDocumentId | Yes | documentId returned by figma_document; protects against editing a different file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is partly covered. The description earns credit by adding recoverability ('Normal Figma Undo remains available') and a scoping constraint on when destruction is justified. It omits the practical limit that at most 200 nodes can be deleted per call and says nothing about effects on child nodes or connections.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core action stated first and the scoping caveat immediately after. The recoverability note is one clause and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with no output schema, the description covers what is destroyed, when destruction is warranted, and whether it can be undone. The remaining gaps (batch size cap, cascade behavior on children) are secondary but real for a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: targetDocumentId is documented in the schema, while nodeIds carries only minItems/maxItems constraints. The phrase 'exact node IDs' usefully signals that names or paths are not accepted, but the 200-item cap and the requirement that IDs come from figma_document are not reinforced in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete nodes) plus a precision qualifier ('exact node IDs'), which is enough to place it against siblings like figma_update_nodes and figma_create_nodes. The destructive intent is unambiguous, though it doesn't explicitly name 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear positive condition ('explicitly requested removal') and a useful negative boundary ('cleaning nodes created by the current task'), which steers the agent away from speculative or bulk deletion. It stops short of naming a sibling tool or spelling out an explicit 'do not use for' list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_documentARead-onlyIdempotent
Read pages, selected nodes, current documentId, and a bounded node tree. Call before writes.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| nodeId | No | ||
| pageId | No | Page ID to select before running. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false. The description adds useful context beyond annotations by specifying that the node tree is 'bounded' and that this should be called before write operations, though it does not detail pagination or return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The primary purpose is front-loaded, and the workflow guidance follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only three optional parameters and no output schema, the description lists what is read (pages, selected nodes, documentId, node tree), giving a reasonable sense of return contents. It covers the essential calling context for a read-only tool, though parameter-level details remain thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate. It does add meaning for depth ('bounded node tree') and hints at nodeId ('selected nodes') and pageId ('pages'), but it does not fully document parameter behavior or defaults, leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read') and names concrete resources: pages, selected nodes, documentId, and a bounded node tree. It is clear what the tool returns, but it does not explicitly differentiate itself from sibling read tools like figma_status or figma_fonts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Call before writes' provides explicit workflow guidance relative to the write-oriented siblings (figma_create_nodes, figma_update_nodes, figma_delete_nodes). It lacks named exclusions or alternatives, but the timing 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_export_nodeBRead-onlyIdempotent
Export a node as PNG for visual validation. Maximum edge 4096 px.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | ||
| nodeId | Yes | ||
| targetDocumentId | Yes | documentId returned by figma_document; protects against editing a different file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is clear. The description adds the PNG output format and a maximum edge of 4096 px, but it does not describe the return value or how scale affects export size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no wasted words. The primary action and format are front-loaded, followed by the size constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter export tool with no output schema and low schema description coverage, the description is too sparse. It omits the return format, scale semantics, and nodeId expectations, leaving important invocation details undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate for undocumented parameters. It does not explain scale or nodeId, and targetDocumentId is only documented in the schema, not in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: export a node as PNG. It also gives a clear purpose, visual validation. It does not explicitly name sibling tools or explain why to choose this over figma_document, but the export action is distinct from the other listed tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for visual validation' implies when the tool is useful, but there is no explicit guidance on when to use it versus alternatives. It also does not mention prerequisites such as obtaining the nodeId or targetDocumentId first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_focusC
Select nodes and zoom the Figma viewport to them.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Page ID to select before running. | |
| nodeIds | Yes | ||
| targetDocumentId | Yes | documentId returned by figma_document; protects against editing a different file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false but destructiveHint=false, so an agent knows something is being mutated; the description clarifies that the mutation is selection/viewport state plus zoom. It does not say whether document content is untouched, whether the selection persists, or that nodeIds is capped at 50, all of which matter for a non-readOnly call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action and effect stated immediately and zero filler. It is perhaps too terse for what it omits, but nothing in the text is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and thin annotations on a three-parameter tool: the definition should explain the targetDocumentId safety check's role in the workflow, the page-then-node ordering, and the batch limit. As written, an agent has enough to attempt a call but not enough to call it correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, below the threshold where the schema carries the full burden, yet the description says nothing about any parameter. nodeIds has no schema description at all, and the 50-node cap and the pageId-before-selection sequencing are left entirely to the schema's structural keywords.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb pair (select + zoom) applied to concrete resources (nodes, viewport), which distinguishes it from mutation siblings like figma_update_nodes and figma_export_node. It does not explicitly differentiate from figma_document or figma_status, which an agent might confuse it with when only navigation is needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this instead of figma_document or figma_export_node, and no mention of the prerequisite page-switching flow implied by the pageId parameter. The agent must infer that this is the 'navigate the user's view' tool rather than a data-fetching tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_fontsBRead-onlyIdempotent
List available fonts, optionally filtered by family.
| Name | Required | Description | Default |
|---|---|---|---|
| family | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as a safe, read-only, idempotent, non-destructive operation. The description confirms listing behavior but adds no additional behavioral context such as return format, pagination, or font metadata; with annotations covering the safety profile, this is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is appropriately sized for a simple one-parameter list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the annotations are rich, but there is no output schema and the single parameter is undocumented in the schema. The description only minimally covers what the tool returns and how filtering works, leaving some practical gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'family' parameter, so the description must compensate. It only says the list may be optionally filtered by family and does not explain matching semantics, case sensitivity, or what a valid family value looks like.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (List) and resource (available fonts), and adds an optional filter. It is clear enough to distinguish this from the other figma_* tools, though 'available' is slightly ambiguous about scope (local, Figma, or remote fonts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally filtered by family' implies a basic usage pattern, but there are no explicit when-to-use or when-not-to-use guidelines. For a simple listing tool this is acceptable, but it does not help an agent choose against any alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_move_frames_to_pageA
Move exact FRAME IDs out of containers to the current page, preserving their canvas position. This makes screens eligible as prototype destinations. Read the document first; do not include both a frame and its ancestor.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Page ID to select before running. | |
| nodeIds | Yes | ||
| targetDocumentId | Yes | documentId returned by figma_document; protects against editing a different file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation, non-destructive, non-idempotent and closed-world. The description adds context annotations can't carry: canvas position is preserved and the move changes prototype-destination eligibility. It still doesn't cover what happens to a frame already on the target page or partial-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and effect, followed by the prerequisite and the nodeIds caveat. Nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, non-idempotent tool with annotations and no output schema, this covers the essential behavior and constraints. Remaining gaps are edge cases (re-running on already-moved frames, cross-file behavior) rather than blockers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and nodeIds has no description. The description compensates by narrowing nodeIds to "exact FRAME IDs" and adding a real constraint not in the schema: never include a frame together with its ancestor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: move exact FRAME IDs out of containers onto the current page. It also gives the downstream effect (screens become eligible as prototype destinations), which separates it from siblings like figma_update_nodes or figma_connect_screens.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Read the document first" implies a prerequisite step (figma_document) and the ancestor/frame exclusion is a clear usage constraint. It stops short of naming the sibling tools explicitly or saying when to prefer a different move/update operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_statusARead-onlyIdempotent
Check whether the local Figma plugin is connected.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety and locality profile is covered structurally. The description adds only the useful detail that the plugin is a 'local' one, and says nothing about what is returned (boolean? plugin version?) or failure behavior, so it adds modest value beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler and no wasted clauses. It is appropriately sized, though a second sentence on return value/next step would have earned its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations describing results, the description should state what 'connected' looks like as a return value and what an agent should do on a negative result. For a health-check tool that other tools depend on, that is a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter information is missing or needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check whether') and a precise resource ('the local Figma plugin is connected'), which is unambiguous and clearly distinct from the mutation/read tools in the sibling list. It stops short of explicitly contrasting itself with siblings, but the purpose is self-evidently different.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is a preflight/health check to run before invoking figma_document, figma_create_nodes, etc., but the description never says when to call it, when not to, or what to do if the check fails. No explicit alternative or ordering guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
figma_update_nodesA
Update layers. updatesJson is an array of {nodeId,props}; props use the same editable properties as create_nodes (no type/children). Partial writes are reported on errors; inspect before retrying.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | Page ID to select before running. | |
| updatesJson | Yes | ||
| targetDocumentId | Yes | documentId returned by figma_document; protects against editing a different file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare non-read-only, non-idempotent, non-destructive behavior. The description adds important context beyond that: partial writes may occur and are reported on errors, so the agent should inspect before retrying. It does not cover permissions or merge semantics, but it discloses the key mutation risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the action first, then explains the critical updatesJson format and error-handling caution. Every sentence contributes useful information with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations and no output schema, the description covers the essential input format and the partial-write retry behavior. It could further clarify whether updates merge or replace existing properties and what permissions are needed, but it is largely complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes pageId and targetDocumentId, and the description compensates for updatesJson's missing schema description by defining it as an array of {nodeId,props} and noting that props reuse create_nodes' editable properties without type/children. It defers the full property list to create_nodes, which is reasonable but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Update layers." It references create_nodes to clarify the editable properties and excludes type/children, making the update scope clearer. It does not explicitly distinguish itself from siblings like delete_nodes, but the purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this tool updates existing layers and should be used with updatesJson rather than creation or deletion. The retry caution gives operational guidance, but there is no explicit when-to-use versus when-not-to-use or direct sibling routing.
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.
10 tool updates
v0.1.0- First observed
figma_connect_screens - First observed
figma_create_nodes - First observed
figma_delete_nodes - First observed
figma_document - First observed
figma_export_node - First observed
figma_focus - First observed
figma_fonts - First observed
figma_move_frames_to_page - First observed
figma_status - First observed
figma_update_nodes
TDQS
Scored across 10 tools
Each tool targets a distinct operation: connection status, document reading, font listing, node creation/update/deletion, export, viewport focus, prototype linking, and frame reparenting. The only borderline pair is update_nodes vs move_frames_to_page, but the latter is narrowly scoped to prototype eligibility and the description makes the boundary explicit.
All tools share a consistent figma_ snake_case prefix, which makes the set predictable. A few entries are noun-only (figma_status, figma_document, figma_fonts) rather than verb_noun like the rest, a minor deviation.
Ten tools is well-scoped for a local Figma bridge covering read, write, export, and prototyping operations. Each tool earns its place with no redundant entries.
The surface covers the core lifecycle: connect, inspect, create, update, delete, export, focus, and prototype-link nodes, with rollback semantics. Minor gaps remain, such as SVG/image export options and style/token or component enumeration beyond font listing.
Maintenance
Related MCP Connectors
The Figma MCP server brings Figma design context directly into your AI workflow.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Hosted MCP server and REST API that lets AI agents use apps with no API, signed in as you.
Related MCP Servers
- AlicenseAqualityDmaintenanceLocal-first MCP server that connects AI coding agents to the currently open Figma file through a local plugin bridge, requiring no Figma API token.8MIT
- AlicenseBqualityCmaintenanceLocal MCP server connecting AI clients to the Figma desktop app for inspecting and editing Figma documents via the Plugin API.1616 npm1MIT
- AlicenseNot gradedqualityCmaintenanceA local MCP server that lets MCP clients inspect and edit the Figma document currently open in the Figma desktop app using a local bridge and development plugin.MIT
- AlicenseBqualityAmaintenanceA local MCP server that lets AI assistants inspect, create, and update designs in Figma Desktop through a development plugin, requiring no Figma Personal Access Token or cloud services.1216 npm1MIT