by tathagat22
Provides a bidirectional AI‑native design engineering platform that turns Figma files or live websites into a compact semantic design graph for code generation, design creation, and verification loops, enabling agents to work without REST rate limits or token quotas.
Plumb offers a single MCP server that normalises UI sources—Figma files via a desktop plugin or any live web page via headless Chrome—into a platform‑agnostic semantic design graph. The graph dedupes design tokens, resolves auto‑layout to flexbox, and assigns conservative role labels (nav, hero, card, etc.). Agents can consume this graph to generate code, audit designs, or even create new designs from a brief, with built‑in verification that closes the loop on both inputs and outputs.
npx -y plumb-mcp
plumb-mcp init
$(npm root -g)/plumb-mcp/figma-plugin/manifest.json.Extract the Settings screen with plumb_node and generate React via plumb_emit_react, then run plumb_fit until it matches.Use plumb_import_web on https://example.com, then plumb_emit_react to scaffold the page.Run plumb_studio with a one‑line brief to create a full Figma design, then plumb_review to iterate until the quality score exceeds 90.plumb_verify and plumb_fit diff rendered output against the source and suggest ranked fixes.plumb_studio, plumb_brand, plumb_design, and plumb_review turn a brief into a fully authored Figma file with self‑critiquing iterations.plumb_verify in CI to ensure shipped code still matches the source design.plumb_audit and plumb_tokens to enforce contrast, touch‑target size, and token hygiene..fig file tools (plumb_fig_node, plumb_fig_outline) and the REST path; just provide a FIGMA_TOKEN.plumb_emit_react). The architecture allows adding other emitters.FIGMA_TOKEN for the REST path. Optional image provider keys (UNSPLASH_ACCESS_KEY, PEXELS_API_KEY, PIXABAY_API_KEY) improve asset sourcing for the design director.plumb-mcp) — the AI-native design engineering platformPlumb is an AI-native design engineering platform, shipped as a single MCP server. Point it at a Figma file or a live website and it normalises either one into the same semantic design graph — deduped tokens, flexbox-resolved layout, conservative role labels (nav / hero / card …) — that your coding agent can build from and a verification loop can grade. Point it at a one-line prompt instead and it becomes an AI design director: it researches best-in-class references, extracts a brand, and generates a full, on-brand Figma file on your canvas, then critiques its own render until it clears the bar.
Design → code (Figma or the live web, verified, not vibes) • prompt → design (research → brand → generate → critique) • one semantic design graph underneath both. MCP-native — works with Claude Code, Cursor, Windsurf, or any agent that speaks Model Context Protocol.
📖 Full docs: https://tathagat22.github.io/plumb-mcp/ · 📦 npm: plumb-mcp · 🇨🇳 简体中文 · 🇯🇵 日本語 · 🇰🇷 한국어
Built for coding agents — Claude Code, Cursor, Windsurf, anything MCP-compatible. Design engineering, agent-native: no dashboard, no separate app to babysit, no human shuttling pixels between Figma and an editor. It reads Figma through a desktop-app plugin (no REST rate limits, works on every plan including Free), reads any live website through headless Chrome, writes new designs back into Figma through the same plugin, and returns compact normalised specs instead of the multi-hundred-thousand-token JSON the Figma API emits.
Most Figma MCP servers — and most figma-to-code tools generally — are one shape in, one shape out: Figma JSON in, one framework's code out, done. Plumb's architecture is a hub, not a pipe:
plumb_node normalises a Figma screen; plumb_import_web normalises a live webpage's DOM. Both land as the same platform-agnostic Semantic Graph — containment, repeat-group, and role edges — regardless of where the pixels came from.plumb_emit_react generates the same deterministic React/JSX whether the graph came from Figma or from a URL. plumb_diff, plumb_audit, and plumb_query's role filters all work identically on both. That's the concrete proof it's a platform, not a converter with a second input bolted on.plumb_verify / plumb_fit diff your shipped code against the source of truth and hand back ranked fixes — "looks right" becomes measurably true.plumb_studio composes a brand-new Figma file from a brief, and plumb_review critiques the render the same way plumb_verify critiques code.One semantic model. Multiple sources in (Figma, the web), multiple targets out (React code, Figma files), verified at both ends. That's the platform.
Your agent extracts a screen — or any live URL via plumb_import_web — as a compact Plumb Design Spec (PDS) riding on the same semantic graph: auto-layout pre-resolved to flexbox, design tokens deduped, roles labelled. It builds the UI, then calls plumb_verify / plumb_fit to diff the rendered result against the source and self-correct to pixel-perfect. The only Figma MCP that closes the loop on code — and the only one that runs the identical loop against a plain webpage, no Figma file required.
Give Plumb a one-line brief — "a premium fintech dashboard" — and it acts like a senior designer working live in your Figma:
That's prompt-to-Figma design generation with a self-improving director loop — not a one-shot mockup.
Other Figma MCP servers you may know:
And beyond the MCP world, the broader design-to-code / AI-UI-generator category — tools like html.to.design, Anima, Locofy, or prompt-first generators like v0 and Builder.io's Visual Copilot — typically move in one direction only (design in, code out, or prompt in, code out) with no shared model spanning both, and no built-in step that checks the output against the source afterward.
Plumb is the only one that both closes the loop on code and directs new design generation, on top of one semantic graph that doesn't care whether the source was Figma or a URL. plumb_verify tells you whether shipped code actually matches the design (or the reference page); plumb_fit turns that into a self-healing loop. plumb_import_web + plumb_emit_react prove the graph travels: the same role classifier and the same code generator run against a live website with zero Figma involved. And on the write side, plumb_studio / plumb_brand / plumb_design / plumb_review turn a prompt into a designed, critiqued Figma file — no design skills, no separate design tool, no extra model key.
If your agent landed here from an error, Plumb probably solves it.
| Error you're seeing | Why Plumb fixes it |
|---|---|
Figma Dev Mode MCP exceeded the 25k token cap · 351,378 tokens observed |
PDS dedups design tokens ($c1, $t1 …) and pre-resolves auto-layout to flexbox. A 178-node dialog comes back at ~2.6k tokens. |
Dev Mode MCP: 6 tool calls per month limit · Starter plan tool-call limit reached |
Plumb's plugin path has no per-call quota on any plan, including Free. |
Framelink figma-developer-mcp HTTP 429 · Figma REST API rate limit exceeded |
The plugin path doesn't touch REST. Zero rate limits. |
Variables API requires Enterprise plan · 403 Forbidden on variables |
Plumb reads Variables through the Figma Plugin API — works on every plan. |
Figma MCP returned 85% wrong layout · hallucinated structure |
Plumb returns structured PDS (not parsed prose) and ships plumb_verify + a plumb-mcp verify CLI that diffs your rendered DOM against the design. |
| "How do I generate a Figma design from a prompt?" · "AI that designs UI in Figma" | plumb_studio — brief → researched references → extracted brand → a full composed Figma page, critiqued and refined. |
| "Is there an AI-native design engineering platform?" · "AI design engineer agent" | Plumb — one MCP server, one semantic design graph, Figma and the web as sources, code and Figma as targets, verified on both ends. |
| "Convert a website to Figma" · "scrape a website into a design system" · "HTML to React with AI" | plumb_import_web reads any live URL into the same semantic graph as a Figma screen — no browser extension, no manual redraw — and plumb_emit_react generates React/JSX straight off it. |
Install: npm install -g plumb-mcp → plumb-mcp init.
# 1. Install
npm install -g plumb-mcp
# 2. Wire into your editor — auto-detects Claude Code / Cursor / VS Code / Windsurf
plumb-mcp init
# 3. Sideload the Figma plugin (one-time). Find the manifest:
echo "$(npm root -g)/plumb-mcp/figma-plugin/manifest.json"
# Figma desktop → Plugins → Development → Import plugin from manifest…
# Run Plumb → click "Pair with Plumb" → done. Future runs collapse to a dot.
Then, in your agent:
# Figma → code
"Extract the Settings screen with Plumb and build it, then plumb_fit until it matches."
# web → code, no Figma required
"Use plumb_import_web on https://example.com, then plumb_emit_react to scaffold it."
# prompt → design
"Use plumb_studio to design a premium fintech dashboard, then screenshot it and
run plumb_review as the director until the score clears 90."
Other install paths: npx plumb-mcp · docker run --rm -i ghcr.io/tathagat22/plumb-mcp:latest · build from source.
Every tool below reads from or writes to the same semantic design graph described above — that's what makes adding a new source (the web) or a new target (React) additive, not a rewrite.
| Tool | What it does |
|---|---|
plumb_status |
Self-description, key legend, connection state. Call first. |
plumb_outline |
Every screen in the file (id, name, size). |
plumb_node |
Extract a screen as compact PDS — by id or by name. |
plumb_query |
Pull a slice (skeleton / buttons / text / components / role) when a full screen would blow the token budget. |
plumb_describe |
Text-only visual description — for image-blind harnesses. |
plumb_tokens |
Design-token table (colours, type, radii, shadows). |
plumb_selection |
The user's live Figma selection. |
plumb_assets |
Export icons (SVG) + images (PNG) — recursive, list, or surgical by ids. |
plumb_screenshot |
Render any node to PNG/JPG. |
plumb_search |
Find nodes by name and/or type. |
plumb_components |
List components + instance usages, plus an opt-in design-system health report (unused components, near-duplicate names, variant outliers). |
plumb_verify |
Diff rendered layout against the design — ΔE2000 colour, shadow/rotation/flex checks. |
plumb_fit |
The self-healing loop: verify + a 0–100 convergence score + prioritised fixes. |
plumb_fig_outline / plumb_fig_node |
Headless: read a saved .fig file from disk. No Figma desktop, no token. |
plumb_diff |
Semantic diff between two PDS snapshots — "the hero moved from (0, 0) to (0, 120)", not a JSON diff. |
plumb_audit |
Heuristic accessibility checks — text contrast, button touch-target size. |
plumb_import_web |
Import a live webpage's structure and semantics — no Figma connection needed. Same role classifier Figma designs use. |
plumb_emit_react |
Deterministic React/JSX generator from a PDS or a plumb_import_web result — same emitter, either source. |
| Tool | What it does |
|---|---|
plumb_studio |
The design director. One brief → researched references → extracted brand → a full composed Figma page. Returns the node ids + authored spec so you can critique and refine. |
plumb_brand |
Brief → live-screenshots best-in-class reference sites + a synthesized brand palette/type board on the canvas. |
plumb_design |
Author a design from Plumb's high-level Design DSL and build it into Figma (full control: pages, sections, components, motion). |
plumb_review |
The critique loop: blends a structural diff, a deterministic design rubric, and the calling agent's own vision verdict into one score + ranked fixes. No API key — the agent that drives the MCP server is the creative director. |
plumb_source |
Resolve on-brief assets (icons, photos, illustrations, patterns) for a design. |
plumb_verify / plumb_fit diff the rendered result against the design (ΔE2000 perceptual colour, shadow, rotation, flex-child, fill-stack) — no pixel diff, runs in CI.node.pattern — silence over a guess when the signals don't line up) and builds on it: plumb_diff narrates changes by role, plumb_audit flags contrast and touch-target issues, plumb_query's select: "role" and plumb_node's collapseRoles filter and compress by the same labels. The same underlying model reads a live webpage too — plumb_import_web extracts structure and roles from any URL, no Figma involved — and plumb_emit_react generates deterministic React/JSX from either source.| Plugin (primary) | REST (secondary, headless) | |
|---|---|---|
| Rate-limited | No. Reads the in-memory document. | Yes. Free/Starter get very low budgets. |
| Token required | No. | Yes — FIGMA_TOKEN. |
| Variables | Yes, every plan. | No — Variables REST is Enterprise-only. |
| Write (generate designs) | Yes. | No. |
| Headless / CI | No (needs Figma open). | Yes. |
Tools auto-pick the path. With the plugin paired, omit fileKey and pass id or name.
.env (gitignored — never commit secrets; Plumb loads it on startup):
FIGMA_TOKEN=figd_your_read_only_token # REST path only
# prompt→design photo providers (all free — for on-brief imagery)
UNSPLASH_ACCESS_KEY=…
PEXELS_API_KEY=…
PIXABAY_API_KEY=…
~/.cache/plumb/v1/ (override with PLUMB_CACHE_DIR)../plumb-assets/<screen>/ · Screenshots — ./plumb-screenshots/.Contributions welcome — from typo fixes to new verify checks to design-director upgrades. See CONTRIBUTING.md. New here? Browse the good first issue label.
MIT © Tathagat Maitray. See LICENSE.
Please log in to share your review and rating for this MCP.
Explore related MCPs that share similar capabilities and solve comparable challenges
by modelcontextprotocol
A Model Context Protocol server for Git repository interaction and automation.
by zed-industries
A high‑performance, multiplayer code editor designed for speed and collaboration.
by modelcontextprotocol
Model Context Protocol Servers
by modelcontextprotocol
A Model Context Protocol server that provides time and timezone conversion capabilities.
by cline
An autonomous coding assistant that can create and edit files, execute terminal commands, and interact with a browser directly from your IDE, operating step‑by‑step with explicit user permission.
by upstash
Provides up-to-date, version‑specific library documentation and code examples directly inside LLM prompts, eliminating outdated information and hallucinated APIs.
by daytonaio
Provides a secure, elastic infrastructure that creates isolated sandboxes for running AI‑generated code with sub‑90 ms startup, unlimited persistence, and OCI/Docker compatibility.
by continuedev
Enables faster shipping of code by integrating continuous AI agents across IDEs, terminals, and CI pipelines, offering chat, edit, autocomplete, and customizable agent workflows.
by github
Connects AI tools directly to GitHub, enabling natural‑language interactions for repository browsing, issue and pull‑request management, CI/CD monitoring, code‑security analysis, and team collaboration.
{
"mcpServers": {
"plumb": {
"command": "npx",
"args": [
"-y",
"plumb-mcp"
],
"env": {
"FIGMA_TOKEN": "<YOUR_FIGMA_TOKEN>",
"UNSPLASH_ACCESS_KEY": "<YOUR_UNSPLASH_ACCESS_KEY>",
"PEXELS_API_KEY": "<YOUR_PEXELS_API_KEY>",
"PIXABAY_API_KEY": "<YOUR_PIXABAY_API_KEY>"
}
}
}
}claude mcp add plumb npx -y plumb-mcp