This MCP server integrates with Figma via a local plugin bridge to provide full read/write access. It is described as not requiring an API token and as having no rate limits. The repository is presented as “Figma MCP — Local Plugin Integration,” and is published under the io.github.tunglt1810/figma-mcp-go slug.
🛠️ Key Features
Full read/write access via plugin bridge
No API token requirement
No rate limits (as stated)
🚀 Use Cases
Automating Figma content updates that require both reading and writing
Running local workflows through an MCP server without credential or rate-limit constraints
⚡ Developer Benefits
Avoids API token handling
Avoids rate-limit management
Bridges Figma functionality through a local plugin integration approach
⚠️ Limitations
Access model is limited to what the local plugin bridge supports (read/write scope is stated, but tool list is not provided)
Open-source Figma MCP server with full read and write access through a Figma plugin. Turn text into designs and designs into code. Works with Claude, Cursor, GitHub Copilot, and any MCP client.
Highlights
Runs locally through the Figma Plugin API. No REST API token needed.
Reads and edits the open Figma file live — 60 tools.
Covers styles, variables, components, prototypes, text, and multi-step batches with undo.
Built-in prompts such as read_design_strategy and design_strategy.
Lean on tokens: short tool descriptions, capped node trees, and images returned as images.
Styles, Variables, Components, Prototypes, and Content
The plugin remembers the last port for all files, so check it when you open the plugin elsewhere.
--ip 0.0.0.0 accepts connections from other machines.
Security: the plugin connection has no login. On the default 127.0.0.1 only your machine can reach it. On any other address, anyone who can reach the port can read and edit your open file. The server warns you and the plugin turns on confirm mode. Prefer an SSH tunnel.
Plugin panel
The panel shows the connected file, the selection, and what the AI is doing.
Control
What it does
Guard
off (default) runs everything. confirm asks before deletes and bulk changes. read-only blocks all changes.
Undo
Undoes the last change. A whole batch_execute_pipeline run is one undo step.
Log
Shows every request with tool, time, and error. Copy exports it for bug reports.
Pin
Saves the current selection. get_selection(source: "pinned") returns it even after the user clicks elsewhere.
Settings and panel size are saved per machine. The panel follows Figma's light and dark theme.
Dev Mode
set_codegen_result saves code on a node. It shows in Dev Mode's Code panel for everyone on the file. Code on a component shows for all its instances. The Language menu filters blocks; if a language has no block, all blocks show.
How it works
The first server to start becomes the leader and holds the only WebSocket to the plugin. Other servers are followers and forward their calls to the leader.
sequenceDiagram
participant C as MCP client
participant T as tools
participant L as cluster
participant B as bridge
participant U as Plugin UI
participant M as Plugin main
participant F as Figma
C->>T: tools/call (stdio)
T->>L: Send after Check
Note over L: A follower first sends POST /rpc to the leader
L->>B: forward
B->>U: WebSocket request
U->>M: postMessage
M->>F: read / write nodes
F-->>M: nodes
M-->>U: response
U-->>B: WebSocket reply
B-->>L: matched by id
L-->>T: (any, error)
T-->>C: tool result
Tools
Read
Tool
What it does
get_document
Node tree of the selection, page, or whole file. Stops at 500 nodes by default; depth, maxNodes, detail, dedupe_components control size
get_nodes_info
Full details of nodes by ID. Unknown IDs go in missing; depth and maxNodes limit children
get_selection
Selected nodes, or pinned ones with source: "pinned"
get_metadata
File name, current page, and all pages
search_nodes
Find nodes by name and/or type on a page, in a node, or in the whole file
get_viewport
View center, zoom, and visible area
get_styles
Paint, text, effect, and grid styles
get_variable_defs
Variable collections, modes, and values
get_local_components
All components and component sets
get_instance_overrides
An instance's component properties and values
get_annotations
Dev Mode annotations
get_fonts
Fonts on the current page, most used first
get_reactions
A node's prototype reactions
Export
Tool
What it does
export_screenshots
Export nodes as images: saved to a file with outputPath, or returned (PNG/JPG as image, SVG as text). No items = the selection
export_frames_to_pdf
Save frames as one multi-page PDF
get_image_bytes
Original image files from image fills, as base64
export_tokens
Variables and paint styles as JSON or CSS
set_export_settings
Set a node's Export presets
Create
Tool
What it does
create_node
FRAME, RECTANGLE, ELLIPSE, STAR, POLYGON, LINE, or SECTION
create_text
Text node (loads the font)
create_vector
Vector from SVG, e.g. an icon
import_image
Image from a URL or base64, as a new rectangle or into a node
Auto layout: direction, padding, gap, align, HUG/FILL sizing, min/max
set_layout_grids
Column, row, or square grids
set_effects
Shadows, blurs, noise, texture, glass
set_text
Text content and whole-node text settings
set_text_ranges
Style part of a text: bold, color, link, list
find_replace_text
Find and replace text, regex allowed
set_instance_overrides
Set an instance's component properties
swap_component
Swap an instance to another component
detach_instance
Turn instances into plain frames
clone_node
Copy a node
reparent_nodes
Move nodes into another parent
group_nodes / ungroup_nodes
Group or ungroup
batch_rename_nodes
Rename by name, find/replace, regex, prefix, or suffix
set_annotations
Dev Mode annotations (paid seat)
set_reactions
Prototype reactions: set, append, or remove
delete_nodes
Delete nodes
Styles, variables, pages
Tool
What it does
create_style
PAINT, TEXT, EFFECT, or GRID style
update_paint_style
Rename or recolor a paint style
apply_style_to_node
Apply a style to a node
delete_style
Delete a style
manage_variable
Create collections, modes, and variables; set values; delete; bind to nodes
manage_page
Add, delete, rename, or go to a page
Workflow
Tool
What it does
batch_execute_pipeline
Run many write steps in one call, pass results between steps, undo on error
set_selection
Select and zoom to nodes to show the user
save_version_checkpoint
Save a named version before big changes
set_codegen_result
Save code for Dev Mode's Code panel
manage_plugin_data
Store key/value notes on a node in the file
Prompts
Prompt
What it does
read_design_strategy
How to read designs well
design_strategy
How to create and edit designs
text_replacement_strategy
Replace text across a design in chunks
annotation_conversion_strategy
Turn manual notes into Figma annotations
swap_overrides_instances
Copy overrides between instances
reaction_to_connector_strategy
Turn prototype links into flow diagrams
Upgrading
Update the plugin when you update the server.npx updates the server, but the plugin is installed by hand. An old plugin rejects new commands with Unknown request type.
See CHANGELOG.md for what changed in each release, including removed tools and what to use instead.
Development
Server: Go 1.27+ (make test-go, make build-go)
Plugin: Bun 1.4+ (cd plugin && bun install && bun run build)
All tests:make test
Logs: stderr. FIGMA_MCP_LOG=debug shows tool parameters and traffic.
Package rules:make deps-check fails on wrong-way imports. internal/ has bridge (plugin WebSocket), cluster (leader election), figma (rules), and tools (tool table). Allowed: tools → figma, cluster → bridge.