Skip to main content
Glama

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 mcp

Start 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/figlens

Any 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

curl -fsSL https://raw.githubusercontent.com/runkids/figlens/main/scripts/install.sh | sh

Homebrew

brew install runkids/tap/figlens

Windows (PowerShell)

irm https://raw.githubusercontent.com/runkids/figlens/main/scripts/install.ps1 | iex

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

Pi plans from a local .fig, builds a React screen and checks it beside a live browser

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 .fig snapshot

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

Automatic

Handoff

Share the .fig or a frame bundle

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 hashes

Need 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 above

SVG 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/figlens

Restart 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 review approves reusable component mappings the agent proposed.

Ask Pi for a screen, let it find the design, build with your stack, and check the result

Full walkthrough, commands and limits: pi/README.md.

Browse a design without Figma

Inspect the MCP Apps design locally, with its layer tree, layout and component properties

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 anyone

Browse 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 figlens

skillshare. 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 --global

Install 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

tree <file> [node] [--depth N] [--json]

Node ids, types and names; indented text or nested JSON

find <file> <query> [--type TYPE] [--node ID] [--limit N]

Case-insensitive search over layer names and text; paths, sizes and previews. Default 20 results (1-200)

inspect <file> <node> [--depth N] [--images] [--states] [--compare-variant ID]

Compact expanded layout/text summary, at most 200 nodes. --images adds bitmap dimensions and crop footprints

nodes <file> <node>

REST-shaped JSON: expanded instances and overrides, auto-layout, text styles, fills, effects, bound variables, component properties, render bounds

variables <file> [node]

A frame's bound variables; without a node, every local variable

bundle <file> <node> <out.zip> [--states]

A design bundle for one frame; prints {nodeId, path, warnings}

bundle <file> --frames <list> --out-dir <dir> [--jobs N] [--states]

Many bundles from one decode, in parallel

export <file> <node> <out> [--scale N] [--quality 1-100] [--max-kb N] [--max-size N]

SVG, PNG, JPG, WebP or AVIF; --max-kb lowers lossy quality until it fits

preview <file> [node] [--out preview.html] [--port N] [--bind IP]

Local read-only viewer; --out writes a standalone offline snapshot

compare <file> <nodes.json> <node>

Diff against a REST export of the same frame

node <file> <node>

One raw .fig node

mcp

Local MCP server over stdio

update

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 .fig when 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.semantics provenance. 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.json and unresolved variables in context.md, then compare the implementation with the design.

  • Known visible rendering limitations appear in node _figlens.renderDiagnostics, bounded inspect summaries and bundle warnings; missing-assets.json lists 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 tools
bundleA

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.

NameRequiredDescriptionDefault
outYesoutput path for the bundle ZIP; create the parent directory first
fileYesthe saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root
nameNoframe name for the manifest
nodeYesa 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=
statesNoinclude design/states.json and a bounded context.md summary; retains inspect's source, unknown and truncation markers; default false
fileKeyNoFigma file key for the manifest

Output Schema

NameRequiredDescription
pathYes
nodeIdYes
warningsYesmissing 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
outYesoutput path ending in .png, .jpg, .jpeg, .webp, .avif or .svg; create the parent directory first
fileYesthe saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root
nodeYesa 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=
maxKbNoKiB (1024 bytes) budget; lower lossy quality until it fits; PNG/SVG fail if over budget
scaleNodefault 1
maxSizeNolongest side in pixels, default 1600; 0 keeps the scaled size
qualityNo1-100, default 80

Output Schema

NameRequiredDescription
pathYes
bytesYes
widthYes
heightYes
qualityYesthe quality used; --max-kb may lower it

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
fileYesthe saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root
nodeNosearch this stored subtree; default the document; use inspect for instance sublayers0:0
typeNoFigma node type, e.g. FRAME or TEXT
limitNo1-200 results, default 20; truncated signals more matches
queryYesliteral substring in a layer name or text

Output Schema

NameRequiredDescription
rootYes
resultsYes
truncatedYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
fileYesthe saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root
nodeYesa 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=
depthNo0-10 levels below the node, default 1; text previews up to 200 characters
imagesNoinclude source bitmap dimensions/bytes and per-paint source-pixel crop rectangles; no files written
statesNoinclude bounded variants and prototype field evidence with exact sources/unknowns; retains instance overrides, infers no business conditions and renders no other variants
compareVariantNocompare 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

NameRequiredDescription
nodeYesCompact 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
imagesNooptional source image evidence when images=true
statesNooptional variants and prototype field evidence when states=true; independent truncation, source file, node/override provenance and unknown markers; no inferred business logic
truncatedYes
variantComparisonNooptional same-set definition comparison when compareVariant is supplied; raw fields, descendant value multisets, unpaired nodes, unknowns and independent truncation; not a pixel comparison

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
fileYesthe saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root
nodeYesa 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

C2.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
fileYesthe saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root
jsonNonested {id,type,name,children} JSON instead of indented text (about 1.6x larger)
nodeNoa stored root id; default the whole document; use inspect for instance sublayers0:0
depthNolevels to list below the root

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
fileYesthe saved .fig: a local path (absolute recommended), or gs://bucket/object using gcloud; remote sources are unavailable with --root
nodeNothe node, including full instance sublayer IDs; omit for every local variable

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

workflowA
Read-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.

NameRequiredDescriptionDefault
topicYesGuide to read: build, images, plan, planning-details or yolo.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 8 tool updatesv0.7.2
    • Changedbundle8 fields changed
      • addedInput schema / additionalProperties
        Added value: +true
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / file / minLength
        Added value: +1
      • changedInput schema / properties / node / description
        Previous 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="
      • changedInput schema / properties / out / description
        Previous value: -"absolute path of the .zip to write"New value: +"output path for the bundle ZIP; create the parent directory first"
      • addedInput schema / properties / out / minLength
        Added value: +1
      • addedInput schema / properties / states
        Added 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"
        +}
      • changedOutput schema / properties / warnings / description
        Previous 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"
    • Changedexport17 fields changed
      • addedInput schema / additionalProperties
        Added value: +true
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / file / minLength
        Added value: +1
      • changedInput schema / properties / maxKb / description
        Previous 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"
      • addedInput schema / properties / maxKb / maximum
        Added value: +18014398509481984
      • addedInput schema / properties / maxKb / minimum
        Added value: +0
      • addedInput schema / properties / maxSize / default
        Added value: +1600
      • addedInput schema / properties / maxSize / maximum
        Added value: +4294967295
      • addedInput schema / properties / maxSize / minimum
        Added value: +0
      • changedInput schema / properties / node / description
        Previous 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="
      • changedInput schema / properties / out / description
        Previous 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"
      • addedInput schema / properties / out / minLength
        Added value: +1
      • addedInput schema / properties / quality / default
        Added value: +80
      • addedInput schema / properties / quality / maximum
        Added value: +100
      • addedInput schema / properties / quality / minimum
        Added value: +1
      • addedInput schema / properties / scale / default
        Added value: +1
      • addedInput schema / properties / scale / exclusiveMinimum
        Added value: +0
    • Changedfind10 fields changed
      • addedInput schema / additionalProperties
        Added value: +true
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / file / minLength
        Added value: +1
      • addedInput schema / properties / limit / default
        Added value: +20
      • addedInput schema / properties / limit / maximum
        Added value: +200
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / node / default
        Added value: +"0:0"
      • changedInput schema / properties / node / description
        Previous value: -"search this subtree; default the document"New value: +"search this stored subtree; default the document; use inspect for instance sublayers"
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +"\\S"
    • Changedinspect13 fields changed
      • addedInput schema / additionalProperties
        Added value: +true
      • addedInput schema / properties / compareVariant
        Added 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"
        +}
      • addedInput schema / properties / depth / default
        Added value: +1
      • addedInput schema / properties / depth / maximum
        Added value: +10
      • addedInput schema / properties / depth / minimum
        Added value: +0
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / file / minLength
        Added value: +1
      • addedInput schema / properties / images / default
        Added value: +false
      • changedInput schema / properties / node / description
        Previous 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="
      • addedInput schema / properties / states
        Added 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"
        +}
      • addedOutput schema / properties / node / description
        Added 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"
      • addedOutput schema / properties / states
        Added 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"
        +}
      • addedOutput schema / properties / variantComparison
        Added 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"
        +}
    • Changednodes4 fields changed
      • addedInput schema / additionalProperties
        Added value: +true
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / file / minLength
        Added value: +1
      • changedInput schema / properties / node / description
        Previous 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="
    • Changedtree8 fields changed
      • addedInput schema / additionalProperties
        Added value: +true
      • addedInput schema / properties / depth / maximum
        Added value: +18446744073709552000
      • addedInput schema / properties / depth / minimum
        Added value: +0
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / file / minLength
        Added value: +1
      • addedInput schema / properties / json / default
        Added value: +false
      • addedInput schema / properties / node / default
        Added value: +"0:0"
      • changedInput schema / properties / node / description
        Previous value: -"the root; default the whole document"New value: +"a stored root id; default the whole document; use inspect for instance sublayers"
    • Changedvariables4 fields changed
      • addedInput schema / additionalProperties
        Added value: +true
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / file / minLength
        Added value: +1
      • changedInput schema / properties / node / description
        Previous value: -"the frame; omit for every local variable"New value: +"the node, including full instance sublayer IDs; omit for every local variable"
    • Addedworkflow
  2. 2 tool updatesv0.5.0
    • Changedexport1 field changed
      • addedInput schema / properties / maxSize
        Added value: +{
        +  "description": "longest side in pixels, default 1600; 0 keeps the scaled size",
        +  "type": "integer"
        +}
    • Changedinspect2 fields changed
      • addedInput schema / properties / images
        Added value: +{
        +  "description": "include source bitmap dimensions/bytes and per-paint source-pixel crop rectangles; no files written",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / images
        Added value: +{
        +  "description": "optional source image evidence when images=true",
        +  "type": "object"
        +}
  3. 7 tool updates
    • First observedbundle
    • First observedexport
    • First observedfind
    • First observedinspect
    • First observednodes
    • First observedtree
    • First observedvariables

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables 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.
    26
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    12
    275 npm
    3
    MIT