LabscoMCP early access ↗
grabMCP SERVER

Cursor Talk to Figma MCP

Read a Figma document and change it — copy, layout, component instances, annotations — from the editor you are writing code in.

by grab ↗Image Analysis, OCR & VisionCommunity

LABSCO SUMMARY

Design edits stop being a request you file with someone else.

Scanning the text nodes and then rewriting them in bulk changes a whole screen's copy in one pass, and extracting one instance's overrides carries them to the rest. The channel is the catch worth knowing first: nothing works until join_channel has run.

What it is

A two-way channel into an open Figma document, carried over a WebSocket to a Figma plugin. Forty tools cover reads across the document, selection, nodes, styles, components and annotations, and writes across creation, layout, text, component instances, connectors and what is selected on screen. Six prompts encode the multi-step strategies.

What you get

  • The document, the current selection, and any node or set of nodes returned in full (get_document_info, get_selection, read_my_design, get_node_info, get_nodes_info)
  • Rectangles, frames, sections and text created, and existing nodes moved, resized, renamed, cloned, reparented, deleted singly or in bulk, and exported as PNG, JPG, SVG or PDF (create_frame, create_section, set_parent, clone_node, delete_multiple_nodes, export_node_as_image)
  • Auto-layout set properly: layout mode and wrap, padding, axis alignment, sizing modes and item spacing (set_layout_mode, set_padding, set_axis_align, set_layout_sizing, set_item_spacing)
  • Fill and stroke colours, corner radius with per-corner control, and an image fill from a file path, a URL or base64 in fill, fit, crop or tile mode (set_fill_color, set_stroke_color, set_corner_radius, set_image_fill)
  • Every text node in a subtree scanned with chunking for large designs, then rewritten in bulk in a single call (scan_text_nodes, set_text_content, set_multiple_text_contents)
  • Local components and styles listed, instances created, and one instance's overrides extracted and applied to others (get_local_components, get_styles, create_component_instance, get_instance_overrides, set_instance_overrides)
  • Annotations read and written, singly or in bulk, with nodes findable by type; and prototype reactions turned into FigJam connector lines (get_annotations, set_multiple_annotations, scan_nodes_by_types, get_reactions, set_default_connector, create_connections)
  • Focus and selection driven, so the viewport shows the node under discussion (set_focus, set_selections)
  • Prompts that carry the sequences worth not improvising — text_replacement_strategy, swap_overrides_instances, reaction_to_connector_strategy, annotation_conversion_strategy

Requirements

Bun on your PATH, the Figma plugin installed and running on the document, and the WebSocket server (bun socket, run from a clone of the repository) between them. Call join_channel first — every other call travels over that channel and nothing works until it has run. Creating connector lines has its own order: set_default_connector has to be given a copied FigJam connector before create_connections will draw anything.

Setup effort

Build from source — git clone https://github.com/grab/cursor-talk-to-figma-mcp.git