Plumb MCP vs Figma Flutter MCP

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

Plumb 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 declaredFigma Flutter MCP logoFigma Flutter MCPArchitecture & Design · Local subprocess (stdio)Provide coding agents direct access to Figma data to help them write Flutter code for building apps including assets exports, widgets maintenance and full screens implementations.64GoodAuth: api key required

Verdict: choose Plumb MCP for architecture & design work as a local process; choose Figma Flutter 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?

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

Figma Flutter MCP logoChoose Figma Flutter MCP when

  • You need dedicated capabilities in the Architecture & Design domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: API key required.
  • You have the keys it needs: FIGMA_API_KEY.
  • You want tools like export_flutter_assets, export_svg_flutter_assets, analyze_figma_component.
Explore Figma Flutter MCP

Feature & specification comparison

Rows where the two servers differ are marked.

SpecPlumb MCP logoPlumb MCPFigma Flutter MCP logoFigma Flutter MCP
CategoryArchitecture & DesignArchitecture & Design
Quality signal65/100 · Great64/100 · Good
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNot declaredAPI key required
PricingNot declaredFree
Required env varsNone listedFIGMA_API_KEY
Verified ownerCommunity listingCommunity listing
GitHub stars83241
Directory activity 2 views 0 installs 0 upvotes 5 views 0 installs 0 upvotes
Tools2313

Tools & capabilities

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

Figma Flutter MCP tools 13

  • export_flutter_assetsExport images from Figma nodes and set up Flutter assets directory with pubspec.yaml
  • export_svg_flutter_assetsExport SVG assets from Figma nodes. Detects SVG content by analyzing vector percentage - nodes with >30% vector content are considered SVG assets. Handles nested GROUP/FRAME structures with mixed content.
  • analyze_figma_componentAnalyze a Figma component or component set to extract layout, styling, and structure information for Flutter widget creation. Use analyze_full_screen for complete screen layouts.
  • list_component_variantsList all variants in a Figma component set to help with variant selection
  • inspect_component_structureGet a quick overview of component structure, children, and nested components. Use inspect_screen_structure for full screens.
  • generate_flutter_implementationGenerate complete Flutter widget code using cached style definitions
  • style_library_statusGet comprehensive status report of the cached style library
  • analyze_full_screenAnalyze a complete Figma screen/frame to extract layout, sections, navigation, and structure information for Flutter screen implementation
  • inspect_screen_structureGet a quick overview of screen structure, sections, and navigation elements
  • extract_theme_colorsExtract colors from a Figma theme frame containing color swatches with labels
  • inspect_theme_frameInspect the structure of a theme frame to understand its contents before extraction
  • extract_theme_typographyExtract typography styles from a Figma theme frame containing text samples with different styles
  • +1 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.

Plumb MCP

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

Figma Flutter MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "mhmzdev-figma-flutter-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figma-flutter-mcp"
      ],
      "env": {
        "FIGMA_API_KEY": "YOUR_FIGMA_API_KEY_HERE"
      }
    }
  }
}

Frequently asked questions

Plumb MCP is categorized under Architecture & Design and uses a local stdio subprocess. Figma Flutter MCP belongs to Architecture & Design and uses a local stdio subprocess. Pick Plumb MCP for architecture & design work and Figma Flutter 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.

Plumb MCP has no declared pricing — check the project's own site. Figma Flutter MCP is listed as free. Auth: api key required. 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 plumb-mcp and mhmzdev-figma-flutter-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Plumb MCP has a quality signal of 65/100 (Great) with 2 views, 0 installs and 83 GitHub stars. Figma Flutter MCP has 64/100 (Good) with 5 views, 0 installs and 241 GitHub stars.