Atlas / MCP servers / magic-spells / Figma Bridge

Figma BridgeSAFE

mcp/magic-spells/figma-bridge
Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
93 20r · 61w · 12d
Transport
stdio
License
MIT
Stars
76
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

A Model Context Protocol (MCP) server that enables Claude to read and manipulate Figma design files and FigJam files in real-time through a WebSocket bridge to a Figma plugin.

Features

  • 93 operations - 68 Figma design tools + 21 FigJam tools (sticky notes, flowchart shapes, connectors, tables, code blocks, link previews) + 4 Prototype tools (reactions, flow starting points)
  • Works in both editors, plus read-only Dev Mode - Auto-detects whether you're in a Figma design file or FigJam, and gates editor-specific commands accordingly (FigJam-only sticky/connector/table tools; Figma-Design-only prototype tools). In Dev Mode the plugin runs read-only — see Dev Mode support
  • Real-time bidirectional communication - Changes appear instantly in Figma/FigJam
  • Token-optimized queries - Efficient variable search and node traversal for AI interactions
  • Full Figma API access - Styles, variables, auto-layout, boolean operations, plus FigJam diagrams and documentation
  • Built-in skills - Ships its own operating guide as MCP resources (skill://figma-bridge/SKILL.md); connected agents are directed to read it before write-heavy work, so no separate skill install is needed

Architecture

Claude Code ←──stdio──→ MCP Server ←──WebSocket──→ Figma Plugin ←──→ Figma API
(Node.js)    localhost:3055    (runs in Figma)

Dev Mode Support

The plugin also runs in Figma Dev Mode (e.g. on a Developer seat, or a view-only file opened in Dev Mode). It appears in the inspect panel's plugin area with a read-only badge next to the port field.

Dev Mode plugins get a read-only document — this is a Figma platform restriction, not a bridge limitation — so only the read tools work there:

  • figma_get_context, figma_list_pages, figma_get_nodes, figma_get_children
  • figma_search_nodes, figma_search_components, figma_search_styles, figma_search_variables
  • `figmagetlo
Read from source at commit 123d9e754b27OBSERVED · 2026-10-07
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add figma-mcp-bridge -- npx -y @magic-spells/[email protected]
claude-desktop
{
  "mcpServers": {
    "figma-mcp-bridge": {
      "command": "npx",
      "args": [
        "-y",
        "@magic-spells/[email protected]"
      ]
    }
  }
}
03

Exposed tools (93)

20 read · 61 write · 12 destructive. Blast radius: 12 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
figma_add_modewriteAdd a new mode to a variable collection.
figma_add_reactionwrite
figma_apply_stylewriteApply a local style to a node. Styles provide consistent, reusable design tokens. Works for all five style
figma_clone_nodesreadDuplicate nodes.
figma_combine_as_variantswriteCombine multiple components into a component set with variants. Components must use variant naming (e.g.,
figma_create_code_blockwriteFigJam only: create a syntax-highlighted code block for documentation. Code is a plain string property (no font loading required).
figma_create_componentwriteCreate a component.
figma_create_connectorwrite
figma_create_ellipsewriteCreate ellipse. Use arcData for arcs/rings.
figma_create_framewriteCreate a frame.
figma_create_instancewriteCreate a component instance.
figma_create_linewriteCreate a line.
figma_create_link_previewwriteFigJam only: create a rich link preview from a URL. Returns either an EMBED (iframe; works for OEmbed providers like YouTube/Spotify) or a LINK_UNFURL (rich card from OpenGraph/Twitter Card metadata) — the response includes nodeType so you know which.
figma_create_pagewriteCreate a new page in the document. **Figma Design only — not available in FigJam.** Calling this in a FigJam file returns a FIGMA_DESIGN_ONLY error. FigJam files have pages but the plugin API does not expose figma.createPage(); pages must be created via the FigJam UI.
figma_create_paint_stylewriteCreate a paint style.
figma_create_rectanglewriteCreate a rectangle.
figma_create_sectionwriteCreate a labeled section. Sections work in BOTH Figma design files and FigJam — use them to group flowcharts, diagrams, or design areas. Supports dev status (READY_FOR_DEV/COMPLETED) for handoff.
figma_create_shape_with_textwriteFigJam only: create a flowchart shape with embedded text (process box, decision diamond, database cylinder, etc.). 30 shape types are available — use ROUNDED_RECTANGLE for processes, DIAMOND for decisions, ENG_DATABASE for data stores. cornerRadius is fixed and cannot be set.
figma_create_stickywriteFigJam only: create a sticky note. Default size is fixed (240×240); width/height are not configurable. Text is set via the embedded sublayer (font auto-loaded). Note: the author name and visibility are auto-populated by Figma from the active user — they cannot be set programmatically.
figma_create_tablewriteFigJam only: create a table for documentation or structured data. Optionally seed initial cell content via the cells array. Defaults to 2×2.
figma_create_textwriteCreate a text node.
figma_create_text_stylewriteCreate a text style.
figma_create_variablewriteCreate a new variable in a collection.
figma_create_variable_collectionwriteCreate a new variable collection to organize variables.
figma_delete_modedestructiveDelete a mode from a variable collection. Cannot delete the last mode.
figma_delete_nodesdestructiveDelete nodes.
figma_delete_pagedestructiveDelete a page from the Figma document. Cannot delete the last remaining page.
figma_delete_styledestructiveDelete a local style (paint, text, effect or grid) from the document. Only local styles can be deleted — styles from a subscribed library return a REMOTE_STYLE error. Use with caution: nodes using the style keep their resolved values but lose the link. Find style IDs with figma_search_styles.
figma_delete_variable_collectiondestructiveDelete a variable collection and all its variables. Use with caution - this cannot be undone.
figma_delete_variablesdestructiveDelete one or more variables from the document. Use with caution - this cannot be undone.
figma_detach_instancereadDetach a component instance, converting it to a regular frame. Preserves overrides but severs the link to the main component.
figma_duplicate_pagereadClone an entire page including all its contents. The new page is inserted after the original. **Figma Design only — not available in FigJam.** Returns FIGMA_DESIGN_ONLY in FigJam since the underlying figma.createPage() API is not exposed there.
figma_export_nodereadExport a node as an image (PNG, SVG, JPG, or PDF). The image is WRITTEN TO DISK and the file path is returned —
figma_get_childrenreadGet immediate children of a node. Use for browsing hierarchy one level at a time. More efficient than figma_get_nodes for exploring structure. Compact results include x/y, so they can be used to measure layout (e.g. which children share a row after wrapping). Composite instance-sublayer parent IDs (
figma_get_contextreadGet the current Figma document context including file info, current page, and selection. Use this to understand what document is open and what the user has selected.
figma_get_local_stylesreadList all local styles defined in the document (colors, text, effects, grids). TIP: Use figma_search_styles instead when looking for specific styles by name - it returns compact results and reduces token usage.
figma_get_local_variablesreadGet all local variables and variable collections from the Figma document. Returns variables with their types (COLOR, FLOAT, STRING, BOOLEAN), modes, and values. WARNING: Can return 25k+ tokens and may be truncated. Use figma_search_variables instead when looking for specific variables.
figma_get_nodesreadGet detailed information about specific Figma nodes by their IDs. Returns node properties including type, position, size, fills, strokes (strokeWeight reads
figma_get_reactionsreadPrototype (Figma Design only): get all reactions (interactions) on a node. Returns the full reactions array with trigger and action details.
figma_group_nodesreadGroup nodes.
figma_insert_table_columnwriteFigJam only: insert a column at the given index (existing columns at and after the index shift right).
figma_insert_table_rowwriteFigJam only: insert a row at the given index (existing rows at and after the index shift down).
figma_list_pagesreadList all pages in the current Figma document. Returns page IDs, names, and indicates which page is currently active.
figma_move_nodeswriteMove nodes. Use relative=true for offset.
figma_move_table_columnwriteFigJam only: move a column from one index to another.
figma_move_table_rowwriteFigJam only: move a row from one index to another.
figma_move_to_pagewriteMove nodes from their current page to a different page.
figma_remove_reactiondestructivePrototype (Figma Design only): remove a reaction from a node by its zero-based index in the reactions array. Use figma_get_reactions first to find the index.
figma_remove_table_columndestructiveFigJam only: remove the column at the given index.
figma_remove_table_rowdestructiveFigJam only: remove the row at the given index.
figma_rename_modewriteRename a mode in a variable collection (e.g.,
figma_rename_nodewriteRename one or more nodes. For batch renaming, all nodes get the same name.
figma_rename_pagewriteRename an existing page in the Figma document.
figma_rename_variablewriteRename an existing variable. Use
figma_rename_variable_collectionwriteRename a variable collection.
figma_reorder_nodewriteChange the z-order (layer order) of a node among its siblings. A numeric position is the FINAL index the node
figma_reparent_nodeswriteMove nodes to a different parent container. Useful for reorganizing the layer hierarchy.
figma_resize_nodesreadResize one or more nodes to an explicit pixel size. At least one dimension (width or height) must be provided.
figma_resize_table_columnwriteFigJam only: set the width of a table column.
figma_resize_table_rowwriteFigJam only: set the height of a table row.
figma_search_componentsreadSearch local components by name. Use when looking for specific components like
figma_search_nodesreadSearch for nodes by name within a scope. PREFERRED for finding specific frames, sections, or elements. Requires parentId to scope search. Returns compact results (~50 tokens/node vs ~500 for full).
figma_search_stylesreadSearch local styles by name. More efficient than figma_get_local_styles when looking for specific styles.
figma_search_variablesreadSearch for variables by name pattern. More efficient than get_local_variables - use this when looking for specific variables like
figma_server_inforeadGet information about the MCP server: package version, WebSocket port, connection state, and connected document info.
figma_set_auto_layoutwriteConfigure auto-layout on a frame. Enables responsive layouts with automatic spacing and alignment.
figma_set_clips_contentwriteSet whether frame-like nodes clip their children to the frame bounds. Works on FRAME, COMPONENT, COMPONENT_SET, INSTANCE, SLOT and SLIDE — other node types return an error. Response echoes the resulting clipsContent. Read it back with figma_get_nodes.
figma_set_code_blockwriteFigJam only: update an existing code block\
figma_set_connectorwriteFigJam only: modify an existing connector\
figma_set_constraintswriteSet resize constraints on a node. Constraints control how a node resizes when its parent frame resizes. Only works on nodes inside frames (not auto-layout frames).
figma_set_corner_radiuswriteSet corner radius. Use individual values for asymmetric.
figma_set_current_pagewriteSwitch to a different page in the Figma document.
figma_set_effectswriteSet effects. Replaces existing.
figma_set_fillswriteSet fill color. Accepts hex shorthand or fills array.
figma_set_flow_starting_pointwritePrototype (Figma Design only): set a top-level frame as a prototype flow starting point on the current page, or clear it. Flow starting points are page-level — Figma stores them as { nodeId, name } entries on the page.
figma_set_layout_alignwriteSet how a child behaves within an auto-layout frame. Controls individual alignment (STRETCH), growth (fill container), and absolute positioning.
figma_set_opacitywriteSet opacity (0-1).
figma_set_rotationwriteSet the rotation (in degrees) of one or more nodes. pivot defaults to
figma_set_sectionwriteUpdate a section\
figma_set_selectionwriteSet selection. Empty array clears.
figma_set_shape_typewriteFigJam only: change the shape type of an existing shape-with-text node (e.g., turn a ROUNDED_RECTANGLE into a DIAMOND).
figma_set_size_limitsdestructiveSet or CLEAR the min/max size limits (minWidth, maxWidth, minHeight, maxHeight) on one or more nodes.
figma_set_stickywriteFigJam only: toggle a sticky note between square (240×240) and wide-rectangle variants. Use figma_set_text to change the body text. (Author name/visibility are read-only at runtime — Figma sets them from the active user.)
figma_set_strokeswriteSet stroke color and/or weight. Accepts hex shorthand or strokes array. Supports per-side weights (strokeTopWeight etc.) for border-top-only style dividers — no need to fake them with 1px rectangles. Omit
figma_set_table_cellwriteFigJam only: set the text and/or fill color of a single table cell.
figma_set_textwriteSet text content. Auto-loads fonts.
figma_set_text_stylewriteSet text font properties.
figma_set_variablewrite
figma_set_variable_modedestructivePin an explicit variable mode on nodes or pages, or clear an existing pin. This is how a preview/page frame is made to resolve a particular mode (e.g. a mobile frame pinned to the Spacing collection\
figma_set_visiblewriteShow or hide nodes. Sets node.visible directly — use this instead of binding a BOOLEAN variable or setting opacity to 0 just to hide something. Response echoes each node\
figma_swap_instancereadSwap a component instance to use a different component. Preserves position and size.
figma_unbind_variabledestructiveRemove a variable binding from a node property. The unbind is verified by readback (UNBIND_FAILED if the field is
figma_ungroup_nodesreadUngroup nodes.
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (5 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (2)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
figma_delete_mode, figma_delete_nodes, figma_delete_page, figma_delete_style, figma_delete_variable_collection, figma_delete_variables, figma_remove_reaction, figma_remove_table_column, figma_remove_t
Why it matters. 12 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, ws
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-07 · audit v0.4.1 · source sha 123d9e754b27full audit observations/trust-audit/mcp-server/magic-spells__figma-bridge.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-07123d9e754b27SAFEB89first audit
06

Questions

What tools does Figma Bridge expose?

93 in total: 20 read-only, 61 that write, and 12 that can delete or overwrite (figma_delete_mode, figma_delete_nodes, figma_delete_page, figma_delete_style, figma_delete_variable_collection). Every one is listed on this page with its risk.

Is Figma Bridge safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 12 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does Figma Bridge need?

No credential environment variables were found in its source, so it appears to need none.

How does Figma Bridge run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @magic-spells/figma-mcp-bridge at 0.4.0.

How current is this page?

The grade is for one exact copy of the source (123d9e754b27), read on 2026-10-07. The repository is watched and re-audited when it changes.

Advertisement