figlens
This MCP server exposes figlens tools to inspect, search, bundle, and export frames from a local .fig design file without Figma login or API access.
Read built-in agent guidance for
build,images,plan,planning-details, oryolo; this only returns guidance.Browse node IDs, types, and names under a root with
tree.Search layer names and visible text with
find, optionally filtering by node type.Get compact expanded summaries of bounds, layout, typography, text, images, component states, and variant comparisons with
inspect.Retrieve full REST-shaped node JSON with expanded instances, fills, text, and auto-layout via
nodes.Read frame-bound or all local design variables, collections, modes, and aliases with
variables.Write a design bundle ZIP containing nodes, variables, assets, reference render, context, manifest, and warnings with
bundle.Export nodes to SVG, PNG, JPG, WebP, or AVIF with scaling, quality, size, and file-size controls via
export.Accept local
.figpaths orgs://sources when permitted.Does not implement, verify, or clean up code; it provides design-file read/export capabilities only.
Reads saved local Figma .fig design files to provide coding agents with screen structure, layout, text, variables, assets, and reference renders. Enables browsing pages and layers, inspecting designs, extracting assets, and bundling selected frames for implementation.
The problem. Your agent needs layout values, text and assets to build a screen. On a remote host or in CI, that design context needs to be available alongside the code, without relying on a running desktop app.
The fix. In Figma, File > Save local copy. Drop design.fig next to your code. figlens parses it locally and gives your agent layout, text, styles, variables, icons, images and a reference render of any frame. One native binary, zero network calls to Figma.
Get started
No design file yet? Check your setup with the tiny public example: verify your chosen binary, find one frame and validate its bundle. No model required.
Put design.fig in your project, then pick your agent.
Claude Code (Node.js 18+, macOS/Linux):
claude mcp add --transport stdio --scope local figlens -- npx -y @runkids/figlens mcpStart a new session and check /mcp. Ask for a screen in your own words: MCP includes on-demand guidance for planning, implementation and image preparation; no separate skill install is required.
Pi (1.3.0+): one package ships the CLI, MCP, viewer and skill.
pi install npm:@runkids/figlensAny MCP client (Cursor, Codex, Gemini CLI, ...):
{ "mcpServers": { "figlens": { "command": "npx", "args": ["-y", "@runkids/figlens", "mcp"] } } }No Node.js? Install the standalone binary and use "command": "figlens" instead:
Platform | Command |
macOS / Linux |
|
Homebrew |
|
Windows (PowerShell) |
|
Then ask for a screen:
Build the task board from ./design.fig in this project.
Find the matching frame, use this project's components and image workflow,
then compare the running UI with the design and fix confirmed differences.
Report missing assets and any checks you could not run.The agent finds the frame, builds a bundle with design data, assets and a reference image, and implements the screen with your stack. Ask it to show the changed files and the comparison; a bundle alone does not prove the UI is right.
Related MCP server: FreeMCP for Figma
Demo: Pi builds a React screen from a .fig

Looping GIF at 3× the edited video’s playback speed. Click it for the full 78-second video.
78-second video. Pi runs /figlens plan, reads a dashboard frame from a local .fig, builds it with React and Tailwind CSS, then checks and corrects the running UI. Edited time-lapse, not a benchmark or a pixel-perfect promise. Design: Task Flow by Eymen Eid · recording notes.
Why figlens instead of the official Figma MCP?
Use figlens when the design should travel as a file: remote agents, CI, offline work, handoff between agents, unlimited repeated reads. Use the official Figma MCP when the agent must see the live design without an export step.
figlens | Official Figma MCP | |
Source | Exported | Live Figma files |
Needs | The file | Figma sign-in; desktop server needs the app |
Rate limits | None, local parsing | Figma service limits |
Remote agent / CI | Copy the file, run the binary | Remote server with sign-in |
Design changes | Export a new | Automatic |
Handoff | Share the | Share Figma access |
Fidelity | Independent parser with known gaps | Maintained by Figma |
Reading a .fig is offline. Installing and updating figlens, gs:// inputs, your model provider and your project's dependencies still need a network.
What the agent gets
One frame, one zip. Structure to build from, assets to use, a picture to check against.
frame.zip
├── context.md Start here: instructions for your agent
├── design/
│ ├── nodes.json Layout, text, styles and expanded instances
│ └── variables.json Bound variables, collections, modes and aliases
├── assets/ Image fills, SVGs and composited node renders
├── assets.json Maps design references to asset files
├── references/screen.png A render of the frame to compare against
├── missing-assets.json Anything that could not be produced
└── manifest.json File roles, media types, sizes and SHA-256 hashesNeed one piece? The CLI does it directly:
npx -y @runkids/figlens find design.fig "login" --type FRAME # frame ids by name or text
npx -y @runkids/figlens inspect design.fig 12:345 # compact layout and text summary
npx -y @runkids/figlens nodes design.fig 12:345 > frame.json # REST-shaped JSON
npx -y @runkids/figlens export design.fig 12:345 icon.svg # SVG, PNG, JPG, WebP or AVIF
npx -y @runkids/figlens bundle design.fig 12:345 frame.zip # the zip aboveSVG exports embed original image fills and outline text as glyphs, so no fonts are needed. Through MCP, raster exports also come back as inline images, so the agent sees the design without opening a file.
How close is it to Figma?
Measured against Figma's own JSON, PNG and SVG exports on 826 production frames and five Community files (2026-10-22):
Check | Result |
Node structure, names, visibility, bounds and text | Identical in 771 / 826 frames |
Original image fills | 2,608 / 2,608 byte-identical |
SVG assets | 5,014 / 5,197 within the pixel-difference threshold |
Community frame bundles | 306 / 306 with no missing assets |
Results on those files, not a guarantee for every design. Method and thresholds: accuracy report.
Pi extension
pi install npm:@runkids/figlensRestart Pi or /reload, then ask for a screen in plain words. Pi finds the frame, reads it over the auto-registered MCP server and builds with your stack. No node IDs, no global CLI.
/figlens plan <request>writes a plan only; it does not edit the application./figlens yolo <request>plans, builds, checks and cleans up its own temporary plan./figlens preview [description]opens the local viewer./figlens reviewapproves reusable component mappings the agent proposed.
Full walkthrough, commands and limits: pi/README.md.
Browse a design without Figma

npx -y @runkids/figlens preview design.fig # local viewer, Ctrl+C to stop
npx -y @runkids/figlens preview design.fig 12:345 --out preview.html # offline HTML snapshot to send to anyoneBrowse pages and layers, search, measure, inspect layout, typography, variables and CSS, export any layer, copy an implementation prompt or download a bundle for the selection. Drop in a screenshot of your build to overlay it on the design. Details: preview guide.
MCP server and agent skill
MCP. The server runs locally over stdio and exposes workflow, tree, find, inspect, nodes, variables, bundle and export. The agent can read built-in build, images, plan, planning-details or opt-in yolo guidance through workflow, then use its own project and browser tools to carry out the authorized task. These guides share the portable skill's source; installing that skill separately is optional for MCP users. Client support and model behavior determine how the guidance is used. Pass absolute paths. Add --root /path/to/designs (repeatable) to confine every file and output path to chosen folders. Raster exports are scaled down to maxSize (default 1600 px) so inline images stay small; SVG returns metadata only.
Native Windows with Claude Code: follow its stdio setup notes and the cmd /c wrapper for npx.
Skill. The figlens skill teaches an agent to find frames, read the bundle in small pieces, plan scoped work and verify the running UI against the design. It installs instructions only; the CLI or MCP server must be available. Install with the Skills CLI or copy skills/figlens/ into your agent's skills directory (Claude Code: ~/.claude/skills/):
npm install -g @runkids/figlens
npx skills add runkids/figlens --skill figlensskillshare. Manage the skill and the MCP connection across Claude Code, Codex and Cursor from one place with skillshare:
skillshare install github.com/runkids/figlens/skills/figlens
skillshare mcp add figlens --global --target claude --target codex --target cursor --no-tui -- npx -y @runkids/figlens mcp
skillshare sync && skillshare sync mcp --globalInstall notes. The npm launcher downloads the matching native binary on first use, verifies it against the release's SHA-256 checksums and caches it. Standalone installs update with figlens update. Binaries cover macOS (Apple silicon, Intel), Linux (arm64, x86_64, static musl) and Windows (x86_64).
CLI reference
Command | Output |
| Node ids, types and names; indented text or nested JSON |
| Case-insensitive search over layer names and text; paths, sizes and previews. Default 20 results (1-200) |
| Compact expanded layout/text summary, at most 200 nodes. |
| REST-shaped JSON: expanded instances and overrides, auto-layout, text styles, fills, effects, bound variables, component properties, render bounds |
| A frame's bound variables; without a node, every local variable |
| A design bundle for one frame; prints |
| Many bundles from one decode, in parallel |
| SVG, PNG, JPG, WebP or AVIF; |
| Local read-only viewer; |
| Diff against a REST export of the same frame |
| One raw |
| Local MCP server over stdio |
| Replace the binary with the latest release |
For related component variants, use inspect --states or bundle --states (MCP states: true, default false; no configuration change). Evidence retains source, unknown and truncation markers. Bundles add design/states.json and a context.md summary. See state evidence for scope and limits.
To compare two variants in the same component set, use inspect <file> <variantA> --compare-variant <variantB> (MCP compareVariant). variantComparison reports stored field/value-multiset differences with source IDs and unknowns; descendants remain unpaired. See comparison limits.
A node argument accepts 12:345, 12-345 or a Figma URL with ?node-id=. <file> can also be gs://bucket/object, downloaded with your gcloud login and cached. See the GCS snapshot cookbook for a fixed-object handoff, access requirements and refresh limits. Each CLI call decodes the file; MCP reuses the last unchanged local file, while remote calls parse again. Run figlens --help for usage.
Limitations
Snapshots, not live sync. Export a new
.figwhen the design changes. figlens cannot download a design from a Figma URL.Undocumented format. figlens decodes the file's embedded schema; new Figma exports may need a figlens update.
Not emitted yet: Dev Mode annotations, layout grids.
Partial semantics: recorded constraints, layoutAlign/layoutGrow and component property definitions are emitted with
_figlens.semanticsprovenance. Missing values are not defaulted; variant options and SLOT remain unsupported. These mappings have not been compared with same-version Figma exports. See coverage.Render gaps: background blur and some image adjustments are skipped; angular and diamond gradients draw as radial. Overridden text can keep Figma's last layout. Font files are not included.
Check the output. Read bundle
warnings,missing-assets.jsonand unresolved variables incontext.md, then compare the implementation with the design.Known visible rendering limitations appear in node
_figlens.renderDiagnostics, boundedinspectsummaries and bundlewarnings;missing-assets.jsonlists only asset failures. No warnings does not establish pixel fidelity.
Help figlens grow
If figlens turned a design into code for you, star the repo so others find it. Hit a file it cannot read? Open an issue with the command and what you expected.
Development runs Rust in Docker only: docker compose run --rm dev cargo test. See AGENTS.md and the wiki.
License
MIT. figlens is an independent project, not affiliated with, endorsed by or sponsored by Figma. The .fig format is undocumented and may change; use only files and assets you have permission to access and share.
Available Tools
8 toolsbundleA
Write a design bundle zip for one node or exact instance sublayer: nodes, variables, assets, reference render, context.md. When the user requests related component states, pass states=true to include their explicit variants and evidence gaps; no MCP configuration change is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| out | Yes | output path for the bundle ZIP; create the parent directory first | |
| file | Yes | the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root | |
| name | No | frame name for the manifest | |
| node | Yes | a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id= | |
| states | No | include design/states.json and a bounded context.md summary; retains inspect's source, unknown and truncation markers; default false | |
| fileKey | No | Figma file key for the manifest |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| nodeId | Yes | |
| warnings | Yes | missing assets, known rendering limits and truncated optional state inventory; missing-assets.json contains only asset failures; design/nodes.json has per-node _figlens.renderDiagnostics; design/states.json has inventory coverage when requested |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses bundle contents, states behavior, evidence gaps, and that no MCP configuration change is needed, but it omits key mutation traits: whether an existing ZIP is overwritten, required permissions, and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, front-loaded sentences with no filler. The bundle contents are listed inline, and the states behavior follows immediately, though the final clause about MCP configuration is slightly disconnected.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and parameter coverage is complete, so the description needn't explain return values. It still leaves mutation safety and overwrite behavior unstated, but for a tool whose schema and output contract are rich, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented. The description adds helpful semantics for states=true and the accepted node forms, but the schema already carries most of this information, making 3 the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Write a design bundle zip' — and enumerates bundle contents (nodes, variables, assets, reference render, context.md), so the agent knows exactly what the tool produces. It does not explicitly distinguish this from sibling tools like export, inspect, or variables, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one clear conditional: pass states=true when the user requests related component states. However, it does not say when to use bundle versus siblings such as export, inspect, or nodes, nor when not to use it. Usage is implied rather than fully guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportA
Export a node to SVG, PNG, JPG, WebP or AVIF. Create the output directory first. Returns metadata and, for raster formats, an inline image. PNG suits inline references. For website assets, follow the target project's existing image pipeline; otherwise start with WebP for bitmaps, sized for display dimensions and DPR using scale/maxSize and quality/maxKb. SVG embeds original images and can be large; keep it for vector artwork. scale, quality and maxSize affect raster formats only; maxSize defaults to 1600. Check returned dimensions/bytes and isError; read content on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| out | Yes | output path ending in .png, .jpg, .jpeg, .webp, .avif or .svg; create the parent directory first | |
| file | Yes | the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root | |
| node | Yes | a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id= | |
| maxKb | No | KiB (1024 bytes) budget; lower lossy quality until it fits; PNG/SVG fail if over budget | |
| scale | No | default 1 | |
| maxSize | No | longest side in pixels, default 1600; 0 keeps the scaled size | |
| quality | No | 1-100, default 80 |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| bytes | Yes | |
| width | Yes | |
| height | Yes | |
| quality | Yes | the quality used; --max-kb may lower it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it states the output-directory prerequisite, that raster formats return an inline image, that SVG can embed originals and become large, and that callers should check returned dimensions/bytes and isError. It does not discuss overwrite behavior or permissions, leaving some side-effect detail unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and then moves through prerequisites, format guidance, raster-only caveats, and error checking without filler. Every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given seven parameters and an existing output schema, the description supplies the missing decision context: format choice, raster-only parameters, directory creation, and failure handling. An agent has enough to call the tool correctly without further prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning: 'scale, quality and maxSize affect raster formats only' and ties quality/maxKb to sizing for DPR. That is useful beyond the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Export a node to SVG, PNG, JPG, WebP or AVIF.' It makes the tool's action and output formats unmistakable, and the sibling names do not include a competing export tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear format-selection guidance, including 'PNG suits inline references,' WebP for website bitmaps, and SVG for vector artwork. It does not explicitly compare against sibling tools or state when not to use export, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findA
Search stored layer names and text (case-insensitive). Returns ids, paths, local sizes and text previews. Does not expand instance children; use inspect on the instance.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root | |
| node | No | search this stored subtree; default the document; use inspect for instance sublayers | 0:0 |
| type | No | Figma node type, e.g. FRAME or TEXT | |
| limit | No | 1-200 results, default 20; truncated signals more matches | |
| query | Yes | literal substring in a layer name or text |
Output Schema
| Name | Required | Description |
|---|---|---|
| root | Yes | |
| results | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does most of it: it declares case-insensitive matching, the scope of the search (stored layers only, no instance expansion), what is returned, and that truncation signals more matches. It does not explicitly state read-only semantics or cost, but the search framing makes the read nature clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is searched and what comes back, then the scope limit and the escape hatch. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the brief return-value listing is a bonus rather than a requirement. For a five-parameter search tool the description covers matching semantics and scope well; only the relationship to the tree and nodes siblings is left for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new semantics: matching is case-insensitive, a fact the schema's 'literal substring' wording does not convey. It also explains the stored-subtree scope that governs the node parameter, which the schema only hints at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it searches stored layer names and text, case-insensitively, returning ids, paths, sizes and previews. It separates itself from the inspect sibling for instance children, though it leaves the boundary with tree and nodes implicit despite the bare name 'find'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit exclusion and names the alternative: 'Does not expand instance children; use inspect on the instance', reinforced by the node parameter note. There is no guidance on when to reach for this versus tree or nodes, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspectA
Compact expanded node summary: bounds, layout, typography, text previews and child counts. For image decisions, images=true adds original dimensions/bytes and source-pixel rectangles before masks, not blur diagnoses. Depth and a 200-node budget bound the summary; image paints have their own 200-item limit. nodes returns full design data.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root | |
| node | Yes | a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id= | |
| depth | No | 0-10 levels below the node, default 1; text previews up to 200 characters | |
| images | No | include source bitmap dimensions/bytes and per-paint source-pixel crop rectangles; no files written | |
| states | No | include bounded variants and prototype field evidence with exact sources/unknowns; retains instance overrides, infers no business conditions and renders no other variants | |
| compareVariant | No | compare node with this other stored variant in the same component set; adds bounded raw-field and descendant-multiset differences, exact sources and unknown pairing; no alternate rendering or business inference |
Output Schema
| Name | Required | Description |
|---|---|---|
| node | Yes | Compact node with partial layout semantics and type-only property definitions; _figlens.semantics records source/verification. Definitions, definition evidence and _figlens.renderDiagnostics each have at most 20 entries per node; truncated includes omitted nodes or entries |
| images | No | optional source image evidence when images=true |
| states | No | optional variants and prototype field evidence when states=true; independent truncation, source file, node/override provenance and unknown markers; no inferred business logic |
| truncated | Yes | |
| variantComparison | No | optional same-set definition comparison when compareVariant is supplied; raw fields, descendant value multisets, unpaired nodes, unknowns and independent truncation; not a pixel comparison |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses depth bounding, a 200-node budget, a separate 200-item image-paint limit, and that image mode writes no files. It also sets negative expectations — "not blur diagnoses", "infers no business conditions", "renders no other variants" — which is exactly the kind of scope containment an agent needs on an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no filler, and the output shape is front-loaded before the caveats and the sibling reference. It is occasionally terse to the point of opacity — "before masks, not blur diagnoses" reads as an inside reference — but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description instead covers budgets, scope containment, and side-effect absence, which is the right allocation for an unannotated six-parameter tool. The remaining gap is that the two variant-related parameters are never addressed in prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The prose adds genuine meaning for `images` (source bitmap dimensions/bytes and per-paint crop rectangles, explicitly excluding blur diagnoses) and for `depth` via the 200-node budget, but it says nothing about `compareVariant` or `states`, leaving the schema to carry those alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Compact expanded node summary: bounds, layout, typography, text previews and child counts" names the resource and enumerates its contents, and the closing clause "nodes returns full design data" distinguishes it from the closest sibling. The verb is nominal rather than active, so the operation is inferred rather than stated, but the returned shape is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Selection guidance is implied rather than stated: "nodes returns full design data" hints this is the lightweight alternative, and "For image decisions, images=true adds..." gives conditional guidance for one flag. There is no explicit when-to-use/when-not statement, no prerequisites (e.g., that it needs a saved .fig), and two of six parameters (states, compareVariant) get no usage framing at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nodesC
A node or exact instance sublayer as Figma REST nodes.json: instances expanded, fills, text, auto-layout. Can be large.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root | |
| node | Yes | a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id= |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses that instances are expanded, that fills/text/auto-layout are included, and that output can be large, but it does not state read-only behavior, permissions, or error characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the resource plus key output details, with no filler. The sentence-fragment style slightly weakens clarity but keeps it efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the return shape and a useful size warning, and the input schema covers both parameters well. However, it omits sibling selection guidance and does not clarify read-only/safety behavior, leaving meaningful context gaps for an agent choosing between node-related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents the file and node parameters. The description adds no parameter-level detail beyond what the schema provides; 'exact instance sublayer' is already covered by the node parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource and output as 'A node or exact instance sublayer as Figma REST nodes.json' and lists included content, but it uses a noun phrase with no action verb. It also does not distinguish this tool from siblings such as inspect, tree, or find.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, and no exclusions or prerequisites are stated. The only usage-adjacent note is 'Can be large,' which is not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
treeA
List node ids, types and names under a chosen root. A shallow outline locates pages and frames when their names are unknown; find searches known names or visible text directly.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root | |
| json | No | nested {id,type,name,children} JSON instead of indented text (about 1.6x larger) | |
| node | No | a stored root id; default the whole document; use inspect for instance sublayers | 0:0 |
| depth | No | levels to list below the root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It implies a read-only listing operation and describes the returned fields (ids, types, names), but it does not explicitly state side-effect safety, permissions, or rate limits. The schema covers the output-mode parameter details, so this is adequate rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted wording. The core purpose is front-loaded, and the comparison to 'find' is placed immediately after as useful routing context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only outline tool with a fully described schema, the description is nearly complete: it states what is returned and when to use it versus find. The main missing piece is explicit differentiation from the sibling 'nodes,' but no critical calling information is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter meanings are already fully documented in the input schema. The description adds only the high-level notion of listing 'under a chosen root' and a 'shallow outline,' which aligns with the root and depth parameters but does not add syntax or usage detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List node ids, types and names under a chosen root.' It also distinguishes the tool from the sibling 'find' by explaining that tree is for locating pages/frames when names are unknown, while find searches known names or visible text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case ('when their names are unknown') and explicitly names the alternative tool ('find searches known names or visible text directly'). It does not cover when to prefer or avoid the other siblings such as inspect or nodes, but the main routing decision is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
variablesB
The variables a frame binds (collections, modes, aliases); without a node, every local variable.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root | |
| node | No | the node, including full instance sublayer IDs; omit for every local variable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the scope behavior when node is omitted, but it does not explicitly confirm that the operation is read-only, nor does it describe permissions, error conditions, or return shape beyond naming the variable categories.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single compact sentence that front-loads the resource and appends the key scoping rule. It is efficient and avoids repetition, though the sentence fragment form is slightly less immediately scannable than a full verb-led statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two well-documented parameters and no output schema, the description covers the core scoping behavior needed to call the tool. However, for a query tool with no annotations, it could do more to confirm read-only safety and describe what the returned variable data contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the input schema. The description reinforces the node-omission behavior with 'every local variable,' but adds no syntax or format details beyond what the schema provides, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource precisely: variables bound by a frame, including collections, modes, and aliases, and clarifies the default scope when no node is given. It is not phrased as a verb, but an agent can still tell this tool apart from siblings like tree, find, or inspect because it names a distinct data type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without a node, every local variable' gives a clear condition for the optional node parameter, but the description does not explain when to use this tool instead of siblings such as inspect or nodes. Usage is implied by the resource name rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflowARead-only
Read built-in figlens skill guidance for this agent: build for design-to-code and project reuse, images for website asset preparation, plan for scoped implementation planning, planning-details for page/multi-page work or unresolved design dependencies, yolo for explicitly requested autonomous implementation and temporary-plan cleanup. Returns the requested guide only; no design file, project read/write, implementation, verification or cleanup is performed. Ordinary design questions and exports can use the design tools directly.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Guide to read: build, images, plan, planning-details or yolo. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds non-obvious value by pre-empting the misleading topic names: 'no design file, project read/write, implementation, verification or cleanup is performed' clarifies that 'build' and 'yolo' do not trigger actions. Only the return format (e.g. markdown/text) is left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action ('Read built-in figlens skill guidance'), followed by topic routing, then a scope disclaimer. The topic list is dense but every clause maps to an enum value or a behavioral constraint, so there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only lookup with no output schema, the description covers intent, per-value selection, side-effect scope, and result nature ('Returns the requested guide only'). Only the concrete return format is unspecified, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum already lists the five topics, so baseline is 3. The description adds real semantic meaning to each enum value by describing the situation each guide is intended for, which the schema's one-line 'Guide to read' does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Read built-in figlens skill guidance for this agent', then enumerates the five guides available. The purpose is unmistakable despite the generic tool name 'workflow', and it clearly is not a design-file or export operation like its siblings tree/find/inspect/bundle/export.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives per-topic routing ('build for design-to-code and project reuse', 'planning-details for page/multi-page work or unresolved design dependencies', 'yolo for explicitly requested autonomous implementation'), and explicitly says ordinary design questions and exports should use the design tools directly. That covers when to use this tool and when not to.
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.
8 tool updates
v0.7.2- Changed
bundle8 fields changed- added
Input schema / additionalPropertiesAdded value: +true - changed
Input schema / properties / file / descriptionPrevious value: -"the .fig file (File > Save local copy): an absolute path, or gs://bucket/object"New value: +"the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root" - added
Input schema / properties / file / minLengthAdded value: +1 - changed
Input schema / properties / node / descriptionPrevious value: -"a node id (12:345 or 12-345) or a Figma URL with ?node-id="New value: +"a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id=" - changed
Input schema / properties / out / descriptionPrevious value: -"absolute path of the .zip to write"New value: +"output path for the bundle ZIP; create the parent directory first" - added
Input schema / properties / out / minLengthAdded value: +1 - added
Input schema / properties / statesAdded value: +{ + "default": false, + "description": "include design/states.json and a bounded context.md summary; retains inspect's source, unknown and truncation markers; default false", + "type": "boolean" +} - changed
Output schema / properties / warnings / descriptionPrevious value: -"assets the bundle could not include; missing-assets.json has details"New value: +"missing assets, known rendering limits and truncated optional state inventory; missing-assets.json contains only asset failures; design/nodes.json has per-node _figlens.renderDiagnostics; design/states.json has inventory coverage when requested"
- Changed
export17 fields changed- added
Input schema / additionalPropertiesAdded value: +true - changed
Input schema / properties / file / descriptionPrevious value: -"the .fig file (File > Save local copy): an absolute path, or gs://bucket/object"New value: +"the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root" - added
Input schema / properties / file / minLengthAdded value: +1 - changed
Input schema / properties / maxKb / descriptionPrevious value: -"lower lossy quality until the file fits; PNG/SVG fail if over budget"New value: +"KiB (1024 bytes) budget; lower lossy quality until it fits; PNG/SVG fail if over budget" - added
Input schema / properties / maxKb / maximumAdded value: +18014398509481984 - added
Input schema / properties / maxKb / minimumAdded value: +0 - added
Input schema / properties / maxSize / defaultAdded value: +1600 - added
Input schema / properties / maxSize / maximumAdded value: +4294967295 - added
Input schema / properties / maxSize / minimumAdded value: +0 - changed
Input schema / properties / node / descriptionPrevious value: -"a node id (12:345 or 12-345) or a Figma URL with ?node-id="New value: +"a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id=" - changed
Input schema / properties / out / descriptionPrevious value: -"absolute path ending in .png, .jpg, .webp, .avif or .svg"New value: +"output path ending in .png, .jpg, .jpeg, .webp, .avif or .svg; create the parent directory first" - added
Input schema / properties / out / minLengthAdded value: +1 - added
Input schema / properties / quality / defaultAdded value: +80 - added
Input schema / properties / quality / maximumAdded value: +100 - added
Input schema / properties / quality / minimumAdded value: +1 - added
Input schema / properties / scale / defaultAdded value: +1 - added
Input schema / properties / scale / exclusiveMinimumAdded value: +0
- Changed
find10 fields changed- added
Input schema / additionalPropertiesAdded value: +true - changed
Input schema / properties / file / descriptionPrevious value: -"the .fig file (File > Save local copy): an absolute path, or gs://bucket/object"New value: +"the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root" - added
Input schema / properties / file / minLengthAdded value: +1 - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / limit / maximumAdded value: +200 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / node / defaultAdded value: +"0:0" - changed
Input schema / properties / node / descriptionPrevious value: -"search this subtree; default the document"New value: +"search this stored subtree; default the document; use inspect for instance sublayers" - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / query / patternAdded value: +"\\S"
- Changed
inspect13 fields changed- added
Input schema / additionalPropertiesAdded value: +true - added
Input schema / properties / compareVariantAdded value: +{ + "description": "compare node with this other stored variant in the same component set; adds bounded raw-field and descendant-multiset differences, exact sources and unknown pairing; no alternate rendering or business inference", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / depth / defaultAdded value: +1 - added
Input schema / properties / depth / maximumAdded value: +10 - added
Input schema / properties / depth / minimumAdded value: +0 - changed
Input schema / properties / file / descriptionPrevious value: -"the .fig file (File > Save local copy): an absolute path, or gs://bucket/object"New value: +"the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root" - added
Input schema / properties / file / minLengthAdded value: +1 - added
Input schema / properties / images / defaultAdded value: +false - changed
Input schema / properties / node / descriptionPrevious value: -"a node id (12:345 or 12-345) or a Figma URL with ?node-id="New value: +"a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id=" - added
Input schema / properties / statesAdded value: +{ + "default": false, + "description": "include bounded variants and prototype field evidence with exact sources/unknowns; retains instance overrides, infers no business conditions and renders no other variants", + "type": "boolean" +} - added
Output schema / properties / node / descriptionAdded value: +"Compact node with partial layout semantics and type-only property definitions; _figlens.semantics records source/verification. Definitions, definition evidence and _figlens.renderDiagnostics each have at most 20 entries per node; truncated includes omitted nodes or entries" - added
Output schema / properties / statesAdded value: +{ + "description": "optional variants and prototype field evidence when states=true; independent truncation, source file, node/override provenance and unknown markers; no inferred business logic", + "type": "object" +} - added
Output schema / properties / variantComparisonAdded value: +{ + "description": "optional same-set definition comparison when compareVariant is supplied; raw fields, descendant value multisets, unpaired nodes, unknowns and independent truncation; not a pixel comparison", + "type": "object" +}
- Changed
nodes4 fields changed- added
Input schema / additionalPropertiesAdded value: +true - changed
Input schema / properties / file / descriptionPrevious value: -"the .fig file (File > Save local copy): an absolute path, or gs://bucket/object"New value: +"the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root" - added
Input schema / properties / file / minLengthAdded value: +1 - changed
Input schema / properties / node / descriptionPrevious value: -"a node id (12:345 or 12-345) or a Figma URL with ?node-id="New value: +"a stored node id (12:345 or 12-345), full instance sublayer id (I12:345;67:89) from inspect/nodes, or a Figma URL with ?node-id="
- Changed
tree8 fields changed- added
Input schema / additionalPropertiesAdded value: +true - added
Input schema / properties / depth / maximumAdded value: +18446744073709552000 - added
Input schema / properties / depth / minimumAdded value: +0 - changed
Input schema / properties / file / descriptionPrevious value: -"the .fig file (File > Save local copy): an absolute path, or gs://bucket/object"New value: +"the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root" - added
Input schema / properties / file / minLengthAdded value: +1 - added
Input schema / properties / json / defaultAdded value: +false - added
Input schema / properties / node / defaultAdded value: +"0:0" - changed
Input schema / properties / node / descriptionPrevious value: -"the root; default the whole document"New value: +"a stored root id; default the whole document; use inspect for instance sublayers"
- Changed
variables4 fields changed- added
Input schema / additionalPropertiesAdded value: +true - changed
Input schema / properties / file / descriptionPrevious value: -"the .fig file (File > Save local copy): an absolute path, or gs://bucket/object"New value: +"the saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root" - added
Input schema / properties / file / minLengthAdded value: +1 - changed
Input schema / properties / node / descriptionPrevious value: -"the frame; omit for every local variable"New value: +"the node, including full instance sublayer IDs; omit for every local variable"
- Added
workflow
2 tool updates
v0.5.0- Changed
export1 field changed- added
Input schema / properties / maxSizeAdded value: +{ + "description": "longest side in pixels, default 1600; 0 keeps the scaled size", + "type": "integer" +}
- Changed
inspect2 fields changed- added
Input schema / properties / imagesAdded value: +{ + "description": "include source bitmap dimensions/bytes and per-paint source-pixel crop rectangles; no files written", + "type": "boolean" +} - added
Output schema / properties / imagesAdded value: +{ + "description": "optional source image evidence when images=true", + "type": "object" +}
7 tool updates
- First observed
bundle - First observed
export - First observed
find - First observed
inspect - First observed
nodes - First observed
tree - First observed
variables
TDQS
Scored across 8 tools
The tools mostly have distinct roles: tree/find for discovery, inspect/nodes for detail levels, variables for bindings, bundle/export for outputs, and workflow for guidance. There is some potential overlap between tree and find, and between inspect and nodes, but the descriptions explicitly route agents based on known names, depth, and data size.
All tool names are single lowercase tokens with no casing or separator inconsistencies. The set mixes nouns and verbs (tree, nodes, variables vs. find, inspect, export, bundle), so it does not follow a strict verb_noun pattern, but it is still highly readable and consistent in style.
Eight tools is well-scoped for a Figma inspection, variable extraction, export, and design-bundle workflow. Each tool has a clear lane, and there is no obvious redundancy or missing count pressure.
The surface covers discovery, detailed node extraction, variables, export formats, bundle creation, and workflow guidance, which is strong lifecycle coverage for a read-only design-to-code server. Minor gaps may exist around richer project/file metadata or style-token extraction separate from nodes/variables, but agents can work around them.
Maintenance
Related MCP Connectors
Serves your design system and coding standards to coding agents, so they stop guessing.
Measured design systems decoded from 588 real products, for coding agents.
UI design from prompts, screenshots, and URLs for AI coding agents and theme tokens.
A design agent in your coding agent's loop: briefs each screen, reviews UX and visual quality.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables offline reading and rendering of Figma .fig files, allowing AI agents to extract design specs, export assets, and generate code without needing the Figma API or network access.261MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to read and write a user's Figma file through the Figma Plugin API, offline and privately, without API tokens or rate limits.236 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to extract, inspect, search, and bundle design context from local Figma .fig files entirely offline, exposing frame summaries, node context, style tokens, assets, vector SVGs, and visual-match review via MCP.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to read and inspect local Figma .fig files entirely offline, exposing document structure, geometry, styles, text, components, variables, and embedded images via MCP tools.12275 npm3MIT