Skip to main content
Glama
LeoGCode

figma-reader-mcp

by LeoGCode

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FIGMA_ACCOUNTNoAccount: which Figma login and snapshot cache to use. Default: from .figma-reader.json, else 'default'.
FIGMA_CDP_URLNoAttach to a running browser instead of launching. Default: unset.
FIGMA_HEADLESSNoSet to '0' to keep the work browser visible. Default: '1'.
FIGMA_FILES_DIRSNoColon-separated dirs scanned (2 levels) for .fig files. Default: filesDirs from .figma-reader.json, else ~/Downloads.
FIGMA_BROWSER_PATHNoBrowser executable. Default: Brave > Chromium > Chrome > Playwright.
FIGMA_READER_CACHENoRoot of the snapshot cache. Default: ~/.cache/figma-reader.
FIGMA_USER_DATA_DIRNoBrowser profile holding the Figma login. Default: ~/.local/share/figma-reader/accounts/<account>/profile-<browser>.
FIGMA_SNAPSHOT_MAX_AGE_MINNoRe-export after this age (minutes). Default: '30'.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
figma_statusA

Account, browser and login state. Does not launch anything: local .fig paths never need the browser.

figma_loginA

Ensure this project's account is logged into figma.com. If not, opens a normal (not remote-controlled) browser window on the login page; after the user logs in the window closes by itself and work continues headless. wait_seconds blocks until then.

figma_list_filesA

List Figma files. source=local (default): .fig files under FIGMA_FILES_DIRS, which the result names in searchedDirs. source=web: recently viewed files of the account logged in the browser. With query, totalUnfiltered says how many files there were before it.

figma_load_fileA

Export (Save local copy) and decode a Figma file, returning a summary: pages, node counts, variable collections, styles, components. Snapshots are cached; other tools reuse them. Export of large files can take a minute. The result is dated by the copy it answers from. exportedAt is the ISO-8601 time this tool exported that snapshot through the browser: report what the design said then rather than as current, and pass refresh to export it again. For a local .fig the field is fileModifiedAt, that copy's own file time, which copying, syncing or re-downloading the file resets: the design data can be older than it says, and nothing here can date it.

figma_get_treeA

Compact outline of the layer tree (id, type, name, size, hints). Omit node_id for all pages.

figma_get_nodeA

Detailed design data for a node and its subtree: geometry, fills/strokes/effects (hex), auto-layout, text styling and runs, component/instance info, bound variables and style names. Instances are not expanded (see mainComponentId). The result is dated by the copy it answers from. exportedAt is the ISO-8601 time this tool exported that snapshot through the browser: report what the design said then rather than as current, and pass refresh to export it again. For a local .fig the field is fileModifiedAt, that copy's own file time, which copying, syncing or re-downloading the file resets: the design data can be older than it says, and nothing here can date it.

figma_searchA

Find nodes by name (and optionally text content). The query is a literal substring, case-insensitive unless case_sensitive: a name like Icons/Arrow/Left or /Card [v2]/ matches itself. Only regex=true reads it as a pattern, bare or /pattern/flags, and an invalid pattern is an error. With include_text, component instances are expanded, so strings that only exist as instance overrides or component property values are matched too, each tagged with via (direct/instance) and, where they apply, component, variant and frame. Name matching sees only real layers: layer names inside a collapsed instance live in its main component, so search that component instead. A hit's characters is a preview: longer text is cut to its first 120 characters followed by ... and flagged charactersTruncated (truncated, next to it, is about the number of results); figma_get_text returns the strings whole. When the text pass runs, unresolvedInstances counts the instances whose text could not be resolved and so was not searched (figma_get_text names the components); it is absent when the pass did not run. The result is dated by the copy it answers from. exportedAt is the ISO-8601 time this tool exported that snapshot through the browser: report what the design said then rather than as current, and pass refresh to export it again. For a local .fig the field is fileModifiedAt, that copy's own file time, which copying, syncing or re-downloading the file resets: the design data can be older than it says, and nothing here can date it.

figma_get_variablesA

Design variables (tokens) with collections, modes, per-mode values and resolved aliases. Works on any plan (no Enterprise REST API). Formats: json (default), css (custom properties, extra modes as [data-collection=mode]), dtcg (W3C design tokens). A file that defines none answers empty in that format; figma_token_usage derives tokens from the raw values instead, and figma_get_styles reads the styles.

figma_get_stylesB

Local (and imported library) styles with their values: FILL (color), STROKE, TEXT, EFFECT and GRID. Formats: json (default) or css. A file with no styles, or none of the type asked for, answers empty in that format.

figma_get_componentsA

The components this file defines, and the library components it uses. componentSets are the variant sets, with their description, property definitions and one entry per variant carrying that variant's counts; components are the ones outside a set, each with a size and its own counts. A count is instances placed directly, plus swapInstances where the component is swapped into an instance (by an override or an instance-swap property). libraryComponentsUsed is a third list: components defined in other files, by name, with the variants used and the same two counts. Internal-only pages are left out of all three lists but not out of the counts: an instance placed on one still counts for the component it is of, except for a library component, whose uses on such a page are skipped. The result is dated by the copy it answers from. exportedAt is the ISO-8601 time this tool exported that snapshot through the browser: report what the design said then rather than as current, and pass refresh to export it again. For a local .fig the field is fileModifiedAt, that copy's own file time, which copying, syncing or re-downloading the file resets: the design data can be older than it says, and nothing here can date it.

figma_token_usageA

Scan a subtree (or whole file) and aggregate the raw design values actually used: colors, typography combos, corner radii, auto-layout gaps/paddings, stroke widths, effects, each with counts and the variable/style bound where present. Useful to derive a token set from files that do not define variables or styles. A typography entry carries only the properties the file records, and always at least one: text that records none of them is counted in textWithoutTypography instead, so it is accounted for without standing in the list as an entry naming no value. The result is dated by the copy it answers from. exportedAt is the ISO-8601 time this tool exported that snapshot through the browser: report what the design said then rather than as current, and pass refresh to export it again. For a local .fig the field is fileModifiedAt, that copy's own file time, which copying, syncing or re-downloading the file resets: the design data can be older than it says, and nothing here can date it.

figma_get_textA

All text content under a node (or the whole file) in reading order, with node ids. Component instances are expanded, so strings that only exist as instance overrides or component property values are included, each tagged with via (direct/instance) and, where they apply, its component, variant and enclosing frame. A field that does not apply is absent: text on the canvas has no component. Hidden layers are excluded unless include_hidden. The result always reports total/truncated/unresolvedInstances: a non-zero unresolvedInstances means text is missing, at that many places; unresolved lists each missing component once, with its count and some of those places, the most common first, and unresolvedComponentsOmitted counts the components past that listing. The result is dated by the copy it answers from. exportedAt is the ISO-8601 time this tool exported that snapshot through the browser: report what the design said then rather than as current, and pass refresh to export it again. For a local .fig the field is fileModifiedAt, that copy's own file time, which copying, syncing or re-downloading the file resets: the design data can be older than it says, and nothing here can date it.

figma_screenshotA

Render a node to PNG using Figma's own 'Copy as PNG' in the browser (the system clipboard is not touched). Uses the live file, not the snapshot. Returns the image, downscaled to max_dimension.

figma_export_image_fillsA

Write the original image assets (photos, bitmaps) a node or the whole file uses, in a fill or a stroke paint, to a directory. Answers with an array, one entry per distinct image: hash, the path written, its size in bytes, and up to five of the layers using it (with usedByTotal when there are more). An image whose bytes this export does not carry is reported as {hash, missing: true} and nothing is written for it.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.2/5.0

Scored across 14 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: auth, file listing/loading, tree/node access, search, text extraction, variables/styles/components, token usage, screenshot, and image export. Where tools seem adjacent (search vs. get_text, get_tree vs. get_node), the descriptions make the boundary explicit.

Naming Consistency5/5

All tools share the figma_ prefix and follow a consistent verb_noun pattern: list_files, load_file, get_tree, get_node, get_text, get_variables, get_styles, get_components, export_image_fills. Even the less noun-like names like figma_status and figma_login fit the predictable style.

Tool Count5/5

14 tools is well within the ideal range for a reader-focused server. Each tool covers a meaningful slice of Figma reading/export functionality without redundancy or bloat.

Completeness5/5

The surface covers the full read lifecycle: file discovery and loading, structural traversal, node-level design details, text and search, design tokens/styles/components, usage analysis, rendering, and bitmap asset export. For a "reader" server, there are no obvious dead ends or missing operations.