join_channelLABSCO SUMMARY
Read-only by design: it can describe a Figma file in full, but never change it.
The absence of the create and set operations is the point — you can hand an agent a live design file without wondering what it might move. The pairing that does the real work is get_node_children followed by scan_nodes_by_types: the tree first, then only the node types you asked for.
What it is
A Python server that talks to a Figma plugin over a WebSocket channel and gives an assistant read-only access to the open document.
What you get
- get_document_info for the current document and get_selection for what is selected right now
- read_my_design for full detail on the selection, and get_node_info or get_nodes_info for specific nodes
- get_node_children for every child id with full recursive nesting
- get_styles for the document's styles and get_local_components for its local components
- get_instance_overrides for what an instance changes about its component
- scan_text_nodes to find the text inside a node, with chunking for large trees
- scan_nodes_by_types to pull only the node types you care about, such as text, rectangles or frames
- get_annotations for a node or the whole document, and get_reactions for prototype links between nodes
- export_node_as_image as PNG, JPG, SVG or PDF at a scale you choose
- join_channel to attach to the plugin's channel before any of the above
Requirements
Figma Desktop with the bundled plugin loaded and connected, plus the WebSocket relay running alongside the server; you join the plugin's channel before the first read. Runs under Python from a checkout. Creating nodes and changing styles, colours, text, size or position are deliberately not implemented.
Setup effort
Build from source — git clone https://github.com/kdoronin/figma_mcp
USE CASES
Handing a design to a developer agent
Read the current selection in full detail, then export the frame as an image for reference.
Auditing the copy in a screen
Scan the frame for text nodes and get every string back in one pass instead of clicking through layers.
Checking which components a file actually uses
List the local components, then see what each instance overrides.
Tracing a prototype flow
Pull the reactions on the nodes to see which screens connect to which.
Getting the style tokens out of a file
Read the document's styles alongside its structure so naming stays consistent in code.
15 tools
Listed in project docs. Your client may show a different list.
get_document_infoget_selectionread_my_designget_node_infoget_nodes_infoget_node_childrenget_stylesget_local_componentsget_instance_overridesscan_text_nodesscan_nodes_by_typesexport_node_as_imageget_annotationsget_reactionsBEFORE YOU INSTALL
What to know first
Tools you get
15 tools named in the project's documentation.
Requires
- python on PATH
- Figma Desktop, with the project's plugin imported from src/cursor_mcp_plugin/manifest.json
Where it runs
Both documented setups run the server on your machine.
INSTALLATION
Connect your client
Server setup
git clone https://github.com/kdoronin/figma_mcp
cd figma_mcp
python -m venv venv
source venv/bin/activate
pip install -r requirements.txtIn a second terminal, in the same folder with the venv activated, start the WebSocket relay and leave it running:
python websocket_proxy.py --port 3055 --debugIn Figma Desktop, open Plugins → Development → Import plugin from manifest… and choose src/cursor_mcp_plugin/manifest.json from the clone.
Run the "Cursor MCP Plugin", connect it to the relay on port 3055, and note the Channel ID it shows.
Add one of the Cursor blocks below, then in the chat call join_channel with that Channel ID before any other tool.
MCP Clients
Cursor
{
"mcpServers": {
"figma-mcp": {
"command": "python",
"args": [
"-m",
"src.figma_mcp.server",
"--server",
"localhost:3055"
],
"cwd": "<YOUR_PATH_TO_FIGMA_MCP>",
"env": {
"PYTHONPATH": "<YOUR_PATH_TO_FIGMA_MCP>"
}
}
}
}<YOUR_PATH_TO_FIGMA_MCP> is the full path of your clone. This block runs the python on your PATH, which needs the requirements installed; if you installed them into venv as above, use the venv block instead.
Cursor — venv
{
"mcpServers": {
"figma-mcp": {
"command": "<YOUR_PATH_TO_FIGMA_MCP>/venv/bin/python",
"args": [
"<YOUR_PATH_TO_FIGMA_MCP>/src/figma_mcp/server.py",
"--server",
"localhost:3055"
]
}
}
}<YOUR_PATH_TO_FIGMA_MCP> is the full path of your clone. Venv is the virtual environment the steps above create.