figma-lens
Provides tools for token-efficient, read-only Figma inspection, enabling extraction of design specs, screenshots, and visual evidence from protected node links for coding agents.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@figma-lensextract design specs from https://www.figma.com/design/Abc/MyApp?node-id=1-2"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
figma-lens
Token-efficient, headless, read-only Figma inspection for coding agents over a terminal CLI or native MCP tools. It accepts protected node links, fetches only bounded subtrees, returns compact navigation/spec data plus visual evidence, and caches artifacts so follow-up work is usually offline.
See docs/research.md for the current ecosystem review and the constraints behind this design.
Quick start
Requirements: Node.js 20+ and a Figma personal access token with
file_content:read access to the target online file. Figma Desktop is not
required.
npm install --global figma-lens
figma-lens auth login
figma-lens extract "https://www.figma.com/design/FILE_KEY/File?node-id=1-2" \
--intent "initial create-segment screen"The command prints a small JSON manifest. The useful artifacts are written to
.figma-lens/: screenshot-<node-id>@2x.png, spec.json, summary.md, and raw.json.
Run the same command again to use the local cache without another Figma API
call. Pass --refresh only when current remote state is required.
Related MCP server: Figma MCP
Commands
figma-lens auth <login|status|logout|path>
figma-lens mcp [--http] [--host 127.0.0.1] [--port 3333]
figma-lens extract <url-or-key> --intent <implementation-target>
figma-lens detail <focused-url> [--intent "child group, child group"] [--render 4] [--scale 2]
figma-lens inspect <url-or-key> [--node 1:2] [--assets] [--refresh]
figma-lens scout <wrapper-url> ["<implementation intent>" | --intent <text>] [--render 2]
figma-lens focus <wrapper-url> --select <candidate-node-id> [--depth 6]
figma-lens focus-set <wrapper-url> --select <id-1,id-2,...> [--depth 6]
figma-lens spec <url-or-key> [--node 1:2]
figma-lens tree <url-or-key> [--node 1:2] [--max-depth 6]
figma-lens search <url-or-key> <query> [--node 1:2] [--limit 20]
figma-lens evidence-check <url-or-key> --text "copy|copy"
figma-lens copy-check <visible-evidence.json> <jsx-or-tsx-files...> [--evidence <detail-evidence>] [--allow "copy|copy"]
figma-lens screenshot <url-or-key> [--node 1:2] [--scale 2]
figma-lens export <url-or-key> --node <ids> --format <svg|png>
figma-lens assets <url-or-key> [--node 1:2]
figma-lens doctorinspect bounds node traversal to depth 6 by default and uses at most one
file/node request plus one batched render request on a cold cache. assets adds
one image-fills request, then downloads referenced
files from their temporary URLs. Downloads use bounded concurrency (four by
default), while atomic writes and cross-process locks prevent concurrent agents
from stampeding the same cache entry. All commands are read-only.
Extract one implementation target
extract is the design-to-code entry point for a known single target. It first
reads the linked node at depth 2. A direct frame/component link is focused as-is;
a large wrapper is resolved from the natural-language intent. Only a
high-confidence match is deeply fetched and rendered:
figma-lens extract "$FIGMA_URL" --intent "initial Create Segment screen"A successful cold extraction normally uses four Figma API requests: shallow
discovery, one depth-6 request for the selected node, one selected-node render,
and one batched distinctive-asset render. It returns one
focused screenshot plus summary.md and spec.json, without rendering or
deeply caching the wrapper. If intent confidence is low, resolution.required
is true and the manifest supplies a bounded scout command rather than guessing.
If the node is recognized as one component shown across several states,
resolution.required instead supplies a representative focus-set; use the
catalog scout route below when the prompt or URL is already known to be a
board, wrapper, flow, collection, or multi-state component.
Discover the right screen inside a wrapper
When a node contains several screens, component states, and prototype annotations, begin with a bounded depth-2 catalog and a 0.25x overview image:
figma-lens scout "$FIGMA_WRAPPER_URL"View overview.screenshot first. The stdout manifest includes the wrapper's
size, short context labels, and up to twenty direct design states in visual
reading order. Catalog mode omits the noisier ranked-candidate payload.
Connector arrows, flow shapes, and documentation chrome are classified but not
promoted as implementation targets. Full ranking details remain in the local
artifacts.details file and do not enter agent context automatically.
Context labels and candidates include percentage positions relative to the
overview. If an intent matches a board annotation such as HOVER, YES, or
NO, nearby screens/components are ranked by spatial proximity. This lets the
agent use vision to understand a flow, then use stable node IDs to render the
source and resulting states without parsing the entire layer tree.
For a design-summary or user-flow question, the overview image plus ordered states is normally the stopping point. Only if a target or transition remains ambiguous, rank and batch-render the two strongest matches from the cached shallow data:
figma-lens scout "$FIGMA_WRAPPER_URL" \
--intent "implement the screen where a recruiter creates a segment with smart filters" \
--render 2The output's next field supplies exact, shell-safe follow-up commands and a
bounded stopping rule. Intent can also remain the positional second argument
for backward compatibility.
scout ranks descendant sections, frames, components, component sets,
instances, and groups using layer names, paths, visible descendant text,
component properties, dimensions, and hierarchy. Matching is
accent-insensitive, typo-tolerant, and includes common English/Vietnamese UI
aliases. The best candidates are rendered together in one batched image call.
Ancestor/descendant duplicates are collapsed before output.
The output explains each match and provides screenshot paths. After viewing those images, focus the winning candidate:
figma-lens focus "$FIGMA_WRAPPER_URL" --select 12:34focus validates the selection against the shallow wrapper cache, then fetches
only that node to depth 6 by default. The candidate image is reused when
scout already rendered it. A cold focus therefore normally needs one node
request plus one batched distinctive-asset render; it needs one additional
selected-node render when no candidate image is cached. Increase --depth only
when a specific nested detail is missing; --render 0 suppresses candidate
images.
For one UI shown across several states, focus-set accepts two to six IDs and
batches them into one node request plus one render request. It emits ordered
screenshots and a combined summary so an agent can implement a single stateful
component without one API call or one large text response per state.
Catalog scout classifies repeated state boards and prints a representative
next.focusSet covering base, loading, populated, and error/empty outcomes.
When a 1440px presentation frame wraps a 1200px modal, the command selects the
inner implementation node. Generic extract --intent modal fails closed for
this board shape instead of silently choosing one state.
Focused bundles also emit visible-evidence.json (and one small evidence file
per state for focus-set). This is the state-fidelity source of truth: it keeps
only descendants whose full ancestor chain is visible and non-transparent.
Hidden component variants are excluded from search, detail ranking, contracts,
asset discovery, image-fill download, and implementation summaries. Agents can
therefore lock one screenshot/evidence pair as the baseline instead of merging
dormant layer copy into a fabricated screen.
evidence-check compares copy read from the screenshot against the bounded
visible evidence without another request when cached:
figma-lens evidence-check "$FOCUSED_NODE_URL" --offline \
--text "Smart template|Import spreadsheet (xlsx, xls)"An incomplete result is a stop signal to isolate that visible child with
detail; it is not permission to mine the full state or invent replacement UI.
Before handoff, copy-check audits user-facing strings in JSX/TSX without a
network request and exits non-zero for copy or sample data absent from the
selected visible evidence (use combined focus-set evidence for a state machine).
Screenshot-only strings may be attested explicitly,
but must come from a viewed source-size detail:
figma-lens copy-check ./visible-evidence-STATE.json src/Modal.tsx \
--evidence ./details/visible-evidence-DETAIL.json \
--allow "Exact screenshot-only label|Exact screenshot-only placeholder"Focused state screenshots are navigation maps. The detail command ranks
meaningful child containers inside one focused node and batch-renders them in
isolation at 2x by default. Its compact manifest includes each child's source
dimensions, position, layout/fill/stroke/radius/effect data, visible
descendants, and contract.json. This prevents large modal/board previews from
hiding pixel details:
figma-lens detail "$FOCUSED_NODE_URL" \
--intent "candidate card, query bar, city filter" --render 3Comma-separated intents are resolved independently, so a generic designer name
such as Frame 1618871847 can still be selected from geometry and nearby
structure. All detail images are rendered in one Figma API request and cached.
focus, focus-set, and extract also discover distinctive logos,
illustrations, and icons and batch-export stable nodes to SVG automatically.
Pass --no-export-assets only when those exports are intentionally unnecessary.
export is a render-only alias suited to copying selected vector/icon nodes as
SVG (or raster effects as PNG). Multiple node IDs are batched in one request;
the command never fetches the surrounding document tree. It returns successful
paths plus missing IDs when one optional node cannot render, instead of
discarding the rest of the batch.
Component properties retain their selected values, variant options, and the
count of preferred swap values. Large preferredValues catalogs are omitted
from spec.json; they are irrelevant to reproducing the selected state and can
otherwise dominate extraction size.
If vision reveals copy or a nested control that is absent from the default depth-6 spec, deepen only the focused node and search that cache:
figma-lens focus "$FIGMA_WRAPPER_URL" --select 12:34 --depth 12 --no-screenshot
figma-lens search FILE_KEY "tooltip copy" --node 12:34 --depth 12 --offlineOffline search and tree commands automatically reuse the deepest matching
cached depth when --depth is omitted.
Configuration
Variable | Purpose |
| Personal access token sent as |
| Supported alias for |
| Optional path to an env file containing the token |
| Cache root; defaults to |
| Override OS config/credential directory |
| Separate inbound bearer secret required for non-loopback MCP HTTP |
| Comma-separated browser origins allowed on non-loopback MCP HTTP |
| Test/development override |
| Transient/network retries; defaults to |
| Largest 429 wait retried automatically; defaults to |
| Per-request timeout; defaults to |
| Content-length safety limit; defaults to 128 MiB |
Never commit .env or .figma-lens/; both are ignored.
The CLI never auto-loads a project .env. Select one explicitly with
FIGMA_LENS_ENV_FILE, use the OS credential store created by auth login, or
provide a one-shot token with --token-stdin / --token-file.
Installation and credentials
The unscoped npm package supplies both CLI and MCP modes:
npm install --global figma-lens
npx figma-lens@latest --help
curl -fsSL https://raw.githubusercontent.com/khanglvm/figma-lens/main/install.sh | shFor automation, invoke npm install --global figma-lens@latest with Node's
child_process.execFile rather than a shell. No install-time login or desktop
popup is required.
Create a PAT in Figma Settings → Security → Personal access tokens with
file_content:read and current_user:read, then run figma-lens auth login.
The interactive token input is hidden and the validated token is saved with
private filesystem permissions. See the skill authentication guide
for OS paths, CI alternatives, precedence, and limitations.
Figma Lens can read only designs saved/imported online and already shared with
the token owner. It cannot read an unsaved local .fig, bypass permissions or
rate limits, edit designs, or reproduce uncommitted Figma Desktop state.
MCP
figma-lens mcp serves local stdio. figma-lens mcp --http serves a stateless
Streamable HTTP endpoint. Both expose six compact workflow tools and share the
same credential/cache. See docs/mcp.md for host configuration,
tool contracts, compatibility, and remote security.
Agent skill
The repository includes an on-demand skill at skills/figma-lens/SKILL.md.
Install the all-in-one skill with a skill manager, or symlink it during local
development:
npx skills add khanglvm/figma-lens --skill figma-lens
ln -s "$(pwd)/skills/figma-lens" "$HOME/.codex/skills/figma-lens"
# or: "$HOME/.claude/skills/figma-lens"Inspect the destination first and do not replace an existing skill blindly.
The skill uses native figma_lens_* MCP tools when the host exposes them and
falls back once to the matching CLI command otherwise; users do not choose a
different skill variant.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityCmaintenanceCaches Figma file data locally and provides an MCP server for AI agents to search and retrieve design nodes efficiently, minimizing API calls.MIT
- Flicense-qualityDmaintenanceMCP server for the Figma API. Lets AI agents fetch designs, nodes, and rendered images from Figma.2,114
- Flicense-qualityCmaintenanceRead-only MCP server that wraps the Figma REST API, providing tools like get file metadata, list frames, and export node image URLs for AI SDLC agents.
- FlicenseBqualityCmaintenanceLocal MCP server connecting AI clients to the Figma desktop app for inspecting and editing Figma documents via the Plugin API.161
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/khanglvm/figma-lens'
If you have feedback or need assistance with the MCP directory API, please join our Discord server