tokensStudioMCP
Reads design tokens applied by the Tokens Studio for Figma plugin from Figma layers, providing tokenized layer trees, grouped token dictionaries, and style-gap reports.
Click on "Deploy 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., "@tokensStudioMCP show tokens for Figma URL https://www.figma.com/design/abc/File?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.
ft — Tokens Studio applied tokens, one command
ft reads the design tokens applied by the
Tokens Studio for Figma
plugin and prints them next to the layers that use them. Paste a Figma
URL into your terminal and you get back an annotated layer tree, a
grouped token dictionary, or a style-gap report — whichever one you
asked for.
# Copy a Figma frame URL in your browser, then:
ftThat's it. No quoting, no setup beyond a one-time Figma token, no
Figma desktop app. ft also runs as an MCP stdio server so Claude
Code can read applied tokens without leaving the chat.
Why this exists
Figma's official Dev Mode MCP server exposes layer metadata (ids,
names, types, coordinates) but not the Tokens Studio data —
because that data lives in sharedPluginData on every node, under
the tokens namespace, and is invisible to most REST consumers.
The result: an LLM code agent can see the layers but not which tokens drive which properties, so generated code falls back to hard-coded colours and spacings.
ft closes that gap. One REST call with plugin_data=shared, one
walk of the returned tree, and every node comes back labelled with
its Tokens Studio tokens — ready for the next ft tokens or for
Claude Code to consume over MCP.
Related MCP server: figma-unified-mcp
Install
git clone https://github.com/Blyawon/tokensStudioMCP.git
cd tokensStudioMCP
npm run setup
source ~/.zshrc # or restart your terminalnpm run setup runs the whole chain:
npm installnpm run build— compiles TypeScript todist/.npm run alias— installsftandfigtokensaliases in~/.zshrc(or~/.bashrc). On zsh they're wrapped innoglobso?in URLs doesn't trigger globbing.node dist/index.js setup— prompts for your Figma personal access token and saves it to.env(chmod 600).
Get a token at https://www.figma.com/developers/api#access-tokens with scope File content: Read-only. The setup step links you there and walks you through it.
Requires Node.js ≥ 18 (native fetch).
Quick start
The fastest path is clipboard mode — no quoting, no shell gotchas:
# 1. Copy any Figma frame URL in your browser.
# 2. Run:
ftWith no arguments, ft reads the URL from your clipboard
(macOS pbpaste). You can also pass a URL directly:
ft 'https://www.figma.com/design/abc/File?node-id=1-2'Sample output
resultpage_lg COMPONENT 2007:102481 coverage=1735/2903
└─ .appShell INSTANCE 94:774 fill=page.background.100
├─ .navigation INSTANCE 93:3974
│ └─ .collapseButton INSTANCE 20:814 sizing=dimension.2xl
│ └─ buttonAction INSTANCE 19:792 composition=…
└─ .sectionList INSTANCE 101:222718
└─ items SLOT 101:214831 itemSpacing=section.spacing.prominent.md
├─ (×4) container INSTANCE 102:269769 composition=…
└─ footer INSTANCE 102:269770 fill=colors.surface.defaultOne line per node:
<name> <TYPE> <id> <tokens…>.Adjacent siblings with identical structure + tokens collapse into
(×N).Untokenized nodes show no trailing token cluster — absence is the default.
The root carries
coverage=<with>/<total>so you see how tokenized the selection is at a glance.composition=…marks nodes that use a composition token; see Composition tokens below.
Commands
ft # clipboard URL → compact tree (same as `ft <url>`)
ft <url> # compact tree of a frame with applied tokens
ft tree <url> # same as `ft <url>` (explicit)
ft tokens <url> # grouped token dictionary + style-gap report
ft coverage <url> # % of nodes that have tokens, with a progress bar
ft node <url> # tokens applied to one node
ft config # show the effective config and where it came from
ft setup # save or replace your Figma access token
ft help # cheat sheet with every flag
ft mcp # run as an MCP stdio server (Claude Code uses this)ft tokens — the cheap pre-flight
Ask "which tokens does this frame actually use?" before fetching
the full tree. Output is grouped by property key (fill, spacing,
typography, composition, …), values sorted alphabetically, each
value annotated with the layer names that use it.
47 unique tokens across 8 properties
fill (3)
colors.border.subtle used by: .divider ×4, .card ×2
colors.text.primary used by: .title, .body ×6
page.background.100 used by: .appShell
spacing (5)
section.spacing.prominent.md
spacing.lg
spacing.sm
…
composition (27)
ecommerce.container.base.size:lg
styles.buttonAction.base.variant:control.size:sm.hover
…
▸ 12 nodes have visual styling with no covering tokenThe trailing style-gap line is a count of nodes that have visual
styling (fills, strokes, effects, shared styles) but no Tokens
Studio token covering that property. --no-warn silences it.
ft coverage — fast sanity check
[█████████████░░░░░░░] 1735 / 2903 (60%)Use it to sanity-check whether a file is tokenized at all before you start processing anything. Prints a plain text line instead of the bar when stdout isn't a TTY.
ft node — one-node snippet
ft node 'https://www.figma.com/design/abc/File?node-id=1-2'Returns a single-node XML snippet with just the <tokens …/> child.
Useful when you already know the node id and want the smallest
possible answer.
Flags
Every CLI command accepts the same flag set. Grouped by intent:
What to show
Flag | What |
| Hide branches that contain no tokens anywhere |
| Show every layer, even untokenized ones (overrides config) |
| Hide branches that contain no style gaps |
| Include |
| Include vector nodes that have no fill (hidden by default) |
| Show composition tokens inline instead of the |
| Don't flag untokenized visual styling |
| Turn off every filter for this run |
How to show it
Flag | What |
| Cap subtree depth |
| Supply a node id when the URL doesn't have one |
| Append |
| Emit legacy Figma-MCP-style XML instead of the compact tree |
| Emit a structured JSON object on stdout (tree, tokens, coverage, node) |
| Don't collapse repeated sibling groups |
Example:
ft 'https://www.figma.com/design/abc/File?node-id=1-2' --depth 3 -o--json output
Every command that returns data (ft, ft tree, ft tokens, ft coverage, ft node) accepts --json. The object always has a
format discriminator so one consumer can tell the shapes apart.
ft tokens 'https://www.figma.com/design/abc/File?node-id=1-2' --json{
"format": "tokens",
"totalUnique": 47,
"totalProperties": 8,
"compositionHidden": 27,
"properties": {
"fill": {
"colors.brand.primary": [
{ "name": "button", "type": "INSTANCE", "count": 4 },
{ "name": "link", "type": "TEXT", "count": 2 }
]
}
},
"gaps": [
{ "name": "divider", "type": "LINE", "id": "1:27", "gaps": ["borderColor"] }
]
}Tree JSON carries a coverage object and a nested root with
{ id, name, type, tokens?, gaps?, characters?, layout?, children? }
on every node. Coverage JSON is a plain
{ format: "coverage", withTokens, total, percent }. Node JSON is a
single-node snapshot with the display tokens inlined. None of them
print the splash or summary divider — stdout stays clean for piping
into jq, other scripts, or downstream codegen.
Composition tokens
Tokens Studio lets you apply a single composition token to a
node that bundles multiple property styles at once (e.g.
button.primary.hover → fill + border + padding + typography).
That's great for design maintenance but terrible for automatic
codegen — a composition token's value is an opaque string.
ft handles composition tokens this way:
Coverage counts them. A node with only a composition token is counted as tokenized. It does not show up as a gap.
Display strips them by default. The compact tree shows
composition=…as a placeholder so you know one is present without drowning the output in long composition paths. Pass--with-composition(orincludeComposition: truein config, or the MCP tool parameter) to see the full value.Gap detection trusts them. Because a composition token can cover fill/stroke/spacing/typography all at once, nodes with a composition token applied never report style gaps. This is the right default for the common Tokens Studio workflow.
ft tokens surfaces a one-line note when composition tokens are
present, so you're never guessing why a visually-styled frame looks
"empty".
Config file
Put persistent defaults in ~/.ftrc.json (global) or
./ft.config.json (per-project). Any key is optional.
{
"ignoreVectorsWithoutFill": true,
"ignoreComponents": true,
"warnStyleGaps": true,
"onlyWithTokens": false,
"includeComposition": false
}Project config wins over global config; CLI flags win over both.
ft config prints the effective config and shows which file each
value came from.
--all bypasses the config entirely for one run — handy when you
want to see everything, once, without editing a file.
Shell quoting (zsh + bash)
Figma URLs contain ? and &, both of which are shell
metacharacters:
zsh:
?triggers filename globbing,&triggers job control.bash: same story for
&;?is usually safe unlessfailglobis set.
npm run setup installs the ft alias wrapped in noglob on zsh,
so bare ? is safe even without quotes. & still splits the
command line (job control is not part of filename expansion and
can't be disabled by noglob), so URLs containing & still need
single quotes.
# zsh:
ft https://www.figma.com/design/abc/File?node-id=1-2 # ok (noglob)
ft 'https://www.figma.com/design/abc/File?node-id=1-2&t=xyz' # ok (single-quoted)
# bash:
ft 'https://www.figma.com/design/abc/File?node-id=1-2' # always single-quoteThe easy way to sidestep all of this: copy the URL in your
browser and just run ft.
ft detects the classic "zsh ate my URL" pattern (a Figma URL with
query params but no node-id) and prints a soft warning to stderr
telling you to either single-quote the URL or use clipboard mode —
no silent failures.
Use it from Claude Code
claude mcp add tokens-studio node "$PWD/dist/index.js"(No subcommand — node dist/index.js with no args and a non-TTY
stdin runs the MCP server.)
Three tools are exposed:
Tool | What it does |
| START HERE. Unique tokens grouped by property, with layer usage and a style-gap report. Cheap pre-flight — call this first to decide whether you actually need the full tree. |
| Figma-MCP-style XML tree decorated with applied tokens on every node. Instance-path ids collapsed, |
| Tokens for a single node as a tiny XML snippet. |
All three accept any combination of url, fileKey, and nodeId,
so you can point them at a whole file or a specific frame. All three
respect your config file and the includeComposition parameter.
In any chat, ask:
Use tokens-studio to list the tokens applied in
<paste figma url>, then show me the frame tree only for the components that usecolors.brand.primary.
Claude Code will call list_tokens first, see what's there, then
call get_metadata_with_tokens with the right filters.
How it works
Figma's REST API supports
?plugin_data=shared, which returns every node'ssharedPluginData.Tokens Studio stores applied tokens under the
tokensnamespace on each node, keyed by the property they target (fill,borderRadius,spacing,typography,composition, …).ftwalks the returned tree and renders it either as a compact ASCII tree (default) or a Figma-MCP-style XML tree (--xml).Dedupe is content-hash based: the hash mixes every descendant's
type + name + tokens signature + recursive child hash. Two instances that differ only by a leaf-level token override hash differently and are kept separate.No Figma desktop app needed. Headless. Your token stays in
.envon your machine.
Project layout
src/
├── index.ts # CLI router + MCP stdio server + tool definitions
├── cli-ui.ts # Spinner, splash, progress bar, colour helpers (TTY-gated)
├── figma-client.ts # Minimal REST client with plugin_data=shared
├── parse-url.ts # Figma URL → { fileKey, nodeId? }
├── tokens.ts # extractTokens / extractDisplayTokens / style-gap logic
├── xml.ts # Legacy XML renderer (get_metadata_with_tokens)
├── render-tree.ts # Compact ASCII tree renderer + token dictionary
├── config.ts # ~/.ftrc.json + ./ft.config.json loader
├── tokens.test.ts # Node test runner suite
└── render-tree.test.tsRun the tests with:
npx tsx --test src/tokens.test.ts src/render-tree.test.tsScope
Reads via the Figma REST API. Writes are opt-in and go through the companion plugin (see Token remapping below) — the CLI itself only reads.
Returns token names (reference paths like
colors.primary.500) — not resolved values. Composition token values are shown as full reference paths when--with-compositionis on.Node 18+ (native
fetch).
Token remapping (MCP)
When connected via MCP, three additional tools enable AI-driven token remapping — useful for porting an old component onto a new token set:
propose_token_remap— read-only. Takes a Figma URL plus the new token JSON you pasted in chat (Tokens Studio export, DTCG, or a flat list of paths — all accepted) and returns a candidate plan with scores and ambiguous cases for the agent to resolve.apply_token_remap— applies a plan to the live Figma file via the companion plugin. Whole batch is wrapped in a single Figma undo entry (Cmd-Z reverts it all). SupportsdryRun: true.bridge_status— diagnostic; reports whether the WebSocket bridge is up and whether the plugin is connected.
Plugin install
The Figma REST API can read shared plugin data but cannot write it —
that mutation is plugin-only. So apply_token_remap ships its writes
through a tiny companion plugin you install once:
npm run build:pluginIn Figma → Plugins → Development → Import plugin from manifest…
Pick
figma-plugin/manifest.jsonfrom this repo.Run the plugin (Plugins → Development → Tokens Studio MCP Bridge) in the file you want to remap. The plugin UI should turn green ("Connected") once the MCP server's bridge is running.
The plugin opens a WebSocket to ws://localhost:3055, which the MCP
server starts on demand the first time you call bridge_status or
apply_token_remap. Only one Figma window can be connected at a time.
See CHANGELOG.md for the v0.1 → v0.2 history.
License
MIT — see LICENSE.
Available Tools
38 toolsanalyze_designA
Usage statistics for the live canvas via the plugin (scope: nodeId → selection → current page): top solid fill colors, top typography combos (family/style/size), and top auto-layout gaps + paddings, each with usage counts. Use it to spot hard-coded values that should be tokens, or to derive a palette from an existing design.
Inputs: kind, nodeId.
apply_themeB
Switch the file to a theme and resolve every applied token to its concrete value. Sets the file's activeTheme + usedTokenSet shared plugin data (so Tokens Studio recognizes the switch), then walks the subtree and writes resolved values directly via the plugin — no need to click 'Apply' in Tokens Studio. Supports color (fill/stroke), spacing/padding (all 4 axes), border radius/width, opacity, sizing, composition (auto-expanded into their constituent property writes), typography (font family / weight / size / line-height / letter-spacing — pre-loads fonts in parallel), and shadow (drop / inner via the effects array). Math expressions like {base.size.4} * 2 are evaluated; references are followed (cycle-protected at depth 16). Hidden nodes are skipped by default for both performance and intent. Pass dryRun: true to see what would be written without touching the file.
Inputs: themeName (required), url, scope, dryRun, +6 more.
apply_token_remapA
Apply a remap plan to the live Figma file via the companion plugin. Requires the 'Tokens Studio MCP Bridge' Figma plugin to be running and connected — call bridge_status first if unsure. Pass the plan you got back from propose_token_remap, after deciding chosen for any ambiguous entries. dryRun: true runs validation but skips the write. The whole batch is wrapped in a single Figma undo entry — Cmd-Z reverts the entire remap.
Inputs: plan (required), dryRun, planId.
apply_to_variantsA
Bulk-apply tokens to every variant of a Figma component_set in a single call, using a token-path TEMPLATE with {axis} placeholders. Solves the 'tab bar / button / chip / icon-set' shape: 24+ variants, each with a per-variant token derived from the component's variant axes (variant, active, state, density, …). Works for ANY naming convention — you supply the template that matches your design system's path shape. Targets descendants by layerName (and optional layerType), so the token lands on the actual shape layer / instance / wrapper, not the variant frame. Optional clearProperties removes other token property keys on the same nodes (useful for fixing earlier wrong writes). dryRun: true returns the full plan without writing.
Inputs: property (required), template (required), layerName (required), url, +5 more.
bridge_statusA
Diagnostic: is the local WebSocket bridge running and is the companion Figma plugin connected? Returns the connected file's key/name when known. If the plugin is not connected, make sure the 'Tokens Studio MCP Bridge' plugin is open in Figma.
Inputs: no named parameters.
bulk_rename_tokensA
Rename tokens by exact path or wildcard pattern, in two scopes: live (rewrite applied references on Figma nodes via apply_token_remap) and/or files (stage rename_token edits on the catalog working copy). scope: "both" (default) does both. dryRun: true returns counts without modifying anything. Pattern syntax: * captures one path segment, referenced as $1 in replacement (e.g. colors.brand.* → color.accent.$1).
Inputs: rules (required), url, scope, dryRun, +2 more.
canvas_auditA
Accessibility audit of the live canvas via the plugin (scope: nodeId → selection → current page). Checks: 'contrast' (WCAG AA/AAA text-vs-background ratios, large-text aware), 'touch' (interactive elements ≥44×44, detected by reactions or button/input-ish names), 'text' (minimum font size), or 'all'. Returns per-check counts + failing nodes with ids so fixes can target them directly.
Inputs: check, level, nodeId, minTouch, +1 more.
commit_and_pushA
Flush every staged edit as a single commit on the configured branch (or a new one via branch / asNewBranch). Conflict-checked: refuses if the remote head moved since the working copy was loaded — pull (Refresh in plugin) and re-stage edits, then retry. Currently supports GitHub only.
Inputs: message (required), branch, asNewBranch.
create_branchA
Create a new branch on the active token source's remote. Defaults to branching from the current active branch. Optionally switch the plugin's saved override to the new branch so subsequent edits + applies target it. Currently supports GitHub only; other providers will return a 'not implemented' error.
Inputs: name (required), from, switchTo.
create_iconA
Create an icon on the canvas from the Iconify catalog (200k+ icons: lucide:, mdi:, tabler:, heroicons:, …). The server fetches the SVG from api.iconify.design and the plugin renders it as vectors, optionally tinted with color and placed inside parentId.
Inputs: icon (required), x, y, name, +3 more.
create_image_from_urlA
Fetch an image from a URL (server-side) and place it on the canvas as a rectangle with an image fill — e.g. reference screenshots, logos, photos. Native image size is used unless width/height given.
Inputs: url (required), x, y, name, +3 more.
create_nodeA
Create a node in the live Figma file via the plugin: frame, rectangle, ellipse, line, text, autolayout (frame with flex), or instance (from a componentId). Auto-positions right of existing content unless x is given. Supports fill/stroke (hex, rgb(), hsl(), or 'none'), cornerRadius, opacity, and auto-layout props (layout='row'|'col', gap, padding, justify/items = start|center|end|between, sizingHorizontal/Vertical = HUG|FILL|FIXED). Text supports characters, fontSize, fontFamily, fontStyle. Pass children (array of nested create_node specs, same shape minus parentId) to build a WHOLE TREE in one call — e.g. a card frame with title + body + button. Also supports type='svg' ({svg: markup}), 'image' ({base64}), 'section', and in FigJam files 'sticky', 'connector' ({startNodeId,endNodeId}), 'shape'. Returns the new root node's id.
Inputs: type (required), x, y, gap, +24 more.
debug_resolve_tokenA
Diagnostic: resolve a specific token path under a given theme and return the full resolved value tree. Useful for debugging why a composition token doesn't produce the expected writes — if a sub-property is missing from the resolved entries, that reference couldn't be found in the theme's enabled sets.
Inputs: themeName (required), tokenPath (required).
delete_tokenA
Stage a token deletion. Removes the token at path from the named set in the working copy. Accumulates until commit_and_push.
Inputs: set (required), path (required).
dev_resourcesA
Manage dev resources (links to Storybook / GitHub / docs) on a node via the plugin: action='add' {url, name?}, 'list', or 'delete' {url}. Targets nodeId or the current selection.
Inputs: url, name, action, nodeId.
discard_pending_editsA
Throw away every staged edit and reset the working copy to the last fetched base catalog. Useful when you want to start over.
Inputs: no named parameters.
export_node_imageA
Export a node (by nodeId or current selection) as PNG/JPG/SVG via the plugin. PNG/JPG come back as an inline image for visual verification of what you just built; SVG comes back as text.
Inputs: scale, format, nodeId.
figma_evalA
Execute JavaScript inside the connected Figma plugin sandbox with the full figma Plugin API in scope (create/edit any node, variables, styles, components, viewport, exports — everything). Code runs in an async IIFE: await works, the last expression (or return …) is the result. Figma nodes in the result come back as {id,name,type} stubs. Use the structured tools (create_node, set_node_properties, …) for common operations; reach for eval when you need something they don't cover. Each call is one Figma undo step.
Inputs: code (required), timeoutMs.
figma_variablesC
Figma Variables CRUD + binding via the plugin. sub-ops: 'listCollections', 'list' (optionally filter by name), 'createCollection' {name}, 'create' {name, collection, type: COLOR|FLOAT|STRING|BOOLEAN, value}, 'setValue' {variableId, value, modeId?}, 'bind' {variable (id or name), field: fill|stroke|cornerRadius|itemSpacing|paddingTop|…, nodeIds?/selection}, 'exportCss' / 'exportTailwind' {collection?} (CSS custom properties / Tailwind theme.colors from the file's variables). Colors accept hex/rgb()/hsl().
Inputs: sub (required), name, type, field, +7 more.
find_nodesA
Find nodes on the current page by name substring and/or type (FRAME, TEXT, COMPONENT, INSTANCE, …) via the plugin. Returns id/name/type/bounds for up to max matches (default 50).
Inputs: max, name, type.
get_canvas_treeA
Live node tree from the plugin — works in ANY file the plugin is open in (drafts, branches, files without REST access), no fileKey needed. Root = nodeId, else the single selected node, else the current page. Each node carries id/name/type, x/y/w/h, auto-layout props, fills, radius, and text font/size/content. Depth-limited (default 6, max 12).
Inputs: depth, nodeId.
get_current_targetA
Returns the designer's currently pinned target (if any) and live selection from the connected Figma plugin. Use when the user says 'this', 'here', 'the current selection', or doesn't specify a URL. Prefer pinned if present.
Inputs: no named parameters.
get_design_contextA
THE tool for building code from a Figma design — replaces the need for a separate Figma MCP. Returns a compact markdown tree of a node/subtree carrying everything needed to rebuild it: auto-layout (direction, gap, padding, alignment, hug/fill sizing), constraints, fills/strokes/gradients with resolved hex colors, stroke weight, corner radius, effects (shadows/blur), opacity, blend mode, typography (family, weight, size, line-height, tracking), text content, component/instance relationships + variant props — AND the Tokens Studio tokens applied to each node, so generated code can use design-token variables instead of hard-coded values. One line per node; defaults omitted.
Inputs: url, depth, nodeId, fileKey, +3 more.
get_metadata_with_tokensA
STEP 2 of the recommended flow (call list_tokens first to see which tokens exist before fetching the whole tree). Returns a Figma MCP-style get_metadata XML tree for a Figma file or node, decorated with Tokens Studio applied tokens on every node. Every element gets a <tokens .../> child; nodes without applied tokens emit . The root element carries a token-coverage="/" attribute. Nodes with visual styling (shared styles, raw fills/strokes/effects) but no covering token get an untokenized="fill,stroke,…" attribute on their tokens element. x/y/w/h are omitted by default — pass layout=true if you need them. Composition tokens are stripped by default (they duplicate individual property tokens); pass includeComposition=true to include them. Pass format='tree' for a compact markdown tree (~50% fewer tokens than XML).
Inputs: url, depth, format, layout, +7 more.
get_node_tokensB
Return just the Tokens Studio applied tokens for a single Figma node, as a tiny XML snippet. Untokenized nodes come back as .
Inputs: url, nodeId, fileKey.
get_token_catalogA
Fetch the canonical Tokens Studio token catalog from its sync source (GitHub, GitLab, Bitbucket, ADO, JSONBin, URL, Tokens Studio SaaS, Supernova) — or from the file's local cache when no remote sync. By default auto-discovers the storage config from the live file via the plugin; pass override to point at a different repo / branch / file path. Returns the parsed token tree, themes, and metadata. Credentials come from env vars (TOKENS_STUDIO__TOKEN); call get_token_storage_config first to see which secrets are configured.
Inputs: secret, override, setFilter, pathPrefix.
get_token_storage_configA
Auto-discover Tokens Studio's sync provider config from the live Figma file (via the companion plugin). Returns the storageType blob (provider, id, branch, filePath, ...) plus themes / activeTheme / tokenFormat / version metadata. Credentials are NOT returned — they live in env vars on the MCP server. Pair with get_token_catalog to actually fetch the tokens. Returns null storageType when the file has only a local cache (use get_token_catalog with no override to read it).
Inputs: no named parameters.
inspect_bound_variablesA
Diagnostic: dump the per-node state that can override raw writes — boundVariables (bound Figma Variables take visual precedence over any raw fill/stroke/effect/numeric value), fillStyleId/strokeStyleId/effectStyleId/textStyleId (attached Figma Styles), and insideInstance (non-overridable instance sublayers silently reject writes). Use this to figure out WHY a specific layer visually doesn't re-theme even though apply_theme reports the write as applied.
Inputs: scope, nodeIds.
inspect_nodeA
Deep-inspect a Figma node (or its subtree) against the current token catalog: returns every applied token with its resolved value, flags broken references (unresolved / missing set / cycle / literal 'none'), and attaches the top remap suggestions for each broken token plus any style gaps. Pass scope='subtree' to walk descendants. Backs the plugin's Inspect tab; use it in chat when you need to audit a frame's token coverage end-to-end without assembling the pieces yourself.
Inputs: url, scope, nodeId, fileKey, +2 more.
list_pending_editsA
Show what's staged in the working copy: branch, base commit SHA, source description, and the full edit log. Returns null when no edits have been staged yet.
Inputs: no named parameters.
list_themesA
List the themes defined in the active token catalog (auto-fetched if needed). Each theme reports its enabled token sets so the agent can decide which one to apply. Pair with apply_theme to switch the file's active theme and (optionally) write resolved values to nodes.
Inputs: no named parameters.
list_tokensA
START HERE for any question about which design tokens a Figma frame uses. Cheap pre-flight: returns the unique Tokens Studio tokens applied anywhere in a subtree, grouped by property (fill, spacing, typography, …), with the layer names that use each value and a style-gap report at the bottom. Much smaller than get_metadata_with_tokens — call this first to decide whether you actually need the full tree. If the subtree relies on composition tokens the response surfaces a one-line hint so you don't get silent empty output; pass includeComposition=true to include them.
Inputs: url, depth, nodeId, fileKey, +3 more.
node_actionA
Run a structural action on nodes (by nodeIds / nodeId / current selection): delete, clone (with offset), select (+scroll into view), zoom, group, to-component (convert each node to a component), combine-variants (promote frames to components and combine into a component set — name them 'Prop=Value' first), append (move into parentId), or arrange (grid-layout the targets with gap/columns).
Inputs: action (required), gap, name, nodeId, +4 more.
propose_token_remapA
Plan a token remap for a Figma subtree against a NEW token set the user pasted as JSON. Read-only — does NOT touch the Figma file. Returns candidate new tokens (with scores + reasoning) for every old token currently applied in the subtree, plus an ambiguous list where the agent should pick. Pass the returned plan to apply_token_remap once you've resolved ambiguity. Accepts any reasonable shape for newTokens (Tokens Studio export, single-set object, DTCG, or a flat list of paths).
Inputs: newTokens (required), url, depth, hints, +3 more.
rename_tokenB
Stage a token rename. Moves a token from one path to another. By default also rewrites every other token's value reference from {from} to {to} so dependent tokens keep resolving — pass updateReferences: false to disable.
Inputs: to (required), from (required), set, updateReferences.
set_node_propertiesA
Edit properties on existing nodes (by nodeIds, single nodeId, or the current Figma selection when neither is given). Same property surface as create_node — fill, stroke, strokeWeight, cornerRadius, opacity, x/y/width/height, name, visible, locked, rotation, auto-layout props (layout/gap/padding/justify/items/sizing), constraints ({horizontal,vertical} = MIN|CENTER|MAX|STRETCH|SCALE), and text (characters, fontSize, fontFamily/fontStyle — fonts auto-loaded). Applies to every target node; returns per-node ok/error.
Inputs: props (required), nodeId, nodeIds.
set_tokenA
Stage a token write. Adds (or replaces) a token at path in the named set of the active catalog's working copy. Edit accumulates until you call commit_and_push. Use type to give Tokens Studio the correct token type (color / spacing / borderRadius / ...); we'll infer from value shape if omitted.
Inputs: set (required), path (required), value (required), type.
suggest_tokensA
Suggest tokens from the loaded catalog that fit a Figma node, ranked. Reads the node + nearby context (name, type, parent variant axes, tokens already applied to siblings) and scores every catalog token of compatible type. Returns the top N with reasoning per candidate. Use this when the design system's naming convention isn't obvious or when the user just says 'tokenize this' without spelling out paths.
Inputs: max, url, nodeId, fileKey, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 38 tools
Every tool has a clearly distinct purpose. Despite the large number of tools, each targets a specific operation (e.g., token CRUD, theme application, node manipulation, diagnostics) with no overlap in functionality. Descriptions clearly differentiate similar-sounding tools like apply_theme and apply_token_remap.
All tool names follow a consistent verb_noun pattern (e.g., analyze_design, apply_theme, set_token, delete_token). No mixing of conventions like camelCase or inconsistent verb forms. The pattern is predictable across all 38 tools.
38 tools is on the higher side, but the domain is complex (design tokens, Figma operations, version control, diagnostics). Some tools could be consolidated (e.g., multiple get_* tools for design context), but overall the count is reasonable for the scope. Borderline between slightly over and well-scoped.
The tool set covers CRUD for tokens, theme application, node manipulation, image/icon creation, accessibility audits, version control, and extensive diagnostics. Minor gaps like bulk token import from a file are covered indirectly (e.g., propose_token_remap). The set is nearly complete for the intended use case.
Maintenance
Related MCP Connectors
The Figma MCP server brings Figma design context directly into your AI workflow.
MCP server for StyleKit styles, tokens, recipes, lint and repair over stdio or HTTP.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Official Fibery MCP server: query and update your workspace from any AI client via OAuth.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol (MCP) server that enables Claude to create and manipulate designs in Figma through either a Figma plugin or directly via the Figma API.-
- AlicenseCqualityDmaintenanceA comprehensive MCP server that enables Claude to read, create, edit, and generate code from Figma designs. Supports design tokens, code generation to multiple frameworks, and accessibility checks.1004MIT
- AlicenseNot gradedqualityDmaintenanceRead-only Figma MCP server that enables design-to-code workflows by talking to the Figma REST API with a personal access token, for use with Claude Code and GitHub Copilot.3,040 npmMIT
- AlicenseAqualityDmaintenanceMCP server that gives LLMs deep knowledge of design systems and tokens, enabling intelligent design evolution, token analysis, and designer-to-developer handoffs.3713 npm2MIT