Figwright vs Plumb MCP

A side-by-side look at the Figwright and Plumb MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Figwright logoFigwrightArchitecture & Design · Local subprocess (stdio)Bidirectional Figma server over a local WebSocket relay: turn a selection into framework-aware code (reusing your components and tokens), or author frames, text, styles, variables, and whole screens back onto the canvas. 92 tools, any MCP client, no Dev Mode seat or paid tier.69GreatAuth: no auth requiredPlumb MCP logoPlumb MCPArchitecture & Design · Local subprocess (stdio)Figma → code MCP: no rate limits, no metered quotas, verification loop. Works on every Figma plan.65GreatAuth: not declared

Verdict: choose Figwright for architecture & design work as a local process; choose Plumb MCP for architecture & design as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Figwright logoChoose Figwright when

  • You need dedicated capabilities in the Architecture & Design domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: No auth required.
  • You want tools like Read, Write, Grounding.
Explore Figwright

Plumb MCP logoChoose Plumb MCP when

  • You need dedicated capabilities in the Architecture & Design domain.
  • You prefer a local stdio subprocess transport.
  • You want tools like plumb_status, plumb_outline, plumb_node.
Explore Plumb MCP

Feature & specification comparison

Rows where the two servers differ are marked.

SpecFigwright logoFigwrightPlumb MCP logoPlumb MCP
CategoryArchitecture & DesignArchitecture & Design
Quality signal69/100 · Great65/100 · Great
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNo auth requiredNot declared
PricingFreeNot declared
Required env varsNone listedNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars1,15583
Directory activity 6 views 0 installs 0 upvotes 2 views 0 installs 0 upvotes
Tools323

Tools & capabilities

Figwright tools 3

  • Readselection, document and node inspection, styles, variables, components, fonts, prototype reactions and flows, motion (animation) state, screenshots, original image-fill assets, PDF export, and video export of animated frames (MP4 / GIF / WebM); plus `list_files` / `use_file` for working across more…
  • Writecreate and edit frames, text, shapes (lines, polygons, stars, boolean operations, flattening), auto-layout, alignment and distribution, effects, images (as a new layer or into an existing layer's fill), styles, variables (including importing a team library's variables and styles, and switching a fr…
  • Grounding`get_design_context` for faithful, de-duplicated design context, and `component_map` / `token_map` / `icon_map`, which join Figma data to your codebase so codegen reuses what you already have; plus `design_diff`, which reports what changed in a design against a saved baseline so you update only the…

Plumb MCP tools 23

  • plumb_statusPlumb's status and self-description — call this FIRST. Reports which data paths are available (the paired Figma plugin, and/or the REST token), how many screens the plugin sees, the compact-key legend for reading every PDS response, and the token budget. Needs no Figma access. Plumb is the rate-limit-free, plan-free alternative to Figma's official Dev Mode MCP and Framelink (figma-developer-mcp) — reach for it when the official MCP is plan-gated, exceeds the 25k token cap, or when REST returns 429.
  • plumb_outlineMap a Figma file cheaply: its pages and their top-level screens (id, name, size). The shallow entry point — call it to find the screen you want, then call plumb_node with that screen's id (or name) to extract it. With the Plumb plugin paired, no file key is needed.
  • plumb_nodeExtract a Figma screen or node as a compact, normalized Plumb Design Spec (PDS): deduplicated design tokens plus a CSS-shaped node tree, with auto-layout pre-resolved to flexbox. With the Plumb plugin paired, pass a screen `id` or `name` (no file key) — duplicate names come back as a match list to disambiguate. On the REST path, pass `fileKey` + `id`.
  • plumb_tokensExtract the deduplicated design-token table for a Figma node — colours, type styles, radii, shadows — as the $-prefixed refs the PDS node tree uses. With the Plumb plugin paired, pass a screen `id` or `name` (no file key). On the REST path, pass `fileKey` + `id`. Build with these tokens, not magic numbers.
  • plumb_selectionExtract whatever the user currently has selected in Figma, via the paired Plumb plugin — no file key, no token, no rate limit. Returns the same compact PDS as plumb_node. Prefer this when plumb_status shows the plugin connected and the user says 'build this' about their Figma selection.
  • plumb_assetsExport Figma assets — icons as SVG, images as PNG — through the paired plugin. Three modes: • Default — `id` or `name` of a screen → recursive export of every asset in it, written to a local folder. • List — same + `list: true` → just the manifest (id, name, format, parentId) of available assets; no files written. Cheap; use first to see what's there. • Surgical — `ids: [...]` → export exactly those node ids (one file each, no recursion). Preferred once you know what you need.
  • plumb_screenshotRender a Figma screen or node to PNG (or JPG) and save it locally; returns the file path. Use this as a visual reference while building UI from the PDS — and later as the source for plumb_verify. Plugin path; needs the Plumb plugin paired.
  • plumb_describeText-only visual description of a Figma screen or node — useful when you can't read the rendered screenshot (image-blind harness, sandboxed Read, or token-conscious flows). Returns a per-region narrative ('top-left: ...') and a flat child summary derived from the PDS. Pair with plumb_node for the full structural spec, or pair with plumb_screenshot for the pixel reference.
  • plumb_searchFind nodes across the file by name and/or type — 'where is the primary button?', 'every TEXT layer named Title', etc. Returns matches with id, name, type, page, and size. Drill into one with plumb_node, or pull its asset with plumb_assets. Plugin path; needs the Plumb plugin paired.
  • plumb_componentsList every Figma component definition in the file and the instance usages of each — useful for understanding the design system before building. Each component carries an instance count; each instance carries the component id, so you can match usage to definition. Plugin path; needs the Plumb plugin paired.
  • plumb_verifyCompare what you built against the Figma design and return structured deltas — exact, deterministic, no pixel diff. After rendering, for every element you tagged `data-plumb-id="<el>"` (or the globally-unique `data-plumb-id="<path>"` for deeply nested DOM), collect: • box — getBoundingClientRect() → { x, y, w, h } • styles — a subset of getComputedStyle: backgroundColor, color, fontFamily, fontSize, fontWeight, lineHeight, padding{Top,Right,Bottom,Left}, gap, flexDirection, justifyContent, alignItems, borderRadius, borderColor, borderWidth, opacity, textDecorationLine, boxShadow, backdropFilter • text — textContent for TEXT nodes • asset — for image/icon/logo nodes (assetId or vector): the data-plumb-asset="<assetId>" you rendered, plus img:true when it is a real <img>/<svg> (not a redrawn div). Verify errors on a visual node rendered with no real asset, so a redrawn/omitted logo lowers the score. Pass them as `rendered`. The tool joins by `el` (loose) or `path` (strict) and returns deltas like { kind:'size.w', expected:528, actual:530, severity:'warn' }. The response also includes `coverage` — how many PDS els in the subtree were actually tagged, plus an `untagged` list so you know what to add next round. QA-strict on appearance — colour (ΔE2000), icon/asset fidelity, box-shadow, backdrop-filter (glass) and the rest flag even small misses — but content-aware on text: a mismatch on placeholder/template copy (lorem, generic labels, numeric stubs, copy-pasted cells) is advisory `info` (kind 'text.placeholder', doesn't dent the score), since you're meant to swap real content in. Real UI labels still warn (kind 'text.chars'). ok=true means no errors; warns are differences you may have meant.
  • plumb_fitSelf-healing build loop — iterate to a pixel-perfect match instead of a one-shot check. The loop: 1. Build the component, stamping data-plumb-id="<el>" on each element using the PDS handles (same `el` keys plumb_node/plumb_query return). 2. Capture box (getBoundingClientRect) + the getComputedStyle subset (backgroundColor, color, font*, padding*, gap, flex*, justifyContent, alignItems, borderRadius/Color/Width, opacity, textDecorationLine) + text for every tagged element. Same shape as plumb_verify. 3. Call plumb_fit with `rendered`. You get back: • score — 0–100 convergence (coverage × fidelity), climbs as you go • done — true once score ≥ accept (default 98) and no errors remain • topFixes — the highest-leverage changes, sorted error-first • bar — a printable ▰▱ progress bar • instruction — what to do next 4. If done=false, apply topFixes, re-render, call plumb_fit again. Repeat until done=true. Each round the score should rise; if it stalls, read the full `deltas` and `coverage.untagged` to see what you missed.
  • +11 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Figwright

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "awdr74100-figwright": {
      "command": "npx",
      "args": [
        "-y",
        "@figwright/mcp@latest"
      ]
    }
  }
}

Plumb MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "plumb-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "plumb-mcp"
      ]
    }
  }
}

Frequently asked questions

Figwright is categorized under Architecture & Design and uses a local stdio subprocess. Plumb MCP belongs to Architecture & Design and uses a local stdio subprocess. Pick Figwright for architecture & design work and Plumb MCP for architecture & design.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Figwright is listed as free. Auth: no auth required. Plumb MCP has no declared pricing — check the project's own site. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add awdr74100-figwright and plumb-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Figwright has a quality signal of 69/100 (Great) with 6 views, 0 installs and 1,155 GitHub stars. Plumb MCP has 65/100 (Great) with 2 views, 0 installs and 83 GitHub stars.