Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FIGMA_MCP_LEGACY_TOOLSNoSet to '1' to enable optional legacy tools (figma_create_ui_card, get_me, get_image_fills).0
FIGMA_MCP_NO_UPDATE_CHECKNoSet to '1' to disable the startup update check.0
FIGMA_PERSONAL_ACCESS_TOKENNoYour Figma personal access token for cloud REST access. Without it, REST tools (get_file, get_node, etc.) are not registered.

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
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
figma_execute_codeA

WRITE tool: run JavaScript in the open Figma document (Figma Desktop + 'Mokido' plugin) to create, edit, move, style or delete nodes. To READ (explore a section, list children, find layers, check texts / fonts / variants / table columns) call figma_inspect instead: every id in one call, one line per node, view:"table" for tables; a read script here costs a model turn per question and its reply names the figma_inspect call to use (use_instead). Every call is a full model turn, so make the whole change in ONE call — all screens / breakpoints, verified in the same code with bridge.check — and put capture_node_ids on that same call instead of a separate figma_screenshot. Globals: figma, await ensureFont(family, style), getFreePosition(w, h), bridge: bridge.check({ '1:2': { width: 320, fill: '#FFFFFF' } }) -> pass/fail list; bridge.define(name, src) + bridge.require(name) keep helpers between calls (each call is a fresh function body — never eval); return bridge.info() lists the rest. Macros: bridge.replaceWithInstance(target, comp, {props, text}), bridge.setProps(inst, {Status: 'Dropdown'}), bridge.setText(root, {layer: '…'}) or bridge.setText(textNode, 'new text') (keeps mixed font styles by words: THE way to replace the text of a label with several font styles — never characters =, which flattens them, and never a per-character getRangeFontName/setRangeFontName loop), bridge.shift(ids, {dx, dy}), bridge.moveInto(ids, section, {layout, gap}), bridge.fitSection(s), bridge.context(id), bridge.componentize(nodeObject) -> new COMPONENT, same name/size/look, NEW id (never raw createComponentFromNode), prototype links: await bridge.openOverlay(triggerId, overlayFrameId, { position: 'BOTTOM_CENTER', dim: 0.4, closeOnOutside: true }) (the overlay look is read-only in the Plugin API: the reply names the MANUAL STEP for the user), bridge.closeOverlay(id), bridge.setReaction(id, { to: frameId, nav: 'NAVIGATE' }); read links with figma_inspect view:"flow". Call macros directly, don't read their source. Never findAll the whole page — scope to a section. Return only the ids/flags you need: responses over max_output_bytes (3500) are shrunk, the full value stays in bridge.state.lastResult.

figma_inspectA

READ the live Figma document in ONE call — the tool for any read (not figma_execute_code); pass every node id you need at once instead of one call per node. Default: a compact outline, one line per node (TYPE "name" #id WxH @x,y [V gap8 pad16 fill/hug a:start/center] size:fill/hug fill:#FFF stroke:#E8EAF0/0,1,1,1 r0,0,3,3 shadow:… font "text…"; non-defaults only; a TEXT named after its text drops the name; a:P/C = primaryAxisAlignItems/counterAxisAlignItems, start = MIN, center = CENTER, end = MAX, between = SPACE_BETWEEN, absent = MIN/MIN), as deep as fits the reply unless depth is given; children:N marks a node with more below. like: "<ref id>" (or several) FINDS every copy of the reference under node_ids (screens/sections; default: its section) — instances of the same component, or same name — and diffs each against it: the call for "redo these like the reference" when you don't know where the copies are. compare: "<ref id>" lists, per node_id, every difference from that reference (layout, sizing, stroke, radius, effects, clip, font, variant; children matched by name) and ends with REF lines, the reference's exact values to copy into the write (no props read needed) — one call for "make these like that one", and the check after the write. props returns exact values instead: { id: { prop: value } } (also fill, stroke, text, font, layout, padding, parent, children, main, variant, props, absolute, reactions, connector). find searches node names under node_ids (or the current page); find_text searches text content. view: "map" = canvas map (sections, breakpoints). view: "flow" = the prototype links under node_ids (a section or screens): per screen, source, trigger, action, target, transition, plus the overlay settings of overlay targets — never scan the page for reactions. context: true adds ancestor sections, breakpoints and component variants. offset skips the first N outline lines when a reply ends with pass offset=K. check returns only mismatches. Combine them freely. Changes nothing.

figma_screenshotA

Capture PNG screenshots of specific nodes or the current selection in Figma, to check layout, contrast, typography and spacing. Each image costs ~1k tokens at the default max_px, and stays in context: check mechanical things through write-call warnings or bridge.check first, and take one screenshot per finished stage rather than after every edit. Right after a figma_execute_code edit, put capture_node_ids on that call instead — this tool is then an extra turn.

figma_get_selectionA

Get information and properties (dimensions, coordinates, text, fills, parent, page, AutoLayout context) of the currently selected nodes on the Figma canvas.

figma_find_componentsA

Find and inspect components, component sets, variants, and component property definitions in the active Figma file without flooding LLM context. Returns names, variant values, keys, and IDs.

figma_insert_component_instanceA

Create and insert an instance of a master component or component set into the canvas or target AutoLayout container. Supports selecting variants, applying text overrides with auto font loading, and can return a PNG screenshot (capture: true) for visual verification.

figma_get_variablesA

Retrieve all Figma Variable collections, modes (e.g. Light/Dark), and design tokens (colors, numbers, strings, booleans) from the active document.

figma_set_variables_modeA

Switch the active Figma Variables mode (e.g. Dark Mode, Light Mode, Brand theme) for a specific artboard/frame or the entire page.

figma_insert_svgA

Insert raw SVG/vector code directly into Figma canvas or target AutoLayout container with automatic scale-proportional resizing, fill/stroke color overrides, optional component creation, and an optional PNG screenshot (capture: true).

figma_get_canvas_layoutA

Inspect top-level frames and artboards on the active Figma page to prevent overlap. Returns all screen coordinates, bounding box, and a calculated 'suggestedNextPosition' for placing new artboards safely.

figma_rollbackA

Undo what a previous write call (figma_execute_code, figma_insert_component_instance, figma_insert_svg) did: removes nodes it created and restores properties on nodes it modified. Deletions the code performed on pre-existing nodes are never recoverable. Every write call's response includes the checkpoint_id to pass here.

figma_job_statusA

Wait for a figma_execute_code call that came back as { status: 'running', job_id } (it ran past 45s, or was called with async: true). BLOCKS until the job finishes or wait_ms passes, then returns the same result/screenshot the synchronous call would have — so call it once, not in a polling loop. stalled: true means the plugin looks frozen: STOP, ask the user to check Figma; a second figma_job_status for that job returns at once with the same advice. A finished job is forgotten after being read once.

figma_list_targetsA

List every Figma document currently connected to this bridge (fileName, current page, which one is focused). Use this when a LIVE tool call fails with AMBIGUOUS_TARGET, or before working with a specific file among several open at once — pass the fileName as target on any LIVE tool.

figma_read_canvasA

Read the LIVE, currently-open Figma document as token-optimized Pseudo-JSX/Tree/JSON — the same pipeline get_file/get_node use for the cloud API, applied to whatever is open in Figma Desktop right now. Prefer this over hand-writing a tree walk in figma_execute_code; it is far cheaper in tokens and its output format matches get_file/get_node exactly.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 14 tools

Disambiguation3/5

Several read-oriented tools overlap: figma_inspect, figma_read_canvas, figma_get_selection, and figma_find_components all inspect live document content, and figma_inspect itself claims to be the tool for any read. figma_screenshot also overlaps with the capture option on write calls. Descriptions give strong guidance, but an agent could still hesitate between plausible read paths.

Naming Consistency4/5

All tools share the figma_ prefix and most follow a verb_noun pattern such as figma_get_selection, figma_find_components, and figma_insert_svg. Minor deviations include noun-like names (figma_screenshot, figma_job_status) and mixed read verbs (inspect, read, get, find), but the set remains predictable.

Tool Count5/5

14 tools is well within a reasonable range for a Figma bridge that spans reading, writing, component insertion, variables, screenshots, rollback, and async job handling. Each tool has a plausible role, and the count does not feel bloated.

Completeness4/5

The surface covers a broad design-editing lifecycle: live inspection, arbitrary writes, component and SVG insertion, variables, screenshots, rollback, and job status. Some operations such as explicit export, selection mutation, or variable creation are not first-class, though figma_execute_code can handle them as workarounds.

Maintenance

ActivityNo data
ResponsivenessNo issues