Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.rudraptpsingh/figbridge

NPM · FIGBRIDGE-MCP · SCANNED SEP 20

Free, local MCP bridge for Figma — HTML, CSS, Tailwind, tokens, agent handoff bundles.

Available components

−1 this week 90 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • A known CVE affects extract-zip, but no fixed version has been published, so there is nothing to upgrade to. View diagnostics → Partial
  • No install/post-install scripts declared.Pass
  • 56 of 176 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to rudraptpsingh/figbridge). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 101 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability77
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 6876 tokens (~134/item across 51 items; 51 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management83
  • Stability observed for 25 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage94
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 83% of tool parameters carry a description.Partial
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_node" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 51 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the io.github.rudraptpsingh/figbridge MCP server?

io.github.rudraptpsingh/figbridge runs locally as an npm package, launched with npx -y figbridge-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · figbridge-mcp

# add to Claude Code
claude mcp add rudraptpsingh-figbridge -- npx -y figbridge-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "rudraptpsingh-figbridge": {
      "command": "npx",
      "args": [
        "-y",
        "figbridge-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "rudraptpsingh-figbridge": {
      "command": "npx",
      "args": [
        "-y",
        "figbridge-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add rudraptpsingh-figbridge -- npx -y figbridge-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "rudraptpsingh-figbridge": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "figbridge-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add rudraptpsingh-figbridge --command npx --arg -y --arg figbridge-mcp
# ~/.hermes/config.yaml
mcp_servers:
  rudraptpsingh-figbridge:
    command: "npx"
    args: ["-y", "figbridge-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "rudraptpsingh-figbridge": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "figbridge-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add rudraptpsingh-figbridge -t stdio -c npx -a -y figbridge-mcp
// mcp.json
{
  "mcpServers": {
    "rudraptpsingh-figbridge": {
      "command": "npx",
      "args": [
        "-y",
        "figbridge-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 19 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 −4
    • Stability: pass → 0.77 functional
  • 17 Sept 26 +1
    • Stability: 0.97 → pass security
  • 16 Sept 26 0
    • Security disclosure: unverified → fail functional
  • 15 Sept 26 +1
    • Security disclosure: fail → unverified functional
  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 10 Sept 26 +1
    • Stability: 0.97 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/figbridge-mcp@0.4.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo rudraptpsingh/figbridge
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/rudraptpsingh/figbridge/.github/workflows/publish.yml@refs/tags/v0.4.0
Rekor log index 1778192314
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:ed204cf68a6fa654752ca28cc651de1d8d272c3624898ab051dfca3cc8f102a00bebf2b8b6c634c0af8a08c9020877723a8f09812fc3601d80c9cbbe6

Background: How many MCP packages publish verified provenance →

Vulnerabilities 2 findings
ID CVE Severity Vector Fix available
GHSA-7pqw-9j4j-h8q3 CVE-2026-19693 high CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H no
GHSA-jmr9-qjv8-65gv CVE-2026-56876 high CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N no

Background: What a vulnerability scan can and cannot prove →

Dependencies 176 packages
Packages resolved 176
Stale 56
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 51 exposed · ~6,876 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
apply_tokens ~72

Bind loose SOLID color fills to matching local color variables (matched by exact hex). Scope is a nodeId or the current selection. Returns { bound, unboundRemaining, availableColorVariables }.

NameTypeReqDescription
nodeIdstringTarget node subtree. Omit to use current selection (falls back to current page).

No output schema declared.

No examples provided.

audit_a11y ~78

Audit accessibility of an imported Figma frame. Returns WCAG contrast pass/fail counts (AA 4.5 normal / 3.0 large), per-failure list with measured ratio and node text, landmark coverage, and image nodes without descriptive names. Pure deterministic measurement — no LLM.

NameTypeReqDescription
nodeIdstringyes

No output schema declared.

No examples provided.

audit_interactions ~71

Discover hover/focus-capable elements on a URL before attempting prototype variant capture. Returns interactive elements plus CSS :hover/:focus selector counts and examples. Use this to decide which components need hover variants.

NameTypeReqDescription
urlstringyes
widthnumberViewport width. Default 1280.

No output schema declared.

No examples provided.

audit_mobile ~115

Render a URL across mobile (375) / tablet (768) / desktop (1280) viewports and report responsive issues: horizontal page scroll, elements overflowing the viewport, touch targets < 44×44 (Fitts), text < 12px (unreadable on phone), and fixed-position traps taller than 50% of viewport. Pure deterministic measurement — no LLM. Run after audit_palette / audit_typography / audit_a11y for the full Pillar 2 review.

NameTypeReqDescription
urlstringyes

No output schema declared.

No examples provided.

audit_palette ~68

Audit color usage in an imported Figma frame. Returns total distinct colors, top-10 by frequency, coverage curve (how many of top-N cover X% of usage), and near-duplicate merge suggestions for consolidation. Pure deterministic measurement — no LLM.

NameTypeReqDescription
nodeIdstringyes

No output schema declared.

No examples provided.

audit_regression ~210

Compare a baseline URL and candidate URL to find frontend/UI regressions. Runs deterministic screenshot pixel diffs across desktop/tablet/mobile, visible-text disappearance checks, responsive issue deltas, and CSS-feature drift. Use before/after a frontend change, in CI, or before syncing updated UI into Figma.

NameTypeReqDescription
baselineUrlstringyesKnown-good URL, e.g. production or previous local build.
candidateUrlstringyesCandidate URL, e.g. localhost branch build.
maxMissingTextnumberAllowed number of disappeared visible text strings per viewport. Default 0.
maxNewResponsiveIssuesnumberAllowed number of new responsive issues. Default 0.
minScorenumberMinimum acceptable visual similarity score per viewport. Default 96.
settleMsnumberDelay after load before measurement. Default 1200ms.
widthsarrayViewport widths to compare. Default [1280, 768, 375].

No output schema declared.

No examples provided.

audit_typography ~84

Audit typography in an imported Figma frame. Returns distinct font sizes / families / styles, the (family, style, size) triplet frequency, and which standard modular scale (1.25 / 1.333 / golden ratio / etc.) the existing sizes best fit. Surfaces a suggested clean scale from the base size.

NameTypeReqDescription
nodeIdstringyes

No output schema declared.

No examples provided.

audit_whitespace ~59

Audit spacing rhythm of an imported Figma frame. Returns padding / gap distributions, percentage divisible by 4 / 8 (grid conformance), and off-grid stragglers that break the spacing system.

NameTypeReqDescription
nodeIdstringyes

No output schema declared.

No examples provided.

bridge_status ~33

Health check for the Figbridge HTTP bridge and the stored payload. Also reports whether a plugin is currently connected (pluginConnected).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

clone_screen ~114

Duplicate a frame (screen) inside Figma, optionally renaming it and applying text replacements to every TEXT child. Places the clone to the right of the source. Returns { nodeId, name, textReplacements }.

NameTypeReqDescription
namestringName to give the clone.
sourceNodeIdstringyesFigma node id of the frame to clone.
textReplacementsobjectMap of find → replace strings applied to every TEXT node in the clone. Requires the fonts used to be available.

No output schema declared.

No examples provided.

delete_node ~86

Delete a Figma node by id, a list of ids, or by exact name. Returns { deleted, errors }. Use this to clean up junk frames between imports.

NameTypeReqDescription
nameExact frame name(s) on the current page.
nodeIdstringSingle node id, e.g. '6:2'.
nodeIdsarrayMultiple node ids.

No output schema declared.

No examples provided.

demarcate ~163

Demarcate a page's components — numerically AND visually. Returns the same mathematical layout metrics as measure_layout, plus writes a PNG with every repeated-component group boxed in its own colour (so the component boundaries and the grid are unmistakable). Use to SEE and MEASURE the structure of a mockup or a rendered app in one call.

NameTypeReqDescription
outDirstringDirectory to write the demarcation PNG into. Default /tmp.
prefixstringFilename prefix. Default 'demarcate'.
rootSelectorstringCSS selector to scope to a subtree. Default body.
urlstringyesPage URL — http(s) or file://.
widthnumberViewport width. Default 1280.

No output schema declared.

No examples provided.

describe_screen ~73

Return a semantic description of a single screen: size, background color, all text content, components used, inferred category, and a one-paragraph natural-language summary. Useful for agents that want to reason about a screen without fetching its full HTML.

NameTypeReqDescription
nodeIdstringyesFigma node id of the screen/frame.

No output schema declared.

No examples provided.

diff_images ~213

Compare two image files (any PNGs — Figma exports, mockup screenshots, rendered pages). Returns a raw-pixel score (0-100), a perceptual SSIM score (0-1, tolerant of anti-aliasing / sub-pixel shifts), hotspot diff regions, and writes three legible artifacts to disk that you Read() to SEE the difference: `overlay` (onion-skin — image B with image A at 50% on top), `montage` (A | B | overlay side-by-side, colour-coded), `boxed` (B with red boxes on the diff regions). The general-purpose visual comparator — use when you have two images and no DOM.

NameTypeReqDescription
imageAstringyesAbsolute path to the first/reference PNG.
imageBstringyesAbsolute path to the second/candidate PNG.
outDirstringDirectory to write the artifacts into. Default /tmp.
prefixstringFilename prefix. Default 'imgdiff'.

No output schema declared.

No examples provided.

diff_since ~70

Return history entries captured after the given timestamp (milliseconds since epoch). Each entry includes a 12-char SHA-1 fingerprint of the payload so you can detect real content changes vs re-selections.

NameTypeReqDescription
sinceMsnumberyesReturn entries with capturedAt > sinceMs. Use 0 for full history.

No output schema declared.

No examples provided.

diff_specs ~212

Fast structured-only diff between two rendered URLs (no screenshots). Extracts a computed-style spec from each and reports a categorized, severity-sorted punch-list of exact field-level differences: copy (text), color (fill/text/stroke), typography (font family/size/weight/…), spacing (layout/gap/padding/align/radius/size), and structure (nodes present on one side only). Use for tight refine loops where you only need the 'what differs' list and not pixels — match_mockup wraps this plus a pixel diff. Returns { ok, summary, deltas }.

NameTypeReqDescription
appUrlstringyesURL of the page being aligned (the 'b' side).
mockupUrlstringyesURL of the reference / ground-truth page (the 'a' side).
rootSelectorstringCSS selector to scope both specs (e.g. 'main'). Default body.
widthnumberViewport width for both. Default 1280.

No output schema declared.

No examples provided.

diff_to_source ~120

Compare an imported Figma frame against the freshly-extracted source URL spec and report per-text-node field-level differences: characters, fontSize, fontFamily, color, plus presence (nodes that exist on one side but not the other). Use after the designer edited a frame to see exactly what diverged from source — the input to generate_patch. Pure deterministic measurement, no LLM.

NameTypeReqDescription
nodeIdstringyesFigma node id of the imported frame.
urlstringyesThe live source URL the Figma frame was imported from.

No output schema declared.

No examples provided.

export_all_pages ~67

Export every page's top-level frames in one call. Returns { pageCount, pages: [{ pageId, pageName, frameCount, html, css, tailwindHtml, tokens, cssVars }] }. Use for whole-file handoff; prefer get_agent_bundle for agent-ready output.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

export_app_spec ~68

Return a complete JSON catalog of the currently open Figma file: every screen, every component (with variants), design tokens, CSS variables, Tailwind config, screens grouped by category, and a per-page flow ordering. Drop this into an agent's context as the authoritative spec for the app.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

export_frame ~115

Export a Figma frame as PNG. With `outPath`: writes to disk, returns path. Without: returns base64. Use to pull a rendered version of an imported frame back out for visual diff.

NameTypeReqDescription
nodeIdstringyesFigma node id, e.g. '6:1121'.
outPathstringAbsolute path to write PNG. When set, response includes { path } and omits base64.
scalenumberExport scale (1 = native). Default 1.

No output schema declared.

No examples provided.

export_node ~64

Trigger the plugin to export a specific node (by id) without requiring the user to click. Returns the same payload shape as get_current_selection.

NameTypeReqDescription
formatstring
nodeIdstringyesFigma node id, e.g. '49:137'

No output schema declared.

No examples provided.

fingerprint_url ~100

Audit a URL's CSS-feature usage in one call — returns counts of flexbox/grid/gradients/shadows/filters/blends/transforms/pseudo-elements/iframes/etc, plus tag mix and color/font palette. Run BEFORE bigger fidelity pushes to know where the actual coverage gaps are. Returns { totalElements, topTags, displays, positions, features, colors[], fonts[] }.

NameTypeReqDescription
urlstringyes
widthnumber

No output schema declared.

No examples provided.

generate_patch ~167

Turn a diff_to_source result into a minimal patch plan against a local source directory. For text-content changes, finds the exact old string in HTML/JSX/TSX/etc and emits a before/after edit. For color / fontSize / fontFamily changes, surfaces a structured note pointing at candidate CSS files (style swaps usually want a token edit, not a literal replacement). No files are written — the caller decides whether to apply. Returns { edits[], notes[], unifiedDiff }.

NameTypeReqDescription
changesarraychanges[] array from diff_to_source. If omitted, pass url + nodeId and we'll compute the diff first.
nodeIdstring
sourceDirstringyesAbsolute path to the source repo / folder.
urlstring

No output schema declared.

No examples provided.

get_agent_bundle ~259

Build an LLM-ready handoff bundle from the currently selected frames (or current page if nothing selected). Returns a list of files: hierarchy.md, components.json, tokens.json, tokens.css, DESIGN.md, AGENTS.md, ISSUES.md, issues.json, snapshot.json, manifest.json, optional CHANGES.md (if prior snapshot exists), optional responsive.md/json, optional flow.mmd, per-variant .tsx + .stories.tsx, optional screenshots (base64 PNG), and tailwind.config.js. Text files are returned verbatim; binary files (screenshots) are base64. Requires the Figbridge plugin open with Live bridge on.

NameTypeReqDescription
budgetstringToken budget tier. small=hierarchy+tokens only, medium=+components+screenshots, large=everything. Default medium.
codePathsarrayOptional list of code file paths (e.g. from `find src/components -name '*.tsx'`) to fuzzy-match against Figma components. Mapping is emitted in components.json + AGENTS.md.
nodeIdstringSpecific frame to bundle. Omit to use current selection or page-level frames.
screenshotsbooleanInclude per-root-frame PNG screenshots. Default false.

No output schema declared.

No examples provided.

get_current_selection ~81

Get the most recent Figma selection pushed from the Figbridge plugin, in the requested format.

NameTypeReqDescription
formatstringOutput format. Default: 'all' (metadata + every format). Use 'html' / 'css' / 'tailwind' / 'tokens' / 'cssVars' / 'tailwindConfig' for a single format.

No output schema declared.

No examples provided.

get_last_export ~30

Alias for get_current_selection. Returns the last pushed Figbridge payload.

NameTypeReqDescription
formatstring

No output schema declared.

No examples provided.

get_tokens ~29

Get only the design-token payload (color + number variables, plus CSS variable file and Tailwind config).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

import_from_code ~381

Create a real Figma frame (auto-layout, text, fills, radii — editable layers, not a flattened image) directly from code. Provide ONE of: `spec` (deterministic JSON tree — preferred), `html` (raw HTML string — best-effort element→frame mapping), or `htmlPath` (read file from disk, then parse as html). Top-level spec shape: { name, width?, height?, fill?, layout: 'VERTICAL'|'HORIZONTAL'|'NONE', padding?, spacing?, children: Node[] } where Node = { type: 'frame'|'text'|'rect', ...style }. The new frame is placed to the right of any existing top-level frame on the current page and selected. Returns { nodeId, name, createdCount, warnings[] }.

NameTypeReqDescription
htmlstringRaw HTML string. Mapped element-by-element: section/div/header/footer/nav/article → frame; h1-h6/p/span/a/button text → text node; img/hr → rect. Inline `style="..."` attributes are parsed for common…
htmlPathstringPath to an HTML file on disk. Read and treated as `html`. Useful for piping a built page directly into Figma.
namestringOverride the root frame's name. Defaults to spec.name, '<title>', or 'Imported design'.
pageIdstringTarget page id. Omit to use the current page.
specstringDeterministic design spec as a JSON string — a tree of { type: 'frame'|'text'|'rect', ... }. Stringify with JSON.stringify(...). Highest fidelity, no parsing guesswork.

No output schema declared.

No examples provided.

import_responsive_set ~347

Import a URL at multiple viewport widths and optional light/dark color schemes in one call. Creates one Figma frame per width/theme combination, or returns telemetry only with dryRun. This is the multi-viewport capture path for desktop/tablet/mobile and theme sets. Default widths: 1280, 768, 375. Returns { frames: [{ width, colorScheme, nodeId, name, createdCount, telemetry }] }.

NameTypeReqDescription
colorSchemesarrayOptional theme captures. Use ['light','dark'] to import both modes. Omit to capture the site default.
dryRunbooleanIf true, extract every width/theme but do not send anything to Figma. Returns spec metadata + telemetry.
hybridSnapshotbooleanIf true, inserts a full-page screenshot reference under editable layers for every imported viewport.
namePrefixstringFrame name prefix. Each frame becomes `<prefix> <theme> <width>px` when themes are used, otherwise `<prefix> <width>px`. Default uses the page title.
pageNamestringTarget Figma Page name for the imported set.
rootSelectorstringCSS selector for the page region to import at every viewport/theme. Default 'body'.
sourceDirstringAbsolute path to the local source directory backing this URL. Used to enrich imported specs with authored tokens/CSS variables.
updatebooleanIf true, update matching frames by name instead of creating duplicates.
urlstringyes
widthsarrayViewport widths to capture. Default [1280, 768, 375].

No output schema declared.

No examples provided.

import_url ~345

Render a URL in headless Chrome (figbridge-managed), walk the DOM with computed styles, and create the resulting frame tree in Figma. The single highest-fidelity path from web → Figma. Returns { nodeId, name, createdCount, warnings }.

NameTypeReqDescription
colorSchemestringForce prefers-color-scheme.
dryRunbooleanIf true, runs the full extraction but skips sending to Figma. Returns spec metadata + telemetry only.
hybridSnapshotbooleanIf true, inserts a full-page screenshot as a bottom reference layer underneath editable extracted layers. Useful for Framer/Webflow/video-heavy pages where pixel fidelity matters.
namestringOverride the Figma frame's name. Defaults to '<title> WIDTHpx'.
pageNamestringTarget Figma Page name. If a page with this name exists the frame goes there; otherwise figbridge creates a new Figma Page. Use a different pageName per imported URL to keep multi-page imports naviga…
rootSelectorstringCSS selector for the page region to import. Default 'body'. Use this to capture one section/component instead of the whole page.
sourceDirstringAbsolute path to the local source directory backing this URL.
updatebooleanIf true, finds the existing frame by name and replaces its children (no duplicates). Default false.
urlstringyesPage URL — http(s) or file:// — anything Chrome can load.
widthnumberViewport width. Default 1280.

No output schema declared.

No examples provided.

import_url_batch ~296

Bulk-import multiple URLs using the same website-to-Figma pipeline as import_url/import_responsive_set. Each URL can be imported at one or more widths and optional light/dark themes. Use dryRun first for large batches. Returns { results: [{ url, frames: [...] }] }.

NameTypeReqDescription
colorSchemesarrayOptional theme captures for every URL. Use ['light','dark'] to capture both modes.
dryRunbooleanIf true, extract every URL/width/theme but do not send anything to Figma.
hybridSnapshotbooleanIf true, inserts a full-page screenshot reference under editable layers for every imported frame.
namePrefixstringOptional prefix for generated frame names.
pageNamestringTarget Figma Page for all imported frames. If omitted, each URL can use the current page.
rootSelectorstringCSS selector to import from each URL. Default 'body'.
sourceDirstringAbsolute source directory to enrich imported specs with tokens/CSS variables.
updatebooleanIf true, update matching frames by name instead of creating duplicates.
urlsarrayyesURLs to import. Max 20 per call to keep the plugin responsive.
widthsarrayViewport widths for every URL. Default [1280]. Use [1280, 768, 375] for full responsive capture.

No output schema declared.

No examples provided.

lint_ds ~76

Lint the file for design-system violations: unbound colors (SOLID fills not using a variable), non-grid spacing (padding/gap not divisible by 4), orphan components (defined but never instanced), and duplicate names. Returns findings grouped by rule.

NameTypeReqDescription
pageIdstringRestrict to a single page id.

No output schema declared.

No examples provided.

list_assets ~106

Export bulk assets from the file as base64. kind='icon' scans small vector frames + names like ic-* and exports SVG. kind='image' finds IMAGE-fill nodes and exports PNG@2x. kind='illustration' finds large vectors on 'Illustrations' pages and exports SVG. limit caps the number of assets returned (default 40).

NameTypeReqDescription
kindstringyesAsset type to export.
limitnumberMax assets to return. Default 40.

No output schema declared.

No examples provided.

list_components ~73

List local components and component sets (with variants) in the currently open Figma file. Returns [{ nodeId, name, kind: 'COMPONENT' | 'COMPONENT_SET', variantCount?, variants? }].

NameTypeReqDescription
includeVariantsbooleanIf true, include the list of variant components inside each COMPONENT_SET.

No output schema declared.

No examples provided.

list_frames ~66

List the top-level layers on a specific page (or the current page). Returns [{ id, name, type, width, height, hasChildren }]. Use this to walk the file without exporting.

NameTypeReqDescription
pageIdstringPage id. Omit to use the current page.

No output schema declared.

No examples provided.

list_history ~24

List recent Figma selections that have been pushed (metadata only, newest first).

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_pages ~44

List every page in the currently open Figma file: { id, name, frameCount, isCurrent }. Cheap — use this before list_screens / list_frames to orient.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

list_screens ~114

List every top-level frame (screen) across pages in the currently open Figma file. Each result has { nodeId, name, pageName, width, height, category, orderHint }. Category is inferred from name: splash | onboarding | auth | home | detail | settings | overlay | editor | search | state | commerce | error | other. Requires the Figbridge plugin to be open with Live bridge on.

NameTypeReqDescription
pageIdstringRestrict to a single page id. Omit for all pages.

No output schema declared.

No examples provided.

map_components ~135

Index an app's source tree so figbridge understands the codebase it's generating against. Returns the maps that let a mockup-vs-app diff name the file to edit: data-testid / data-component → { file, line }, component-name → file, and :root design tokens (value ↔ var name). Run once to inspect the mapping, or just pass `sourceDir` to match_mockup which builds it internally. Returns { ok, fileCount, byTestid, byComponent, tokens }.

NameTypeReqDescription
sourceDirstringyesAbsolute path to the app source root (e.g. the repo's src/).

No output schema declared.

No examples provided.

match_mockup ~563

Closed visual-diff loop — the grounded feedback signal for making a running app match an HTML mockup. Renders BOTH the mockup and the app, returns (a) per-viewport pixel similarity + hotspot regions and (b) a prioritized, categorized punch-list of exact field-level differences (copy/color/typography/spacing/elevation/icon/structure) with the node path for each. Pass `sourceDir` to make it codebase-aware: each punch-list item then carries the `sourceFile` to edit (resolved via the app's data-testid → source) and a `tokenHint` when a literal value should become a design token. Also returns a perceptual SSIM score per viewport (tolerant of anti-aliasing) and writes three legible diff artifacts per viewport you Read() to SEE the drift: `overlayPng` (onion-skin), `montagePng` (mockup | app | overlay), `boxedPng` (app with red diff boxes). Color deltas are gated on perceptual ΔE so imperceptible shifts don't show as noise. The mockup is the ground truth — no Figma round-trip. WORKFLOW: implement → match_mockup → fix the highest-severity punchList items in their named sourceFile → rebuild → match_mockup again. Repeat until `pass` is true (worst visual score ≥ minScore AND punchList empty). Serve the mockup over file:// or a local static server; point appUrl at the dev build.

NameTypeReqDescription
appUrlstringyesURL of the running app to bring into alignment, e.g. http://localhost:3000/screen.
minScorenumberMinimum acceptable per-viewport visual score to count as a match. Default 96.
mockupUrlstringyesURL of the target HTML mockup (ground truth). file:// or local http both work.
outDirstringDirectory to write the comparison PNGs into. Default /tmp.
prefixstringFilename prefix for the PNGs. Default 'match'.
rootSelectorstringCSS selector to scope the structured spec diff to a subtree (e.g. 'main'). Default body.
settleMsnumberDelay after load before capture. Default 1200ms.
sourceDirstringAbsolute path to the app source root. When set, each punch-list item is resolved to its sourceFile (via the app's data-testid / component name) and color/spacing literals get a design-token hint — so…
widthsarrayViewport widths to compare. Default [1280, 768, 375].

No output schema declared.

No examples provided.

measure_fidelity ~100

Phase 6 — compute pixel-similarity score between the live URL and a Figma frame export. Returns { score (0-100), diffPercent, regions[] }. The diff regions are the top spots where the import diverges from the live page — feed these back into the extractor for targeted fixes.

NameTypeReqDescription
nodeIdstringyes
scalenumber
urlstringyes
widthnumber

No output schema declared.

No examples provided.

measure_layout ~192

Mathematical layout metrics for a URL — numbers an agent can reason over directly (more actionable than a screenshot). Returns the inferred GRID (column/row count, column pitch, gutter, cell size, size-regularity) from the dominant repeated component; ALIGNMENT (count of shared vertical/horizontal edge lines + a snap score); SPACING (detected base unit e.g. 8px, the spacing scale, % off-grid); the repeated-COMPONENT groups with instance counts; and an XY-CUT block segmentation (depth, leaf count, and the largest whitespace seams = the structural splits like sidebar|content|inspector). Deterministic, no model.

NameTypeReqDescription
rootSelectorstringCSS selector to scope to a subtree. Default body.
urlstringyesPage URL — http(s) or file://.
widthnumberViewport width. Default 1280.

No output schema declared.

No examples provided.

preflight_import ~101

Check a URL for common website-to-Figma import risks before spending time on a full import: bot-protection/captcha pages, HTTP errors, missing-font risk, low-resolution images, SVG-heavy pages, deep wrapper nesting/auto-layout noise, horizontal scroll, and very tall pages. Run this before import_url/import_responsive_set/import_url_batch.

NameTypeReqDescription
urlstringyes
widthnumberViewport width. Default 1280.

No output schema declared.

No examples provided.

probe_url ~126

Render a URL in headless Chrome and run an arbitrary JS snippet inside the page. Use to inspect the live DOM / computed styles when planning an extraction. Replaces external chrome-devtools-mcp.evaluate_script. Snippet is the async-function body; use `return` for the result. Returns { ok, result }.

NameTypeReqDescription
scriptstringyesJS body, runs as async. The `document`/`window`/`getComputedStyle` globals are available. Use `return` for the result.
urlstringyes
widthnumber

No output schema declared.

No examples provided.

recolor ~126

Swap SOLID fill/stroke colors across a scope. Scope is 'selection' (default), 'page', 'file', or a specific nodeId. Mapping maps old hex → new hex (case-insensitive, 3- or 6-digit hex, with or without #). Returns { changes, nodesVisited }.

NameTypeReqDescription
mappingobjectyesOld → new hex color map, e.g. { '#ff7a29': '#3ddc97' }.
nodeIdstringOverride scope with a specific node subtree.
scopestring

No output schema declared.

No examples provided.

run_script ~177

Escape hatch: evaluate an arbitrary JavaScript async-body inside the Figma plugin sandbox. The `figma` plugin API is in scope. Use this when no purpose-built tool exists for what you want — e.g. one-off queries, exotic node manipulations, prototyping a future tool. Body must return a JSON-serializable value (or undefined). Returns { ok, result, error? }. Trust model: bridge binds 127.0.0.1 only, same as recolor/clone_screen. Example script: `const sel = figma.currentPage.selection[0]; return { id: sel?.id, type: sel?.type, name: sel?.name };`

NameTypeReqDescription
scriptstringyesJavaScript async function body. The `figma` global is available. Use `return` for the result.

No output schema declared.

No examples provided.

screenshot_url ~133

Render a URL in headless Chrome and capture a PNG. If `outPath` is given, writes the PNG to disk and returns the path (cheap on agent context). Otherwise returns the base64 bytes. Use for visual diffs against Figma exports.

NameTypeReqDescription
fullPagebooleanCapture the whole page vs just the viewport. Default true.
outPathstringAbsolute filesystem path to write the PNG to. When set, response includes { path } and omits base64.
urlstringyesPage URL.
widthnumberViewport width. Default 1280.

No output schema declared.

No examples provided.

select_node ~97

Select a node in Figma and scroll the viewport to it. Provide either a nodeId (e.g. '1:2') or a name substring. Requires the Figbridge plugin to be open with Live bridge enabled.

NameTypeReqDescription
namestringCase-insensitive substring match on node name (used if nodeId is not provided)
nodeIdstringExact Figma node id, e.g. '49:137'

No output schema declared.

No examples provided.

update_from_code ~181

Update an existing Figma frame in place from a new spec or HTML — finds the frame by `nodeId` or by exact `name`, removes its children, and rebuilds them from `spec` / `html`. The root frame id stays stable so anything that references it survives the update. If no match found, falls back to creating a fresh frame. Returns { nodeId, name, replacedCount, warnings[] }. Use this for iterative re-imports instead of `import_from_code` to avoid duplicate frames.

NameTypeReqDescription
htmlstringRaw HTML string.
namestringName of the existing top-level frame to update (used when nodeId not provided).
nodeIdstringFigma node id of the existing frame to update.
specstringDeterministic design spec as a JSON string.

No output schema declared.

No examples provided.

verify_text_fidelity ~81

After importing a URL, verify that every visible text string from the live page also exists in the Figma frame. Returns { liveCount, specCount, missing[], matchedPct }. Use as a fast sanity check that the extractor didn't drop content.

NameTypeReqDescription
nodeIdstringyes
urlstringyes
widthnumber

No output schema declared.

No examples provided.

Common questions

What is the io.github.rudraptpsingh/figbridge MCP server?

io.github.rudraptpsingh/figbridge is an MCP server listed in the public MCP registry as io.github.rudraptpsingh/figbridge. Free, local MCP bridge for Figma, HTML, CSS, Tailwind, tokens, agent handoff bundles. This page covers its npm package (figbridge-mcp).

Is the io.github.rudraptpsingh/figbridge MCP server safe to use?

io.github.rudraptpsingh/figbridge scores 90 out of 100 on VerifyMCP. We recorded 2 known advisories against it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.rudraptpsingh/figbridge MCP server expose?

io.github.rudraptpsingh/figbridge exposes 51 tools: get_current_selection, get_last_export, list_history, get_tokens, bridge_status, and 46 more. Their descriptions and schemas cost roughly 6,876 tokens of context every time the server is loaded.

Is the io.github.rudraptpsingh/figbridge MCP server still maintained?

io.github.rudraptpsingh/figbridge is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.rudraptpsingh/figbridge MCP server under?

io.github.rudraptpsingh/figbridge declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.