MCP server that exposes the Relay Figma plugin tools to Claude Code. Relays tool calls from Claude to a Figma plugin via a localhost task-queue server.
Relay MCP has well-structured tool definitions with complete input schemas and clear descriptions. All 8 tools are explicitly registered with name, description, and inputSchema. Descriptions average ~120 chars and explain WHAT the tool does and WHEN to use it. However, several tools lack parameter-level descriptions (figma_set_fills, figma_set_strokes have minimal 'id' and 'fills'/'strokes' descriptions), and output schemas are not documented. Error handling is present but generic. The figma_execute tool is a high-risk escape hatch with minimal guardrails. No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification (READ_ONLY vs WRITE vs IRREVERSIBLE).
Escape hatch: run an arbitrary async snippet inside the Figma plugin sandbox. The snippet has access to the global `figma` object. Use only when no specific tool fits.
Export a node to PNG/JPG/SVG/PDF. Returns base64-encoded bytes.
Look up a single node by its Figma node id. Returns name, type, dimensions, and child count.
Search COMPONENT and COMPONENT_SET nodes in the currently-open Figma file by name. Use this to find atoms (Button, Chip, etc.) before inspecting or editing them.
Set the fills array on a node (any node type with a fills property).
Set component-instance properties (variant, boolean, text, instance-swap) on an INSTANCE node.
Missing output schema documentation. No tool documents what fields/structure it returns. LLMs cannot plan downstream calls or extract required data without knowing response shape.
Weak parameter descriptions on figma_set_fills and figma_set_strokes. 'id' has no description; 'fills'/'strokes' descriptions are minimal ('Figma Paint[]') without format guidance. LLMs cannot construct valid Paint objects without examples or schema.
figma_execute is an unrestricted code execution escape hatch. No dry-run, no confirmation, no input validation. Agents can execute arbitrary Figma plugin code with no guardrails. High risk of unintended mutations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Set the strokes array on a node (any node type with a strokes property).
Replace the characters of a TEXT node. Loads the required font automatically.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Tools are stratified by risk (READ_ONLY, WRITE, IRREVERSIBLE) but this is not exposed to the MCP client. Agents cannot reason about safety without explicit hints.
Error handling is generic. dispatchToRelay() catches errors and returns text, but does not categorize them as retryable, user-fixable, or fatal. Timeout errors mention 'Is the plugin open?' but other failures give no recovery guidance.