MCP server for Figma integration enabling Claude to interact with Figma designs through WebSocket communication
Server has 30 tools with consistent naming (verb_noun pattern) and complete input schemas using Zod. Descriptions are present but generic (avg ~50 chars, well below the 194-char baseline for A+ tools). Most parameters lack detailed constraints, ranges, or format guidance. Output schemas are not documented. Error handling is minimal, most tools return generic error strings without recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Composition is sound (single responsibility per tool), but descriptions need enrichment to guide LLM selection and parameter usage.
Create an instance of a component in Figma
Create a new ellipse in Figma
Create a new frame in Figma
Create a new polygon in Figma
Create a new rectangle in Figma
Create a new text element in Figma
Delete a node from Figma
Descriptions are generic and lack LLM-selection guidance. Most are 30 - 50 chars (well below 194-char baseline). E.g., 'Get information about the current selection in Figma' does not explain WHEN to call it vs get_node_info, or what structure it returns.
Output schemas are not documented. Tools return JSON via sendCommandToFigma but LLMs cannot see what fields to expect. E.g., does get_local_components return {components: [...]} or {data: {items: [...]}}? This forces LLMs to guess and wastes tokens parsing unstructured responses.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Export a node as an image from Figma
Get detailed information about the current Figma document
Get all local components from the Figma document
Get detailed information about a specific node in Figma
Get detailed information about multiple nodes in Figma
Get available components from team libraries in Figma
Get information about the current selection in Figma
Get all styles from the current Figma document
Join a specific channel to communicate with Figma
Move a node to a new position in Figma
Resize a node in Figma
Scan all text nodes in the selected Figma node
Configure auto layout properties for a node in Figma
Set the corner radius of a node in Figma
Set the fill color of a node in Figma. Alpha component defaults to 1 (fully opaque) if not specified. Use alpha 0 for fully transparent.
Set the font name and style of a text node in Figma
Set the font size of a text node in Figma
Set the font weight of a text node in Figma
Set the letter spacing of a text node in Figma
Set the line height of a text node in Figma
Set multiple text contents parallelly in a node
Set the stroke color of a node in Figma (defaults: opacity 1, weight 1)
Set the text content of an existing text node in Figma
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. delete_node, set_fill_color, and other mutation tools should be marked destructiveHint=true.
Parameter descriptions lack constraints and format guidance. E.g., 'X position' does not specify range, units, or coordinate system. 'Font weight' lists examples (400, 700) but no enum constraint. LLMs cannot validate inputs without explicit bounds.
Error handling is minimal. All tools catch errors and return generic 'Error <action>: <message>' strings. No recovery guidance, no error classification (retryable vs fatal), no actionable next steps for LLMs.