MCP server bridging Cursor agents to a Figma plugin via WebSocket
20 tools with consistent verb-noun naming (get_, set_, list_, apply_, remove_). All have descriptions (avg 95 chars, within 10-1024 range). Input schemas present with typed parameters. However, parameter descriptions are minimal (avg 35 chars vs baseline 72), output schemas undocumented, and error handling guidance absent. No tool annotations (readOnlyHint/destructiveHint). Composition is sound, tools are single-responsibility and chainable via fileKey/nodeIds. Missing: recovery guidance, actionable error messages, and output schema documentation.
Apply an animation style to a node.
Apply a manual keyframe track to a node property.
Get design context for nodes (layout, styles, content).
Get the full Figma document tree.
Get lightweight metadata for nodes.
List available Figma motion/animation styles.
Get details for specific nodes.
Output schemas undocumented. No tool returns a documented schema, LLMs cannot predict response structure or plan downstream calls. Baseline: 100% of A+ tools document return types.
Parameter descriptions too brief (avg 35 chars vs baseline 72). E.g., 'Node IDs to export' lacks context on format, cardinality, or when to use. LLMs cannot infer constraints from sparse descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Get motion properties for a node (animation styles, keyframes, timelines).
Capture node screenshots (returns base64). Default format PNG, scale 2. Uncompressed — use save_screenshots for TinyPNG-style compression / scale=3 slices.
Get the current selection in Figma.
Get local styles from the Figma file.
Get variable definitions used by nodes.
List Figma files currently connected via the plugin bridge.
Remove an animation style from a node (or all styles if animationStyleId omitted).
Remove a manual keyframe track from a node property.
Export screenshots/slices to the local filesystem. PNG defaults to TinyPNG-style compression (compress=true). Use scale=3 for slice assets matching the plugin export; default scale is 2.
Set visibility of nodes.
Set text content of text nodes.
Set text properties on text nodes.
Set the duration of a node timeline.
No error handling guidance. Tools lack recovery hints (e.g., 'If node not found, call get_document() first'). Agents cannot self-correct on failures.
No tool annotations. Destructive tools (save_screenshots, apply_animation_style, set_text_content) lack destructiveHint. Read-only tools lack readOnlyHint. Agents cannot distinguish safe from risky operations.
Complex parameters lack constraints. E.g., 'scale' (numeric) has no min/max; 'format' has no enum. LLMs will pass invalid values (scale=999, format='TIFF'). Baseline: constrained inputs prevent hallucination.