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
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
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
claude mcp add rudraptpsingh-figbridge -- npx -y figbridge-mcp
{
"mcpServers": {
"rudraptpsingh-figbridge": {
"command": "npx",
"args": [
"-y",
"figbridge-mcp"
]
}
}
} {
"servers": {
"rudraptpsingh-figbridge": {
"command": "npx",
"args": [
"-y",
"figbridge-mcp"
]
}
}
} codex mcp add rudraptpsingh-figbridge -- npx -y figbridge-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"rudraptpsingh-figbridge": {
"type": "local",
"command": [
"npx",
"-y",
"figbridge-mcp"
],
"enabled": true
}
}
} openclaw mcp add rudraptpsingh-figbridge --command npx --arg -y --arg figbridge-mcp
mcp_servers:
rudraptpsingh-figbridge:
command: "npx"
args: ["-y", "figbridge-mcp"] {
"McpServers": {
"rudraptpsingh-figbridge": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"figbridge-mcp"
]
}
}
} assistant mcp add rudraptpsingh-figbridge -t stdio -c npx -a -y figbridge-mcp
{
"mcpServers": {
"rudraptpsingh-figbridge": {
"command": "npx",
"args": [
"-y",
"figbridge-mcp"
]
}
}
} 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
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 →
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 →
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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | – | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | – |
| width | number | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| baselineUrl | string | yes | Known-good URL, e.g. production or previous local build. |
| candidateUrl | string | yes | Candidate URL, e.g. localhost branch build. |
| maxMissingText | number | – | Allowed number of disappeared visible text strings per viewport. Default 0. |
| maxNewResponsiveIssues | number | – | Allowed number of new responsive issues. Default 0. |
| minScore | number | – | Minimum acceptable visual similarity score per viewport. Default 96. |
| settleMs | number | – | Delay after load before measurement. Default 1200ms. |
| widths | array | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | – |
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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Name to give the clone. |
| sourceNodeId | string | yes | Figma node id of the frame to clone. |
| textReplacements | object | – | Map 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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | – | – | Exact frame name(s) on the current page. |
| nodeId | string | – | Single node id, e.g. '6:2'. |
| nodeIds | array | – | Multiple 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.
| Name | Type | Req | Description |
|---|---|---|---|
| outDir | string | – | Directory to write the demarcation PNG into. Default /tmp. |
| prefix | string | – | Filename prefix. Default 'demarcate'. |
| rootSelector | string | – | CSS selector to scope to a subtree. Default body. |
| url | string | yes | Page URL — http(s) or file://. |
| width | number | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | Figma 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.
| Name | Type | Req | Description |
|---|---|---|---|
| imageA | string | yes | Absolute path to the first/reference PNG. |
| imageB | string | yes | Absolute path to the second/candidate PNG. |
| outDir | string | – | Directory to write the artifacts into. Default /tmp. |
| prefix | string | – | Filename 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.
| Name | Type | Req | Description |
|---|---|---|---|
| sinceMs | number | yes | Return 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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| appUrl | string | yes | URL of the page being aligned (the 'b' side). |
| mockupUrl | string | yes | URL of the reference / ground-truth page (the 'a' side). |
| rootSelector | string | – | CSS selector to scope both specs (e.g. 'main'). Default body. |
| width | number | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | Figma node id of the imported frame. |
| url | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | Figma node id, e.g. '6:1121'. |
| outPath | string | – | Absolute path to write PNG. When set, response includes { path } and omits base64. |
| scale | number | – | Export 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.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | – |
| nodeId | string | yes | Figma 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[] }.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | – |
| width | number | – | – |
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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| changes | array | – | changes[] array from diff_to_source. If omitted, pass url + nodeId and we'll compute the diff first. |
| nodeId | string | – | – |
| sourceDir | string | yes | Absolute path to the source repo / folder. |
| url | string | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string | – | Token budget tier. small=hierarchy+tokens only, medium=+components+screenshots, large=everything. Default medium. |
| codePaths | array | – | Optional 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. |
| nodeId | string | – | Specific frame to bundle. Omit to use current selection or page-level frames. |
| screenshots | boolean | – | Include 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.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | Output 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.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | – | – |
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[] }.
| Name | Type | Req | Description |
|---|---|---|---|
| html | string | – | Raw 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… |
| htmlPath | string | – | Path to an HTML file on disk. Read and treated as `html`. Useful for piping a built page directly into Figma. |
| name | string | – | Override the root frame's name. Defaults to spec.name, '<title>', or 'Imported design'. |
| pageId | string | – | Target page id. Omit to use the current page. |
| spec | string | – | Deterministic 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 }] }.
| Name | Type | Req | Description |
|---|---|---|---|
| colorSchemes | array | – | Optional theme captures. Use ['light','dark'] to import both modes. Omit to capture the site default. |
| dryRun | boolean | – | If true, extract every width/theme but do not send anything to Figma. Returns spec metadata + telemetry. |
| hybridSnapshot | boolean | – | If true, inserts a full-page screenshot reference under editable layers for every imported viewport. |
| namePrefix | string | – | Frame name prefix. Each frame becomes `<prefix> <theme> <width>px` when themes are used, otherwise `<prefix> <width>px`. Default uses the page title. |
| pageName | string | – | Target Figma Page name for the imported set. |
| rootSelector | string | – | CSS selector for the page region to import at every viewport/theme. Default 'body'. |
| sourceDir | string | – | Absolute path to the local source directory backing this URL. Used to enrich imported specs with authored tokens/CSS variables. |
| update | boolean | – | If true, update matching frames by name instead of creating duplicates. |
| url | string | yes | – |
| widths | array | – | Viewport 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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| colorScheme | string | – | Force prefers-color-scheme. |
| dryRun | boolean | – | If true, runs the full extraction but skips sending to Figma. Returns spec metadata + telemetry only. |
| hybridSnapshot | boolean | – | If 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. |
| name | string | – | Override the Figma frame's name. Defaults to '<title> WIDTHpx'. |
| pageName | string | – | Target 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… |
| rootSelector | string | – | CSS selector for the page region to import. Default 'body'. Use this to capture one section/component instead of the whole page. |
| sourceDir | string | – | Absolute path to the local source directory backing this URL. |
| update | boolean | – | If true, finds the existing frame by name and replaces its children (no duplicates). Default false. |
| url | string | yes | Page URL — http(s) or file:// — anything Chrome can load. |
| width | number | – | Viewport 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: [...] }] }.
| Name | Type | Req | Description |
|---|---|---|---|
| colorSchemes | array | – | Optional theme captures for every URL. Use ['light','dark'] to capture both modes. |
| dryRun | boolean | – | If true, extract every URL/width/theme but do not send anything to Figma. |
| hybridSnapshot | boolean | – | If true, inserts a full-page screenshot reference under editable layers for every imported frame. |
| namePrefix | string | – | Optional prefix for generated frame names. |
| pageName | string | – | Target Figma Page for all imported frames. If omitted, each URL can use the current page. |
| rootSelector | string | – | CSS selector to import from each URL. Default 'body'. |
| sourceDir | string | – | Absolute source directory to enrich imported specs with tokens/CSS variables. |
| update | boolean | – | If true, update matching frames by name instead of creating duplicates. |
| urls | array | yes | URLs to import. Max 20 per call to keep the plugin responsive. |
| widths | array | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| pageId | string | – | Restrict 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).
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | yes | Asset type to export. |
| limit | number | – | Max 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? }].
| Name | Type | Req | Description |
|---|---|---|---|
| includeVariants | boolean | – | If 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.
| Name | Type | Req | Description |
|---|---|---|---|
| pageId | string | – | Page 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.
| Name | Type | Req | Description |
|---|---|---|---|
| pageId | string | – | Restrict 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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| sourceDir | string | yes | Absolute 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.
| Name | Type | Req | Description |
|---|---|---|---|
| appUrl | string | yes | URL of the running app to bring into alignment, e.g. http://localhost:3000/screen. |
| minScore | number | – | Minimum acceptable per-viewport visual score to count as a match. Default 96. |
| mockupUrl | string | yes | URL of the target HTML mockup (ground truth). file:// or local http both work. |
| outDir | string | – | Directory to write the comparison PNGs into. Default /tmp. |
| prefix | string | – | Filename prefix for the PNGs. Default 'match'. |
| rootSelector | string | – | CSS selector to scope the structured spec diff to a subtree (e.g. 'main'). Default body. |
| settleMs | number | – | Delay after load before capture. Default 1200ms. |
| sourceDir | string | – | Absolute 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… |
| widths | array | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | – |
| scale | number | – | – |
| url | string | yes | – |
| width | number | – | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| rootSelector | string | – | CSS selector to scope to a subtree. Default body. |
| url | string | yes | Page URL — http(s) or file://. |
| width | number | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | – |
| width | number | – | Viewport 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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| script | string | yes | JS body, runs as async. The `document`/`window`/`getComputedStyle` globals are available. Use `return` for the result. |
| url | string | yes | – |
| width | number | – | – |
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 }.
| Name | Type | Req | Description |
|---|---|---|---|
| mapping | object | yes | Old → new hex color map, e.g. { '#ff7a29': '#3ddc97' }. |
| nodeId | string | – | Override scope with a specific node subtree. |
| scope | string | – | – |
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 };`
| Name | Type | Req | Description |
|---|---|---|---|
| script | string | yes | JavaScript 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.
| Name | Type | Req | Description |
|---|---|---|---|
| fullPage | boolean | – | Capture the whole page vs just the viewport. Default true. |
| outPath | string | – | Absolute filesystem path to write the PNG to. When set, response includes { path } and omits base64. |
| url | string | yes | Page URL. |
| width | number | – | Viewport 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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Case-insensitive substring match on node name (used if nodeId is not provided) |
| nodeId | string | – | Exact 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.
| Name | Type | Req | Description |
|---|---|---|---|
| html | string | – | Raw HTML string. |
| name | string | – | Name of the existing top-level frame to update (used when nodeId not provided). |
| nodeId | string | – | Figma node id of the existing frame to update. |
| spec | string | – | Deterministic 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.
| Name | Type | Req | Description |
|---|---|---|---|
| nodeId | string | yes | – |
| url | string | yes | – |
| width | number | – | – |
No output schema declared.
No examples provided.
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.