MCP server that bridges Figma plugin data to AI tools without hitting API rate limits
The server defines 32 tools with explicit registrations in server/src/tools.ts. Most tools have descriptions and documented input schemas using Zod, but quality varies significantly. Naming is consistent (verb_noun pattern), but parameter descriptions are sparse or absent. Output schemas are not documented. Many tools lack error handling guidance. The server handles a complex domain (Figma design automation) with good coverage of read/write/destructive operations, but lacks the polish expected of production tools.
Create a new frame within the given parent frame or page. Accepts optional position, size, and properties.
Create a new image node from base64-encoded image data.
Create a new page in the Figma document with the given name.
Create a new shape (rectangle, ellipse, polygon, star) with the given properties.
Create a new text node with the given content, font, and position.
Delete one or more nodes by their IDs. This operation is irreversible.
Duplicate one or more Figma nodes by their IDs. Returns the new node IDs.
Output schemas are not documented. Tools return JSON strings via renderResponse() but the schema/structure of those responses is not described to LLMs. LLMs cannot know what fields to extract or how to chain results to downstream tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 71 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
Get the design context for the current selection or page. Returns a summarized tree structure optimized for understanding the current design context. When multiple files are connected, specify fileKey.
Get the current Figma page document tree. When multiple files are connected, specify fileKey.
Read absolute node transforms and layout bounds for a capture root. Separate screenshot calls are non-atomic.
Get metadata about the current Figma document including file name, pages, and current page info. When multiple files are connected, specify fileKey.
Get a specific Figma node by ID. Accepts top-level IDs like '4029:12345' and instance-child IDs like 'I12740:17806;12740:17793'. Never use hyphens. When multiple files are connected, specify fileKey.
Export a screenshot of the selected nodes or specific nodes by ID. Returns base64-encoded image data. When multiple files are connected, specify fileKey.
Get the currently selected nodes in Figma. When multiple files are connected, specify fileKey.
Get all local styles in the document. When multiple files are connected, specify fileKey.
Get all local variable definitions including variable collections, modes, and variable values. Variables are Figma's system for design tokens (colors, numbers, strings, booleans). When multiple files are connected, specify fileKey.
Group one or more nodes into a new group frame.
Import and convert HTML/CSS layers into Figma nodes.
List all currently connected Figma files. Returns fileKey and fileName for each. Use the fileKey to target a specific file in other tools.
Move one or more nodes to a new parent node.
Scroll and zoom the viewport to focus on specific nodes.
Enable or configure auto layout on a frame node. Accepts layout direction, sizing modes, alignment, padding, and item spacing.
Set shadow, blur, or other visual effects on a node. Accepts an array of effect objects with type, color, offset, radius, and spread.
Replace a node's fill with a gradient paint. Accepts gradient type, stops, and optional transform. Use set_solid_fill for single-color paints.
Patch common node properties such as name, position, size, visibility, opacity, and corner radius. Only supported properties for the target node type may be changed. Use set_solid_fill or set_gradient_fill to change paints. When multiple files are connected, specify fileKey.
Show or hide specific Figma nodes. Returns previous visibility for each node so you can restore them after. Useful for isolating a single layer before exporting: hide all siblings, export the frame, then restore visibility.
Set the current selection in Figma to one or more nodes by ID.
Replace a node's fill (or stroke) with a single solid paint. Provide a hex color and optional paint opacity — fillHex/fillOpacity are accepted as aliases. Use set_gradient_fill for gradient paints.
Update stroke properties such as weight, position, alignment, cap style, join style, and dash pattern.
Update the contents of a single text node. The plugin loads the node's fonts before applying the new text. Accepts either text or characters. When multiple files are connected, specify fileKey.
Patch common text properties such as font family/style, size, alignment, auto-resize, line height, letter spacing, fill color, and bounds. When multiple files are connected, specify fileKey.
Ungroup a group frame, promoting its children to the parent level.
Many write/destructive tools lack parameter descriptions. Tools like set_text_properties, set_node_properties, set_solid_fill, set_gradient_fill, set_effects, set_stroke_properties, set_auto_layout, create_shape, and reparent_nodes have input schemas defined but the tool descriptions do not explain which parameters are required, what values are valid, or what properties can be modified.
Error handling is minimal. The renderResponse() helper catches errors and wraps them in JSON, but does not categorize errors as retryable, user-fixable, or fatal. LLMs cannot determine whether to retry, ask the user, or abandon the operation.
Destructive operations (delete_nodes) do not support dry-run, confirmation, or undo guidance. An agent can irreversibly delete nodes without warning. The description states 'This operation is irreversible' but offers no confirmation mechanism or recovery path.
Parameter descriptions are inconsistent. Many tools accept 'fileKey' to target specific files, but the parameter description is trivial ('Optional file key to target a specific file'). No guidance on when fileKey is required vs optional, what format it should be, or how to discover available file keys (though list_files does provide this).
Tool chaining is incomplete. Tools like get_layout_tree accept a 'maxNodes' parameter but it is not clear what happens when results exceed this limit (truncated? paginated?). create_frame, create_text, and create_shape descriptions mention 'optional position, size, and properties' but these parameters do not appear in the input schema, suggesting the schema is incomplete or the description is aspirational.
No tool annotations. The MCP server does not declare readOnlyHint, destructiveHint, or idempotentHint on tools. LLMs cannot distinguish safe (read-only) operations from destructive ones at a glance, increasing the risk of unintended deletions or writes.