Skip to main content
Glama
tathagat22

Plumb (plumb-mcp)

by tathagat22

Plumb (plumb-mcp) — the AI-native design engineering platform

Plumb 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.


Why "design engineering platform," not "Figma converter"

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:

  • Two independent sources feed the same graph. 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.

  • Every consumer runs against either source, unmodified. 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.

  • Verification closes the loop on the way out, not just the way in. plumb_verify / plumb_fit diff your shipped code against the source of truth and hand back ranked fixes — "looks right" becomes measurably true.

  • Generation runs the loop in reverse. 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.


Related MCP server: @forgespace/ui-mcp

Two directions, one server

← Figma or the web → code (read direction)

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.

→ prompt → design (write direction — the design director)

Give Plumb a one-line brief — "a premium fintech dashboard" — and it acts like a senior designer working live in your Figma:

  1. Researches references — finds best-in-class sites for your brief (Linear, Stripe, Mercury…) and screenshots them live onto a References page.

  2. Extracts a brand — reads their computed CSS into a coherent palette + type scale, laid down as a Brand board.

  3. Generates the design — composes a full, on-brand page (nav, hero, features, gallery, CTA, footer) from a high-level design DSL, built as real Figma nodes.

  4. Critiques its own render — the calling agent (Claude Code / any MCP client with vision — no extra API key when run as an MCP tool; the standalone plumb-mcp fit CLI is the one exception, see Standalone CLI below) grades the screenshot; Plumb blends that with a deterministic design rubric and a structural diff, then hands back a ranked fix list and iterates until it clears the bar.

That's prompt-to-Figma design generation with a self-improving director loop — not a one-shot mockup.


How Plumb is different

Other Figma MCP servers you may know:

  • Figma's official Dev Mode MCP — bidirectional, but plan-gated and metered.

  • Framelink — thin REST wrapper. Two tools. No verification, inherits rate limits.

  • cursor-talk-to-figma — bidirectional automation for designers working in Figma.

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 (as MCP tools; see Standalone CLI for the one command that needs one).


Are you hitting one of these?

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-mcpplumb-mcp init.


See it work in 30 seconds — no account, no key, no network

Before you install anything or connect a Figma file, run the loop and watch it score itself:

npx plumb-mcp demo          # or: docker compose up demo

It takes a real design spec, hands the verification engine a build of that same screen with 13 planted mistakes in it — a headline one step down the type scale, a pill button rendered as a rounded rectangle, a gradient flattened to a flat fill, a badge that was never built at all — and prints what it caught:

  Round 1 · First pass — built straight from the spec, no verification
    ▰▰▰▰▰▰▰▱▱▱  71.0%   8 errors · 1 warnings · 32/34 key nodes built

    ✓ The "MOST POPULAR" badge was never built — no element carries its handle
      pro-badge           not built         no data-plumb-id for this handle in the DOM
    ✓ Headline came out one step down the type scale (48px → 40px)
      title               text.size         expected 48  ·  got 40
    ✓ Primary CTA is a hand-picked purple, not the brand token
      pro-cta             fill              expected #6366f1  ·  got #7c5cf5
    …

  Scoreboard
    Mistakes planted      13
    Caught                13   (100% recall)
    False positives       0   across 27 untouched nodes
    Convergence           71.0% → 96.2% → 100.0%

No Figma token, no plugin, no browser, no network — docker compose up demo even runs with network_mode: none. The engine scoring the demo is the same one behind plumb_verify and plumb_fit, and those numbers are asserted in src/demo/demo.test.ts, so the demo fails CI if it ever stops being true. plumb-mcp demo --pds prints the design spec it runs against; --json emits the results for scripting and exits non-zero if the engine missed anything.


Quick start

# 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.

Requires Node 20+. Nothing below needs a credential or a Figma account:

git clone https://github.com/tathagat22/plumb-mcp
cd plumb-mcp
npm ci
npm run demo        # the offline walkthrough — proves the checkout works
npm test            # 600+ specs
npm run typecheck   # strict TS, server + plugin
npm run lint
npm run build       # bundles the server, the Figma plugin, and Studio into dist/
node dist/index.js --help

npm run build produces dist/index.js (the MCP server), dist/studio/ (the live cockpit the bridge serves), and figma-plugin/code.js (the plugin main thread you sideload). If any step fails on a clean checkout, that's a bug — open an issue.


Twenty-eight tools, one semantic graph

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.

Read — Figma or the web → code

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.

plumb_scan_references

Scan N live reference URLs and extract a per-role style digest (typical hero height, card-grid density, nav style) — for folding into a plumb_design DSL or plumb_studio brief by hand; it doesn't compose anything itself.

Write — prompt → design (the director)

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_studio_start / plumb_studio_kit / plumb_studio_page

The same director flow, split into three watchable steps (brand+references → component kit → product page) so you can review between each one, on separate named Figma pages, instead of one opaque call.

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.


Why it wins on tokens and quality

  • Compact specs. A 178-node dialog that is 351k tokens of Figma REST JSON comes back as ~2.6k tokens of PDS — deduped tokens, flexbox-resolved layout, depth-stable handles.

  • Verified, not vibes. 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.

  • Designed, not defaulted. The write direction bakes real design craft in: size-aware letter-spacing, generous section rhythm, extracted brand palettes from real references, gradient text, full-bleed and asymmetric layouts, and a vision-based director that grades the render and pushes it up.

  • Understands structure, not just geometry — and not just Figma. Plumb tags nav/hero/footer/sidebar/card conservatively on top of the raw tree (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.


Two data paths

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.


Configuration

Nothing is required to try Plumb: npm run demo needs no configuration at all, and the plugin path (plumb_outline, plumb_node, plumb_selection, …) only needs the Figma plugin paired.

Copy .env.example to .env (gitignored) for local use. Plumb loads it from the working directory and the package root on startup — but an MCP client spawns the server as a fresh process, so the most reliable place for keys is your client's server env block.

Environment variables

Variable

Required for

Default when unset

FIGMA_TOKEN

The Figma REST path (plumb_fig_outline, plumb_fig_node) and the standalone CLIs

REST tools return an instruction-shaped error; the plugin path is unaffected

FIGMA_ACCESS_TOKEN

Alias for FIGMA_TOKEN, checked second

PLUMB_FILE_KEY

npm run prove; default file for the CLIs

Must be passed as an argument instead

PLUMB_NODE_ID

npm run prove

131:6950

PLUMB_BRIDGE_PORT

Pinning the bridge to one port (containers, >10 concurrent sessions)

Scans the 3133731346 pool

PLUMB_BRIDGE_PORTS

An ordered pool to try, comma-separated; 0 means any free port

Same built-in pool

PLUMB_BRIDGE_HOST

Publishing the bridge from inside a container

127.0.0.1 — loopback only

PLUMB_SESSION_NAME

The label this session shows as in the plugin panel

The current directory name

PLUMB_LOG_LEVEL

debug | info | warn | error — logs always go to stderr, never stdout

info

PLUMB_LOG_FORMAT

json for one JSON object per line, for a log shipper

Human-readable lines

NO_COLOR / TERM

Honoured, never set — the standard conventions for disabling ANSI colour in plumb-mcp demo

Colour when stdout is a TTY

PLUMB_ASSETS_DIR

Where plumb_assets writes exports

./plumb-assets/

PLUMB_SCREENSHOTS_DIR

Where plumb_screenshot writes PNGs

./plumb-screenshots/

PLUMB_CACHE_DIR

Response cache root

~/.cache/plumb/

PLUMB_CACHE_TTL_MS

Cache entry lifetime

300000 (5 minutes)

PLUMB_CHROME

Chrome binary for plumb_verify / plumb_fit / plumb_import_web

Auto-detected from the standard install paths

CHROME_PATH

Alias for PLUMB_CHROME, checked second

ANTHROPIC_API_KEY

The standalone plumb-mcp fit CLI only — every MCP tool is key-free

plumb-mcp fit exits with a setup message

PLUMB_FIT_MODEL

Model override for that CLI

The built-in default

UNSPLASH_ACCESS_KEY

On-brief photography in the write direction (free tier)

Falls back to random Lorem Picsum placeholders

PEXELS_API_KEY

Same, alternative provider (free tier)

Same fallback

PIXABAY_API_KEY

Same, alternative provider (free tier)

Same fallback

GOOGLE_FONTS_API_KEY

Searching the full Google Fonts catalog

Popular-subset search still works


Run it in a container

docker compose up demo      # the offline walkthrough, network disabled — start here
docker compose up bridge    # bridge + Plumb Studio on http://127.0.0.1:31337
docker compose run --rm mcp # the stdio MCP server, for an editor to attach to

The bridge serves GET /healthz (aliased as /health) — liveness plus whether a plugin is actually paired — which is what the Compose healthcheck probes, and GET /metrics in Prometheus text format.

bridge publishes a single fixed port (containers can only publish ports they know, so PLUMB_BRIDGE_PORT replaces the scan) and maps it to the host's loopback only — no more reachable than running natively. Exported assets, screenshots, and the cache land in the plumb-data volume.

There is also a devcontainer: open the repo in VS Code or Codespaces, and it installs both workspaces and runs the demo on attach.


Run it on Kubernetes — and catch design drift on a schedule

helm install plumb ./deploy/helm/plumb --namespace plumb --create-namespace
helm test plumb --namespace plumb
kubectl -n plumb port-forward svc/plumb 31337:31337   # Studio + plugin pairing

A Helm chart, plain manifests, and a Terraform module — all three producing the same locked-down deployment, all validated in CI (helm lint, kubeconform -strict against real API schemas on two Kubernetes versions, terraform validate, Trivy and Checkov policy scans, and a regenerate-and-diff so the plain manifests can't drift from the chart).

The reason to put Plumb in a cluster rather than only on a laptop is continuous design verification: a CronJob renders a URL you already serve, diffs every [data-plumb-id] element against the Figma node it was built from, and fails when they drift.

verify:
  enabled: true
  schedule: "0 * * * *"
  targets:
    - name: dashboard
      url: http://app.default.svc.cluster.local/dashboard
      node: "190:109884"

A design regression stops being something someone notices in a review three weeks later, and becomes a failing job with a timestamp and a delta list.

The bridge has no authentication of its own — its security model is loopback plus a deliberate pairing click. So the defaults expose nothing: ClusterIP, a deny-all NetworkPolicy, no ingress, and kubectl port-forward as the way in. deploy/README.md is explicit about what works in a cluster, what doesn't (the Figma plugin scans 127.0.0.1, so it needs the port-forward), and what each switch actually exposes.


Standalone CLI

Two commands run outside any MCP client, straight from a terminal — useful for CI or for driving Plumb without an agent in the loop:

plumb-mcp verify <dev-url> --node <figma-node-id>   # diff a running page against the design
plumb-mcp fit <figma-url>                           # generate + self-correct an HTML build until it matches

plumb-mcp verify needs only FIGMA_TOKEN (or the plugin, if paired) — it diffs, it doesn't generate, so no model key. plumb-mcp fit is the one command in this whole project that calls an external model directly: it generates the HTML build itself (no agent to do that job for it), so it needs ANTHROPIC_API_KEY in addition to FIGMA_TOKEN. Every MCP tool, including plumb_fit and plumb_review, stays key-free because the calling agent supplies the generation/judgment instead.


Network egress

Call site

Talks to

When

Figma plugin bridge

localhost only (WebSocket)

Whenever the plugin is paired

Figma REST (FIGMA_TOKEN path)

api.figma.com

Only if the plugin isn't paired, or for headless/CI use

plumb_import_web / plumb_scan_references / headless CLIs

The target URL(s) you pass in, via headless Chrome (CDP)

Only when you call these

plumb_studio / plumb_brand reference research

The reference sites Plumb picks for your brief

Only in the prompt→design write direction

Google Fonts

fonts.googleapis.com / fonts.gstatic.com

Only when a captured design/import references a Google Font

UNSPLASH_ACCESS_KEY / PEXELS_API_KEY / PIXABAY_API_KEY providers

The respective photo API

Only in the write direction, only if a key is set

plumb-mcp fit CLI

api.anthropic.com

Only for this one standalone CLI command (see Standalone CLI)

Nothing above fires on its own — every network call is a direct consequence of a tool or CLI command you invoked. There's no background polling, telemetry, or phone-home.


Security

  • Loopback-only WebSocket bridge; a single paired plugin at a time (one deliberate click).

  • Zero telemetry. No personal-access token needed for the plugin path.

  • The write direction never calls an external model — the AI agent already driving the MCP server does the design judgment (the standalone plumb-mcp fit CLI is the sole exception; see Standalone CLI).


Contributing

Contributions welcome — from typo fixes to new verify checks to design-director upgrades. See CONTRIBUTING.md. New here? Browse the good first issue label.


License

MIT © Tathagat Maitray. See LICENSE.

Available Tools

28 tools
plumb_assetsPlumb · assetsA
Idempotent

Export 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoScreen/node id to scope the export to.
idsNoSurgical — export exactly these node ids (one each, no recursion).
rawNoFor nodes with IMAGE fills, export the original uploaded bytes (JPG/PNG/GIF/WEBP) via getImageByHash, instead of a 2× rasterised PNG render. Other nodes (icons, vectors) export the same as default.
listNoManifest only — return id/name/format/parentId per candidate; no file writes.
nameNoScreen name — resolved against the file.
inlineNoReturn asset bytes inline on each row: SVGs as raw markup, bitmaps under 64KB as a data: URI. Useful for dropping SVG icons straight into JSX without re-reading from disk. Files are still written; this is additive.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses behaviors beyond annotations: List mode writes no files and is cheap, Surgical exports exact node ids without recursion, inline adds data to responses. Annotations (idempotentHint: true) are consistent; no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, well-structured with bullet points and plain English. Every sentence adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description partially covers return values: manifest details for List, file writing behavior, inline data format. Could be more explicit about output structure for Default/Surgical, but sufficient for selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 6 parameters (100% coverage), so baseline is 3. Description adds significant value by linking parameters to modes (e.g., 'id/name for Default', 'list: true' for List, 'ids' for Surgical) and explaining behaviors like raw and inline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Export Figma assets — icons as SVG, images as PNG' and defines three distinct modes (Default, List, Surgical), making the tool's purpose specific and differentiating it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use each mode: Default for recursive export, List for cheap discovery (recommended first), Surgical for specific node ids. Provides clear alternatives within the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_auditPlumb · auditA
Read-onlyIdempotent

Heuristic accessibility audit over a PDS snapshot — pass the raw JSON response from a prior plumb_node/plumb_outline/plumb_query call. Checks today: text contrast against its resolved ancestor background (WCAG AA, large-text threshold applied at ≥24px) and role:"button" nodes under the 44×44px minimum touch-target size. Each finding carries a plain-language note plus the raw ratio/box data. This is a heuristic problem-finder, not a certified WCAG audit — it reports failures only (a clean result means the checks it runs found nothing, not that the screen is fully accessible), and heading-order / missing-alt-text checks aren't built yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
docYesA full PdsDocument object exactly as returned by plumb_node / plumb_outline / plumb_query.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, but the description adds value by explaining that it is heuristic, reports only failures, and a clean result does not imply full accessibility. This provides behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph that efficiently conveys purpose, usage, and limitations. It is well-structured but slightly verbose with examples of checks; still, every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains what findings contain (note + raw data) and limitations. With only one parameter and good annotations, the description is fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'doc' is described in the schema as 'A full PdsDocument object', but the description adds specificity: 'pass the raw JSON response from a prior plumb_node/plumb_outline/plumb_query call', clarifying the expected format and origin.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs a heuristic accessibility audit over a PDS snapshot, specifying the checks (text contrast and touch-target size). It distinguishes itself from sibling plumb_* tools by focusing on audit, not extraction or manipulation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: after getting a PDS snapshot from plumb_node/plumb_outline/plumb_query. Also mentions what it does not do: it is not a certified WCAG audit, heading-order/missing-alt-text checks are missing, and it reports only failures.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_brandPlumb · brand (direct + build)A

Direct a brand board from a one-line brief and BUILD it into the paired Figma file. Given a brief (e.g. "a premium fintech dashboard"), Plumb discovers a diverse set of best-in-class reference sites, screenshots them live, synthesizes a coherent semantic palette from their computed CSS, and assembles a single 1440-wide Brand page (reference screenshots + colour swatches + a type scale) — then compiles it down through the same DSL → PDS → emit-plan write path plumb_design uses and executes it via the plugin. Returns the picked references, the synthesized brand palette, and the built root node id. Requires the Plumb plugin to be paired.

ParametersJSON Schema
NameRequiredDescriptionDefault
briefYesOne-line description of what's being built, e.g. "a premium fintech dashboard". Drives reference discovery + palette.
countNoHow many reference sites to study + screenshot (default 4).
referencesNoExplicit reference URLs to include first — always studied ahead of the discovered catalogue.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide minimal behavioral hints (readOnlyHint=false). The description compensates fully by detailing the entire process: reference discovery, live screenshots, CSS computation, palette synthesis, assembly, compilation, and execution via plugin. It also specifies return values (references, palette, root node id) and a prerequisite (plugin pairing). No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a concise opening sentence that captures the core action, followed by a detailed process explanation, return values, and a prerequisite note. While informative, the second sentence is lengthy and could be slightly more terse without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description explicitly states what is returned (references, palette, root node id). It covers inputs, workflow, outputs, and prerequisites (plugin pairing). The tool is well-situated among siblings with clear differentiation. No gaps are evident.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining how the 'brief' drives reference discovery and palette, noting 'count' defaults to 4, and specifying that 'references' are studied ahead of discovered ones. This contextualizes parameter usage beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'Direct a brand board' and 'BUILD it into the paired Figma file'. The verb+resource are specific, and it distinguishes itself from sibling tools by describing the unique pipeline (reference discovery, screenshotting, CSS computation, palette synthesis) and explicitly mentioning the same write path as plumb_design.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for creating a brand board from a one-line brief and contrasts with plumb_design by noting the shared write path. However, it does not explicitly state when to use this tool versus alternatives like plumb_design or plumb_scan_references, nor does it provide exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_componentsPlumb · componentsA
Read-onlyIdempotent

List 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. Pass health: true to also get a design-system health report: unused components (zero instances), possible duplicates (near-identical names — 'Button', 'Button copy', 'Button 2'), and variant outliers (an instance whose prop overrides don't match any other instance of the same component, among components with enough instances for a pattern to mean something). Plugin path; needs the Plumb plugin paired.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoFilter components and instances to a single Figma page by name (case-insensitive, substring-friendly). Massive token saver on files that hide a 200-variant style guide on one page.
healthNoAlso compute a design-system health report (unused components, possible duplicates, variant outliers) over the (page-filtered) component/instance list. Default false — purely additive to the response, existing callers see no shape change when omitted.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral context beyond annotations: it notes the tool requires the Plumb plugin ('Plugin path; needs the Plumb plugin paired') and explains that the health parameter is purely additive. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose and each sentence adds value, but it is somewhat lengthy. Could be more concise while retaining key details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains what each component and instance carries (instance count, component id) and details on the health report. This is sufficient for a listing tool, though it could mention the response structure more explicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the description still adds value for both parameters: for 'page' it notes it's a massive token saver on files with many components, and for 'health' it clarifies default false and no shape change. This goes beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists every Figma component definition and instance usages, distinguishing it from sibling tools like plumb_outline or plumb_node, and specifies its utility for understanding the design system before building.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use the tool ('useful for understanding the design system before building') and explains the optional health report. However, it does not explicitly state when NOT to use it or suggest alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_describePlumb · describeA
Read-onlyIdempotent

Text-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoNode id to describe.
urlNoPaste a full Figma URL — fileKey + node-id auto-extracted.
nameNoScreen name (plugin path).
depthNoLevels of the tree to mine for the narrative. Default 2.
fileKeyNoREST path file key.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint. The description adds meaningful behavioral context: output is text-only per-region narrative and flat child summary derived from PDS. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences delivering purpose, use cases, output format, and sibling guidance with no superfluous content. Front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters and no output schema, description explains return narrative and summary, mentions derivation from PDS, and links to siblings. Lacks parameter-specific behavior details but sufficient for most agents.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 5 parameters with descriptions (100% coverage). The description does not add extra meaning beyond schema; it only summarizes output format. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides a 'text-only visual description of a Figma screen or node', specifies use cases (image-blind harness, sandboxed Read, token-conscious flows), and distinguishes from siblings by suggesting pairing with plumb_node and plumb_screenshot for complementary info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (when screenshot cannot be read) and when to pair with other tools (plumb_node for structural spec, plumb_screenshot for pixel reference), providing clear context versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_designPlumb · design (build)A

Author a design from a high-level Plumb Design DSL document and BUILD it into the paired Figma file. This is the write direction: the DSL (semantic pages → sections → blocks + brand tokens) is validated, compiled DOWN to the PDS IR, lowered to a Figma-native emit plan, and executed by the plugin (auto-layout frames, text, images, icons). Returns the created node ids keyed by authored element handle — the join key you then feed to plumb_review / motion. Pass a brief to record intent (audience, tone, brand) alongside the build. Use dryRun: true to compile + validate without touching Figma.

ParametersJSON Schema
NameRequiredDescriptionDefault
docNoA Plumb Design DSL document (version "1": brand + pages of semantic sections). Validated against DesignDocSchema.
modeNo`create` (default) — fresh nodes. `sync` — idempotent re-apply keyed on stable plumbKey (authored element handle); pair with `prune` to delete stale nodes.
briefNoOptional design-brief intake — records author intent alongside the build.
pruneNosync only — delete built nodes no longer in the design.
dryRunNoCompile + lower only; do NOT touch Figma. Returns plan stats + warnings so you can sanity-check before building.
revealNoScroll + select the built root in Figma when done.
targetNoWhere to build. Defaults to a new top-level frame on the current page.
pageWidthNoLayout width hint for pages that don't set their own.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Fully discloses behavior: write operation, the pipeline (validate, compile, lower, execute), side effects (touches Figma unless dryRun), output format (node ids keyed by handle). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, front-loaded with core action, well-structured without fluff. Each sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (8 params, nested objects, no output schema), the description is complete—covers purpose, process, parameters, output, and integration with siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 8 parameters have schema descriptions (100% coverage), and the description adds contextual meaning, e.g., explaining dryRun returns plan stats, and tying parameters like mode and prune to the workflow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool authors a design from a DSL and builds it into Figma. It specifies the write direction and distinguishes from siblings by mentioning the output feeds into plumb_review/motion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for use (authoring/building, dryRun for sanity-check, modes create/sync) but does not explicitly exclude other tools or give when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_diffPlumb · diffA
Read-onlyIdempotent

Semantic diff between two PDS snapshots of the same screen — call plumb_node (or plumb_outline/plumb_query) once before a design change and once after, then pass both raw JSON responses here. Returns structured deltas (added/removed/renamed/changed nodes, each with a note — e.g. 'the hero moved from (0, 0) to (0, 120)') plus a one-line summary, not a JSON diff. Narration uses the same role labels plumb_node already returns on pattern (nav/hero/footer/sidebar/card/button) when available, so 'the hero moved' beats 'el btn-3 moved 40px' whenever a role was detected. This tool does no live Figma fetching itself — it only compares two documents you already have.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterYesSnapshot taken AFTER the change. A full PdsDocument object exactly as returned by plumb_node / plumb_outline / plumb_query (the `nodes` + `root` fields are required).
beforeYesSnapshot taken BEFORE the change. A full PdsDocument object exactly as returned by plumb_node / plumb_outline / plumb_query (the `nodes` + `root` fields are required).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses output format (structured deltas with summary, not JSON diff), narration using role labels, and the fact that it only compares two documents. Annotations (readOnly, idempotent) are consistent and description adds value beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-structured paragraph that covers purpose, prerequisites, output format, and constraints without wasted words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no output schema), the description fully covers what the tool does, how to use it, and what to expect in return. It is complete for an AI agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds meaning by explaining that parameters must be full PdsDocument objects from specific tools and that nodes+root fields are required. This provides context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it performs a semantic diff between two PDS snapshots of the same screen, specifying the verb (diff) and resource (snapshots). It distinguishes from siblings by noting it does no live Figma fetching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage instructions: call plumb_node (or outline/query) before and after a change, then pass the responses here. It clarifies what it does not do (no live fetching), but does not name explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_emit_reactPlumb · emit reactA
Read-onlyIdempotent

Deterministic PDS/WebSpec → React (JSX + inline styles) code generator. Pass the raw JSON from a prior plumb_node/plumb_outline/plumb_query call (Figma) OR a prior plumb_import_web call (a live site) — the same emitter handles both, proving the underlying graph is source-agnostic. Not an LLM call: template-based and deterministic, mirroring the existing PDS→Figma emit path's own 'every conversion happens here, mechanically' design. Output is PIXEL-FAITHFUL (every box's width/height is emitted explicitly), not a hand-tuned responsive component — there's no hug/fill/fixed sizing signal in the graph yet to generate flex:1/width:auto from. Check the warnings array: vector nodes render as empty boxes (no path data is reproduced) and images with no captured source get an empty src.

ParametersJSON Schema
NameRequiredDescriptionDefault
docYesA PdsDocument (Figma) or a WebSpecDocument (plumb_import_web) — auto-detected.
componentNameNoDefault "GeneratedComponent".

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond annotations: it is template-based, deterministic, not an LLM call, and warns about vector nodes and images. This complements the readOnlyHint, openWorldHint, and idempotentHint annotations well, and there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and is well-structured. Every sentence adds value, covering input, behavior, and output characteristics. It is concise for the amount of information provided.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters, no output schema, and no nested object details, the description covers the input sources, deterministic nature, and output caveats (warnings for vectors/images). It provides sufficient context for an agent to understand the tool's role in the pipeline.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3. The description adds meaning by explaining that the 'doc' parameter auto-detects between Figma and WebSpec documents, and that 'componentName' has a default of 'GeneratedComponent'. This provides clarity beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a deterministic code generator for React JSX from PDS or WebSpec documents. It specifies the input sources (plumb_node/plumb_outline/plumb_query or plumb_import_web) and that it outputs pixel-faithful JSX+inline styles. This distinguishes it from sibling tools like plumb_outline which provide outlines, not code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains to pass raw JSON from prior plumb calls and notes that the output is pixel-faithful, not responsive, guiding appropriate usage. However, it does not explicitly mention when not to use this tool or alternative tools for responsive design.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_fig_nodePlumb · fig nodeA
Read-onlyIdempotent

Read one node from a saved .fig file by its id (the sessionID:localID form returned by plumb_fig_outline). Returns the node's type, name, size, auto-layout mode, fills, opacity, and (for TEXT nodes) characters and font. Pair with plumb_fig_outline to find the id first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNode id — `sessionID:localID` form.
figPathYesAbsolute path to a .fig file on disk.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint true and idempotentHint true. Description adds detail about returned fields (type, name, size, etc.) and special handling for TEXT nodes, which supplements the annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with action, no redundant words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given only 2 simple parameters, no output schema, and no nested objects, the description covers all essential aspects: what the tool does, how to use it (pair with outline), and what it returns (list of node properties). No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters. Description adds extra meaning by specifying the id format as 'sessionID:localID' and noting it comes from plumb_fig_outline, which is helpful beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'Read', identifies resource as 'one node from a saved .fig file', and clarifies the id format. It distinguishes from sibling tool plumb_fig_outline by stating the pairing relationship.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to pair with plumb_fig_outline to find the id first, providing clear context. Does not include explicit when-not-to-use alternatives, but the context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_fig_outlinePlumb · fig outlineA
Read-onlyIdempotent

Read a saved .fig file from disk and list every screen (top-level frame) across every page. The headless / CI counterpart to plumb_outline — works with no Figma desktop, no plugin pairing, no FIGMA_TOKEN. Use this when you've exported a .fig file and need to inspect or implement screens without opening Figma.

ParametersJSON Schema
NameRequiredDescriptionDefault
figPathYesAbsolute path to a .fig file on disk.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds behavioral context: reads from disk, lists screens across all pages, and has no external dependencies. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with action. Every phrase earns its place; no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one param, no output schema), the description fully covers purpose, usage, and behavior. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter figPath. The tool description does not add further parameter meaning beyond what the schema already provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads a .fig file and lists screens across pages. It distinguishes itself from sibling plumb_outline by noting it works without Figma desktop, plugin pairing, or FIGMA_TOKEN.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly specifies when to use: 'when you've exported a .fig file and need to inspect or implement screens without opening Figma.' Implicitly contrasts with plumb_outline, providing clear context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_fitPlumb · fitA
Read-onlyIdempotent

Self-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="" 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoScreen id.
urlNoPaste a full Figma URL — fileKey and node-id are auto-extracted.
nameNoScreen name (plugin path).
depthNoPDS depth to fetch. Default 12 — deep enough for most screens.
acceptNoScore at which to stop. Default 98.
fileKeyNoFile key (REST path).
renderedYesEach element you tagged data-plumb-id="<el>", with box + styles.
iterationNoWhich pass this is (1, 2, 3…). Informational — sharpens the coaching.
tolerancesNoOverride default thresholds.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds behavioral context: the tool is called repeatedly with rendered data from the agent's build tags, expects convergence, and returns scores and fixes. It warns about stalling and advises reading deltas and coverage. This goes beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a structured numbered list that is easy to follow. It is somewhat verbose but each sentence serves a purpose: defining the loop, input requirements, output fields, and expected behavior. Minor redundancy could be trimmed, but overall efficient for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 9 parameters, nested objects, no output schema, and is part of an iterative process, the description covers the essential workflow, input expectations, and output interpretation. It mentions the key return fields (score, done, topFixes, bar, instruction) and hints at deltas/coverage. Lacks explicit output structure details but sufficient for the iterative use case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents all parameters. The description adds value by explaining the rendered parameter shape is the same as plumb_verify, and how the iteration parameter sharpens coaching. This semantic linking helps the agent understand data flow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'self-healing build loop' for iterative pixel-perfect matching, distinct from one-shot checks. It names the verb 'iterate' and identifies the resource as visual builds. It differentiates from the sibling plumb_verify by emphasizing iteration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this for iterative refinement instead of a one-shot check, implying when-not-to-use. It provides a step-by-step loop. However, it does not explicitly list alternative tools or exclusion criteria beyond the contrast with one-shot checks, which are implied to be plumb_verify.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_import_webPlumb · import webA
Read-only

Import a live webpage's structure and semantics — no Figma connection needed. Drives headless Chrome to walk the page's visible DOM (skipping script/style/hidden elements), maps it onto the same Semantic Graph Figma designs use, and returns nodes carrying real CSS values (hex colors, literal px) plus a detected role (nav/hero/footer/sidebar) using the exact same classifier plumb_node's pattern field uses. Use this to understand an existing site's structure, audit it (plumb_audit accepts this shape too), or track it over time (plumb_diff two imports of the same URL). Text nodes also carry fontFamily, and the result carries fontLinks URLs for every captured family that matches a known Google Fonts family — so generated code doesn't silently fall back to a system font. Pass viewports to capture the SAME page at multiple sizes in one call (e.g. mobile + desktop) — a real responsive layout (a hamburger nav under 768px, a grid that collapses to one column) is invisible to a single fixed-size capture.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe page URL to import.
selectorNoCSS selector to root the walk at — omit to walk from document.body.
viewportsNoCapture the same page at multiple sizes in one call. Pass `true` for the default set (mobile 390×844, tablet 768×1024, desktop 1440×900), or an explicit array of {label, width, height}. Omit for today's single desktop capture (unchanged). Returns `{ url, viewports: { <label>: <WebSpecDocument> } }` instead of a single flat document when used.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds beyond annotations: drives headless Chrome, skips hidden elements, returns real CSS values and fontLinks. Annotations already declare readOnlyHint=true, so no contradiction. OpenWorldHint=true aligns with external webpage dependency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is dense but well-structured, front-loaded with purpose. Could be slightly trimmed (e.g., fontFamily detail), but every sentence adds value. Appropriate length for a complex import tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains return format for viewports and mentions fontLinks. Covers all params and use cases. Adequate for a tool with 3 params and rich behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, giving baseline 3. Description adds significant value for 'viewports' (explains true as default set, result shape) and 'selector'. Provides context beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool imports a live webpage's structure and semantics into a Semantic Graph, using specific verbs and resource (import web). It distinguishes from sibling tools like plumb_node and plumb_audit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (understand site structure, audit, track over time) and provides alternatives (plumb_audit, plumb_diff). Mentions that no Figma connection is needed, clarifying a non-use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_nodePlumb · nodeA
Read-onlyIdempotent

Extract 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoNode/screen id to extract.
urlNoPaste a full Figma URL — fileKey and node-id are auto-extracted (the `-` separator is normalised to `:`).
nameNoScreen name — plugin path; resolved against the paired file.
depthNoLevels to disclose. Default 3.
notesNoInclude human-readable notes per node.
fileKeyNoFigma file key — REST path. Omit when the Plumb plugin is paired.
expandAllNoWalk the entire subtree in one call, ignoring `depth`. Subject to `maxTokens` (defaults to 60000 if omitted); if the spec exceeds the budget, depth is auto-trimmed and `meta.truncated` is set. Use this to skip the drill-loop on dense screens.
maxTokensNoSoft token budget; fit-to-budget reduces depth to fit.
collapseRolesNoSemantic-aware compression: collapse every node whose detected role (nav/hero/footer/sidebar/card/button) is in this list to a one-line `summary` instead of its full subtree — same `more` contract as depth truncation (call plumb_node on that node's `id` to expand it later). Opt-in and explicit on purpose: e.g. ['nav','footer'] to skip boilerplate chrome while keeping the hero and body in full.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnly, openWorld, idempotent hints. Description adds significant behavior: deduplication, auto-layout resolved to flexbox, duplicate handling, expandAll with token budget, auto-trimming, and collapseRoles 'more' contract. Adds value beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single paragraph of 5 efficient sentences, front-loaded with main purpose. No wasted words, clear structure, easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters and no output schema, description covers extraction behavior, paths, depth control, expandAll budget, collapseRoles, and output format. Sufficient for agent to understand and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds context for dual path usage and interplay between expandAll, depth, maxTokens. Explains collapseRoles semantics. Schema gives basics; description enriches understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it extracts a Figma screen or node as a normalized PDS with deduplicated tokens and CSS-shaped node tree. It distinguishes between plugin and REST paths, differentiating it from siblings like plumb_outline or plumb_tokens.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use plugin path (with paired plugin) vs REST path (fileKey+id). Handles duplicate names with match list. Lacks direct comparison to other sibling tools for when to choose this over alternatives, but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_outlinePlumb · outlineA
Read-onlyIdempotent

Map 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoPaste a full Figma URL — fileKey is auto-extracted. Accepts /design/, /file/, /proto/, and branch URLs.
pageNoFilter to a single Figma page by name (case-insensitive). Saves tokens on multi-page files where most pages are irrelevant.
fileKeyNoFigma file key — for the REST path. Omit when the Plumb plugin is paired.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and idempotent. Description adds that it's 'cheap' and 'shallow', and explains file key auto-extraction and plugin pairing behavior, providing useful context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the main action, and contains no unnecessary words. Slightly more structured formatting could improve scannability, but overall good.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description adequately explains the return structure (pages and top-level screens with id, name, size). Annotations cover safety and idempotence. The tool's role among siblings is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are well-documented. Description adds minor context about URL types and file key omission, but does not significantly enhance parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool maps a Figma file's pages and top-level screens with specific fields (id, name, size), and distinguishes itself from plumb_node as the shallow entry point.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool (to find screens cheaply) and when to use plumb_node (to extract a screen), and notes the plugin pairing eliminates the file key need.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_queryPlumb · queryA
Read-onlyIdempotent

Query a Figma subtree by pattern instead of dumping the whole tree. Use this on dense screens where plumb_node would be too big — pull a skeleton (structure only, no text/fills/effects), every button, every TEXT node above a size, every instance of a component, or every node Plumb classified with a given semantic role (nav/hero/footer/sidebar/card — select: "role"). Mirrors the same scope-resolution as plumb_node: pass id or name with the plugin paired, or fileKey + id (or a Figma URL) on the REST path.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoNode/screen id to query within.
maxNoMaximum font size for select: "text".
minNoMinimum font size for select: "text".
urlNoPaste a full Figma URL — fileKey and node-id auto-extracted.
nameNoScreen name — plugin path, resolved against the paired file.
roleNoRequired for select: "role" — which semantic role to match against the node's `pattern` field (the same field select:"buttons" reads).
selectYesQuery pattern. "skeleton" = structure-only (drops chars, fills, effects, vectorPath, text refs). "buttons" = nodes Plumb tagged with pattern: button (equivalent to select:"role", role:"button"; kept for backward compatibility). "text" = TEXT nodes, optionally filtered by font-size min/max. "components" = INSTANCE nodes, optionally filtered to a specific componentId. "role" = nodes carrying a given semantic role — see the `role` param.
fileKeyNoFigma file key — REST path. Omit when the plugin is paired.
componentIdNoFilter for select: "components" — return only instances of this component.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, openWorldHint, idempotentHint), description adds detail: what skeleton drops (chars, fills, effects), how buttons are tagged, that text filters by font-size, etc. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single dense paragraph, front-loaded with purpose, no redundant sentences. Every sentence adds value: purpose, usage, examples, parameter clarification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite 9 params and no output schema, description covers all patterns, scoping options, parameter interdependencies, and use cases. Answers likely questions about when to use which select value and how to scope queries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% description coverage, but description adds context: explains 'select' enum options, clarifies 'role' is required for select:'role', and notes fileKey omission condition. Adds meaning beyond schema for each param.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states it queries a Figma subtree by pattern, not dumping the whole tree, and lists specific patterns (skeleton, buttons, text, components, role). It distinguishes from plumb_node by noting it's for dense screens where plumb_node would be too large.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this on dense screens where plumb_node would be too big' and lists when each select pattern is appropriate (e.g., 'pull a skeleton', 'every button'). Also notes scope-resolution mirrors plumb_node.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_reviewPlumb · reviewA
Read-onlyIdempotent

Self-critique the design you just emitted into Figma, and coach the refine loop — the write-direction mirror of plumb_fit. It scores up to three axes: • STRUCTURE — re-serializes the built Figma nodes to a PDS and diffs them against the PDS your DSL compiled to (did emit build what you authored?). Uses the same verify engine as plumb_verify/plumb_fit. The two docs are joined by ids = EmitResult.ids (authored el → Figma node id) — pass it or the diff can't line up. • DESIGN — a deterministic rubric over hierarchy, spacing rhythm, contrast (WCAG AA), alignment, type-scale, and professional-vs-templated polish. Failing contrast is an error and blocks done. • DIRECTOR (optional, director: {score, verdict?, issues?}) — a vision creative-director grade of the rendered screenshot: visual balance, focal flow, image composition/crop, optical spacing, and the "designed vs generated" gestalt a deterministic pass over the PDS can't see. There is NO server-side vision call and NO API key needed here — YOU (the calling agent) already have vision, so YOU grade the screenshot yourself and pass your verdict in. The loop: call plumb_screenshot on the emitted rootId, look at the PNG, grade it as a demanding creative director (any response with no director input echoes the exact grading criteria + output shape at the end of its instruction), then call plumb_review again passing director: { score, verdict, issues }. With the director present, weights reshuffle to structure 0.4 / design 0.3 / director 0.3 and a director error-severity issue blocks done too, so the bar is harder (and more honest) to clear. Returns: score (0–100 blended), done, bar, topFixes (error-first across all active axes, director fixes tagged [director/<dim>]), instruction, dimensions[] (per-rubric-dimension sub-scores), directorScore/directorVerdict when graded, plus the raw structural deltas + coverage. Provide the authored PDS inline via authored, or a path to it via authoredPath (the JSON plumb_apply writes). Point id/name/url at the emitted root (EmitResult.rootId). Canonical loop: plumb_design → repeat[ plumb_screenshot (rootId) → grade it yourself → plumb_review(..., director: {score, issues}) → if !done, apply topFixes and plumb_design(mode:"sync") ] until done or an iteration cap. If done=false, apply topFixes, re-apply the DSL (mode:"sync" keeps plumbKey), and call plumb_review again — the score should climb.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoEmitted root node id (EmitResult.rootId).
idsNoEmitResult.ids — authored el → Figma node id. The join key for the structural diff.
urlNoPaste a full Figma URL — fileKey and node-id are auto-extracted.
nameNoScreen name (plugin path).
briefNoOptional design intent (type scale, fonts, spacing grid) to grade against.
depthNoPDS depth to re-serialize. Default 12.
acceptNoBlended score at which to stop. Default 90.
fileKeyNoFile key (REST path).
authoredNoThe authored PdsDocument (what the DSL compiled to). Inline alternative to authoredPath.
directorNoYOUR OWN vision grade of the rendered screenshot — no server-side model call, no API key. Look at the PNG from plumb_screenshot, grade it yourself as a demanding creative director (see directorGuidance in a no-director response for the exact criteria), and pass { score, verdict?, issues? } here. When present, reweights the blend to structure 0.4 / design 0.3 / director 0.3 and a director error blocks `done`.
iterationNoWhich refine pass this is (1, 2, 3…). Informational — sharpens the coaching.
tolerancesNoOverride default structural thresholds.
authoredPathNoPath to a JSON file holding the authored PdsDocument (written by plumb_apply).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and idempotentHint=true. The description adds context that the tool uses the same verify engine as plumb_verify/plumb_fit, that there is no server-side vision call for the director, and describes the return values. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is overly long (over 600 words) and lacks structured formatting like bullet points. While detailed, it is not concise and could be more organized for quick parsing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (13 parameters, nested objects, no output schema), the description is extremely comprehensive, covering the full workflow, axes, return fields, and iteration logic. It leaves no gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the description adds meaning to each parameter beyond the schema, explaining their roles (e.g., ids as join key, director as vision grade) and interactions (e.g., director presence reshuffles weights).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool self-critiques the emitted Figma design and coaches the refine loop. It distinguishes itself as the 'write-direction mirror of plumb_fit' and specifies three axes (STRUCTURE, DESIGN, DIRECTOR), providing a specific verb and resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and how-to-use guidance, including the canonical loop with plumb_screenshot and plumb_design. It also explains when not to use alternatives and includes prerequisites like passing EmitResult.ids.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_scan_referencesPlumb · scan referencesA
Read-only

Scan N live reference URLs and extract a per-role STYLE DIGEST — concrete nav/hero/footer/card exemplars (box size, layout, colour, type size/family, alignment) from each reference that actually has one, using the same structural pipeline plumb_import_web uses. Streams live progress to Plumb Studio as each reference is scanned. Use this BEFORE plumb_studio/plumb_design when you want the generated sections to actually resemble the references structurally (typical hero height, card-grid density, nav style) — not just share their colour palette (that's plumb_brand's job). Returns data for you to reason about and fold into a plumb_design DSL or a plumb_studio brief; it does not compose or build anything itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
referencesYesReference URLs to scan live, up to 8.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds that it streams live progress to Plumb Studio, uses the same structural pipeline as plumb_import_web, and returns data for reasoning without composing or building. These details go beyond annotations and provide a comprehensive behavioral picture with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph that is information-dense but not overly verbose. Each sentence adds value: purpose, extraction details, streaming, usage guidance, contrast with sibling, and return behavior. Minor improvements could be made by breaking into shorter sentences, but overall it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains that the tool returns data for reasoning and folding into plumb_design DSL or plumb_studio brief, and specifies the type of extracted content (nav/hero/footer/card exemplars). This covers the output sufficiently. However, the exact structure or format of the digest is not detailed, preventing a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter 'references' is fully described in the schema (100% coverage) with min/max items and description. The description does not add additional parameter-level detail beyond restating 'up to 8'. Per guidelines, baseline is 3 when schema coverage is high, and no extra value is added here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool scans N live reference URLs and extracts a per-role STYLE DIGEST of concrete design elements. It distinguishes itself from sibling plumb_brand by clarifying it captures structural features, not just colors, and explicitly says it does not compose or build anything, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states 'Use this BEFORE plumb_studio/plumb_design' when structural resemblance is desired, and contrasts with plumb_brand for color palette extraction. This provides clear when-to-use and when-not-to-use guidance, differentiating the tool from siblings effectively.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_screenshotPlumb · screenshotA
Idempotent

Render 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoNode id to render.
outNoOutput path or filename. Absolute paths are honoured as-is; bare filenames are placed under the screenshots directory. Defaults to '<name>-<id>.<ext>', auto-suffixed on collision.
nameNoScreen name — resolved against the file.
scaleNoRender scale. Default 2.
formatNoOutput format. Default PNG.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it saves a file locally and returns the path. Also mentions the need for the Plumb plugin, which is important behavioral context beyond the annotations (idempotentHint=true). No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences plus one about plugin path. Front-loaded with the main action. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage context, plugin dependency, and basic output. Could mention collision handling or idempotency explicitly, but the schema covers those details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters with descriptions. The tool description adds minimal extra meaning beyond stating it renders a Figma screen or node, which ties to id and name parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action (render), resource (Figma screen or node), and output (PNG/JPG file locally saved, returning file path). Distinguishes itself from sibling tools by being the only screenshot tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly mentions using it as a visual reference for building UI and as a source for plumb_verify, providing context for when to use. No explicit exclusions or alternatives, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_selectionPlumb · selectionA
Read-onlyIdempotent

Extract 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoLevels to disclose. Default 3.
notesNoInclude human-readable notes per node.
maxTokensNoSoft token budget; fit-to-budget reduces depth to fit.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent behavior. The description adds that there is no authentication or rate limiting, and that output matches plumb_node. This provides meaningful context beyond annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: first gives purpose and key advantages, second clarifies output, third gives usage guidance. Efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description references a known output format (compact PDS like plumb_node), which is sufficient given the family of tools. The tool's behavior and invocation context are fully covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents parameters adequately. The description does not add further detail about depth, notes, or maxTokens beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool extracts the user's Figma selection via the Plumb plugin, with notable benefits (no file key, token, rate limit). It distinguishes from plumb_node by specifying the source (selection vs. node) while noting identical output format.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: 'Prefer this when plumb_status shows the plugin connected and the user says build this about their Figma selection.' This tells the agent exactly when to use this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_sourcePlumb · sourceA

Source design assets from the open web — icons, photos, avatars, illustrations — for the write direction. Queries every provider in parallel (keyless-first: Iconify, Lorem Picsum, DiceBear always work; Unsplash / Pexels / Pixabay activate when their API key is in env) and ranks the results with one scoring function, including pick-the-right-icon-pack so a design uses ONE consistent icon family. Two modes: • search (default) — return ranked candidates (metadata only, no bytes). Cheap; use to see what's available and which icon pack was locked. • fetch — resolve the best match, download its bytes to a local folder, and return the path (+ inline SVG / small data: URI). Never fails: a total miss degrades to a deterministic placeholder.

ParametersJSON Schema
NameRequiredDescriptionDefault
hNoDesired height (photos / placeholders).
wNoDesired width (photos / placeholders).
kindNoConstrain to one asset kind.
modeNo`search` (default) returns ranked candidates; `fetch` downloads the best.
seedNoDeterministic seed for avatars / placeholders.
limitNoMax candidates in search mode. Default 16.
queryYesWhat to look for, e.g. 'rocket launch' or 'shopping cart'.
styleNoPreferred style tags (ranking hint).
aspectNoTarget width/height ratio (ranking hint).
inlineNofetch mode: also return the bytes inline (SVG markup / small data: URI).
weightNoIcon weight preference.
paletteNoBrand hex colors — recolors monotone SVG icons.
minWidthNoMinimum acceptable pixel width.
providerNoRestrict to one provider id (iconify, unsplash, pexels, pixabay, dicebear, picsum, …).

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by detailing parallel queries, keyless-first providers, ranking logic, mode behavior, and fallback to placeholder. Annotations are minimal (openWorldHint, no readOnly), so the description adds valuable behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: opening statement, provider details, mode breakdown. Each sentence adds value, and the format is front-loaded with key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (14 parameters, two modes, no output schema), the description covers behavior, modes, providers, and fallback. It lacks explicit output structure for search mode, but is otherwise thorough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already describes all parameters. The description provides some context (e.g., mode semantics) but does not add significant meaning beyond the schema's descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: sourcing design assets (icons, photos, etc.) from the open web. It distinguishes itself from sibling tools by focusing on asset sourcing with ranking and two modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use search (cheap exploration) vs fetch (downloading), and notes provider availability. It does not explicitly mention when to avoid this tool or list alternatives, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_statusPlumb · statusA
Read-onlyIdempotent

Plumb'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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is clear. The description adds context about what the status report contains (data paths, screen count, etc.) and that no Figma access is required, which is valuable beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient with one strong imperative sentence followed by supporting details. The promotional sentence about alternatives adds some length but is contextually relevant. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless status tool, the description fully captures what the agent will get (data paths, screen count, legend, token budget) and provides usage context (call first, no Figma access needed). No output schema is needed given the detailed enumeration.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and schema coverage is 100% (trivial). The description does not need to add parameter info; the baseline of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns status and self-description, and should be called first. It enumerates specific outputs (available data paths, screen count, key legend, token budget), distinguishing it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs 'call this FIRST', notes no Figma access needed, and contrasts with alternatives (official MCP, Framelink) with specific conditions where Plumb is preferable (plan-gated, token cap, 429 errors).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_studioPlumb · studio (direct + build a full page)A

Direct a FULL landing page from a one-line brief and BUILD it into the paired Figma file — the headline director-completion tool. Given a brief (e.g. "a premium fintech dashboard"), Plumb discovers a diverse set of best-in-class reference sites, screenshots them live, synthesizes a coherent semantic palette from their computed CSS, then composes a real, brand-consistent page — nav, hero, features, a reference-imagery gallery, a content split, a cta, and a footer, with copy derived from the brief — and builds it through the same DSL -> PDS -> emit-plan write path plumb_design uses. Returns the picked references, the synthesized brand palette, the created node ids (keyed by authored element handle), and an authoredPath — feed both straight into plumb_review for the director critique loop. Requires the Plumb plugin to be paired.

ParametersJSON Schema
NameRequiredDescriptionDefault
briefYesOne-line description of what's being built, e.g. "a premium fintech dashboard". Drives reference discovery, palette, and copy.
countNoHow many reference sites to study + screenshot (default 4).
pageNameNoFigma page to build the landing page onto (default "Studio").
referencesNoExplicit reference URLs to include first — always studied ahead of the discovered catalogue.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false, meaning it's a write operation; the description confirms it builds into the Figma file. It details the entire process (reference discovery, screenshotting, palette synthesis, page composition, build path) but does not add much beyond what annotations already imply. However, the level of detail is sufficient for understanding the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but each sentence provides valuable information about the tool's process, output, and usage. It is structured well, front-loading the main action, and avoids redundancy. Slight verbosity is acceptable given the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but the description clearly lists the returned items: picked references, palette, node ids, and authoredPath. It also tells the agent to feed these into plumb_review. This makes the tool's input/output contract complete and actionable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with descriptions. The description adds further context for each parameter: brief drives discovery/palette/copy; count has default 4; pageName default 'Studio'; references are prioritized. This enriches the schema information and helps the agent use the tool correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states that the tool directs a full landing page from a one-line brief and builds it into Figma. It distinguishes itself from sibling tools like plumb_design by mentioning the same write path, and from other plumb_studio_* tools by being the 'headline director-completion tool'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that the tool is used when given a brief to produce a full page, and it directs the output to be fed into plumb_review for the critique loop. It does not explicitly state when not to use it or list alternatives, but the context of the brief and the detailed process implies its specific use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_studio_kitPlumb · studio kit (build the component library)A

STEP 2 of the transparent studio flow. Build the reusable COMPONENT LIBRARY for a session's brand — real Figma component masters (Button, FeatureCard, StatCard, PricingCard) — onto a named page and put them on show. The masters inherit the session palette + type scale. Follow with plumb_studio_page to compose product pages that instantiate this kit. Requires a sessionId from plumb_studio_start and the Plumb plugin paired.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNameNoFigma page for the component library (default "Components").
sessionIdYesSession id from plumb_studio_start.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false (mutation), and the description confirms building and placing components. It adds behavioral context: the masters inherit the session palette and type scale. However, it does not disclose whether the operation is idempotent, what happens on overwrite, or error cases. The added value is acceptable but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no filler. The critical label 'STEP 2' is front-loaded, and every sentence adds value: purpose, behavior, linkage to next step, and prerequisites.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two parameters and no output schema, the description covers purpose, key behavioral traits (inheritance), and flow context. It lacks explicit mention of return values or error handling, but given the simplicity, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with only two parameters. The description reinforces the meaning of sessionId (from plumb_studio_start) and implies pageName (onto a named page). It adds marginal context beyond the schema descriptions, meeting the baseline for a well-documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (build) and resource (component library), listing concrete component types (Button, FeatureCard, etc.). It clearly distinguishes itself as STEP 2 in a flow and names the succeeding tool plumb_studio_page, making its role unambiguous relative to siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states it is STEP 2 of the studio flow, requires a sessionId from plumb_studio_start, and advises following with plumb_studio_page. It also mentions the Plumb plugin prerequisite. While it does not give explicit when-not-to-use or alternatives, the sequential guidance is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_studio_pagePlumb · studio page (compose a product page)A

STEP 3 of the transparent studio flow (repeatable). Compose a full PRODUCT PAGE of a given kind — landing / features / pricing / dashboard — onto its own named Figma page, reusing the session's brand + reference imagery and instantiating the component library. Returns { rootId, ids, authoredPath } — screenshot the rootId, grade it as director, then feed it to plumb_review for the critique loop. Call once per page to build a whole product page by page. Requires a sessionId from plumb_studio_start and the Plumb plugin paired.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhich page to compose (default landing).
pageNameYesFigma page to build onto, e.g. "Landing".
sessionIdYesSession id from plumb_studio_start.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds context beyond annotations: it instantiates component library and reuses brand imagery, implying mutation and non-idempotency (matching annotations). It also explains the output structure and follow-up actions. However, it could be more explicit about potential side effects like overwriting existing pages.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is fairly concise with no wasted sentences; each sentence serves a purpose (step number, action, output, instructions, requirements). Slightly wordy but well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains the return value and what to do with it. It covers prerequisites, the flow ordering, and a high-level overview of the tool's action. Complete for this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions, so description adds only marginal value by contextualizing the 'kind' parameter as a list and mentioning sessionId's source. Baseline score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool composes a product page (specific verb+resource) and positions it as STEP 3 in a repeatable studio flow, distinguishing it from sibling tools like plumb_studio_start and plumb_review.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (after plumb_studio_start, before plumb_review) and that it should be called once per page. Provides clear context on the overall flow, though it doesn't explicitly describe when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_studio_startPlumb · studio start (references + brand + open session)A

STEP 1 of the transparent studio flow. Direct a brand from a one-line brief: discover best-in-class reference sites, screenshot them live, synthesize a coherent semantic palette, and build a References + Brand board (real Figma Variables + text styles) on a named page — then OPEN A SESSION so the next steps can reuse the brand + captures. Returns { sessionId, name, brand, references }. Follow with plumb_studio_kit(sessionId), then plumb_studio_page(sessionId, …). Requires the Plumb plugin to be paired.

ParametersJSON Schema
NameRequiredDescriptionDefault
briefYesOne-line description, e.g. "a premium fintech dashboard".
countNoHow many reference sites to study (default 4).
pageNameNoFigma page for the brand board (default "Brand").
referencesNoExplicit reference URLs to study first.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool mutates state (builds a board, opens a session) and specifies the outputs (sessionId, name, brand, references). This adds context beyond the annotations (readOnlyHint=false) by detailing what is created. It does not mention destructive behavior or idempotency, but the creation-oriented nature is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: a bold 'STEP 1' header, a concise three-sentence body that covers the function, flow position, outputs, and prerequisite. Every sentence adds value, and the most critical information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple sub-actions), the description comprehensively covers the workflow, outputs, and flow integration. No output schema is provided, but the description lists return values. It also mentions the required plugin and gives follow-up steps, making it complete for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter is already documented. The description provides minimal additional meaning beyond the schema: it clarifies 'one-line brief' and default for count, but does not add substantial new constraints or format details. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose as 'STEP 1 of the transparent studio flow' and details the actions: discover references, screenshot, synthesize palette, build board, open session. It distinguishes itself from sibling tools by specifying it's the first step and naming the subsequent tools (plumb_studio_kit, plumb_studio_page).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly outlines the usage context: it's the initial step in a flow, with clear follow-up instructions ('Follow with plumb_studio_kit(sessionId), then plumb_studio_page(sessionId, …)'). It also mentions a prerequisite ('Requires the Plumb plugin to be paired'). However, it does not provide explicit when-not-to-use scenarios or alternatives beyond the flow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_tokensPlumb · tokensA
Read-onlyIdempotent

Extract 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoNode id whose design tokens to extract, e.g. "131:9592".
urlNoPaste a full Figma URL — fileKey and node-id are auto-extracted.
nameNoScreen name — plugin path; resolved against the paired file.
fileKeyNoFigma file key — REST path. Omit when the Plumb plugin is paired.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, indicating a safe, idempotent read operation. The description adds behavioral details: the token table is deduplicated, uses $-prefixed refs, and has two access modes (plugin vs REST). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: purpose, plugin path, REST path. It is front-loaded with the core definition and uses precise terminology. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity (4 params, no required, no output schema), the description explains the tool's purpose, the two usage modes, and how parameters differ across modes. It omits details about error handling or return format beyond '$-prefixed refs', but that is acceptable without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 4 parameters with descriptions (100% coverage), so baseline is 3. The description adds significant value by explaining the conditional usage patterns: plugin mode uses id or name (no fileKey), REST mode uses fileKey and id. It also mentions that url can be pasted for auto-extraction, but this is in the schema. Overall, the description clarifies how parameters relate to each other.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the action ('Extract'), the resource ('the deduplicated design-token table for a Figma node'), and the output format ('as the $-prefixed refs'). It also distinguishes from siblings by focusing explicitly on design tokens, unlike plumb_assets or plumb_describe.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use the plugin path (pass id or name, no fileKey) vs the REST path (pass fileKey + id). It also advises to build with these tokens, not magic numbers. It does not explicitly list alternatives among the many siblings, but the use case is clearly scoped.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plumb_verifyPlumb · verifyA
Read-onlyIdempotent

Compare 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="" you rendered, plus img:true when it is a real / (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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoScreen id.
urlNoPaste a full Figma URL — fileKey and node-id are auto-extracted.
nameNoScreen name (plugin path).
depthNoPDS depth to fetch. Default 12 — deep enough for most screens.
fileKeyNoFile key (REST path).
renderedYesEach element you tagged data-plumb-id="<el>".
viewportNoBrowser viewport size (informational).
tolerancesNoOverride default thresholds.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and idempotentHint=true, and the description adds rich behavioral context: deterministic, no pixel diff, error on missing assets, content-aware on placeholder text. This substantially extends beyond the annotations by explaining exact return structure and coverage metrics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose and contains multiple paragraphs with extensive detail. While the information is valuable, it could be more concise. The main purpose is front-loaded, but subsequent sections could be streamlined for easier scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 8 parameters, nested objects, and no output schema, the description is quite comprehensive. It covers input format, delta kinds, coverage, and error conditions. However, it lacks a concrete example of the output, which would enhance completeness given the absence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds value by explaining the 'rendered' parameter in detail (how to tag elements, what properties to include) and the 'tolerances' parameter (thresholds). It also clarifies the 'asset' field and 'img' boolean, which are not fully explained in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's purpose: 'Compare what you built against the Figma design and return structured deltas'. It uses a specific verb ('compare') and resource ('Figma design'), clearly distinguishing it from sibling tools like plumb_diff (which likely compares two designs) and plumb_audit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool: after rendering, to verify against Figma. It details prerequisites (data-plumb-id tagging) and behavioral nuances (content-aware on text, QA-strict on appearance). It does not explicitly list alternative tools or state when not to use, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 28 tool updatesv0.13.2
    • First observedplumb_assets
    • First observedplumb_audit
    • First observedplumb_brand
    • First observedplumb_components
    • First observedplumb_describe
    • First observedplumb_design
    • First observedplumb_diff
    • First observedplumb_emit_react
    • First observedplumb_fig_node
    • First observedplumb_fig_outline
    • First observedplumb_fit
    • First observedplumb_import_web
    • First observedplumb_node
    • First observedplumb_outline
    • First observedplumb_query
    • First observedplumb_review
    • First observedplumb_scan_references
    • First observedplumb_screenshot
    • First observedplumb_search
    • First observedplumb_selection
    • First observedplumb_source
    • First observedplumb_status
    • First observedplumb_studio
    • First observedplumb_studio_kit
    • First observedplumb_studio_page
    • First observedplumb_studio_start
    • First observedplumb_tokens
    • First observedplumb_verify

TDQS

A4.5/5.0
Disambiguation5/5

Each tool has a distinct, well-defined purpose. Even closely related tools like plumb_verify and plumb_fit are clearly differentiated (one-time check vs. iterative loop). The descriptions are precise, leaving no ambiguity about when to use each tool.

Naming Consistency5/5

All tools follow the consistent 'plumb_' prefix with a descriptive noun or compound noun (e.g., plumb_outline, plumb_fig_node, plumb_studio_start). No mixing of conventions, making it easy to predict tool names.

Tool Count5/5

28 tools is appropriate for the broad scope of Figma design workflow automation. Each tool covers a specific operation without overlap, and the count reflects the complexity of the domain without being excessive.

Completeness5/5

The tools cover the full design lifecycle: extraction, search, export, diff, audit, code generation, and even design creation back into Figma. There are no obvious gaps; the set supports both read and write directions comprehensively.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects Figma designs to AI agents, enabling extraction of production-ready code, assets, and design tokens through natural language descriptions. Supports React, Vue, CSS, and Tailwind with real-time design system analysis.
    81,586
    40
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI-powered design operations in Figma, including UI creation, design review, token sync, linting, auditing, and auto-fix through natural language commands.
    3
    -
  • A
    license
    A
    quality
    C
    maintenance
    Converts Figma designs into structured code context with token-aware styling, enabling AI agents to generate production-level frontend code.
    1
    14
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tathagat22/plumb-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server