Skip to main content
Glama
kicholiz

Figma Write Bridge MCP

by kicholiz

find_nodes

Query Figma document nodes using optional ANDed predicates evaluated inside Figma, returning matching rows as a columnar table for auditing, paging, and design-system checks.

Instructions

Query the document for nodes matching a set of predicates, evaluated inside Figma so only matching rows come back (use this instead of reading a whole subtree and filtering). All predicates are optional and are ANDed together. Returns a columnar table: fields names the columns, rows holds one array per match, plus scanned/total/truncated counts. Examples: {types:["INSTANCE"], mainComponentName:"Button", fillHex:"#ff0000"} finds red button instances; {missingFillStyle:true} finds hardcoded fills with no style or variable bound (design-system drift); {types:["INSTANCE"], hasOverrides:true} finds overridden instances.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNoGlob against the node name: * and ? wildcards, anchored (e.g. "Button/*").
limitNoMax matches to return. Default 200, cap 1000.
typesNoNode types to match, e.g. ["INSTANCE","TEXT"].
fieldsNoExtra per-match columns: fillHex, characters, boundVariableIds, or any node property (e.g. opacity).
offsetNoSkip this many matches, for paging.
fillHexNoMatch nodes with a SOLID fill of this hex, e.g. "#ff0000".
verboseNoReturn an array of objects instead of the columnar fields/rows table.
visibleNoFilter by visibility.
allPagesNoSearch every page. Default false (current page only).
matchCaseNoCase-sensitive name/text matching. Default false.
nameRegexNoRegex against the node name (unanchored). Use instead of name for complex patterns.
layoutModeNoMatch auto-layout mode: NONE, HORIZONTAL, VERTICAL, or GRID.
rootNodeIdNoRestrict to this node's subtree (any page). When set, allPages is ignored.
fillStyleIdNoMatch nodes using this paint style id.
textStyleIdNoMatch nodes using this text style id.
hasOverridesNoInstances only: true = has overrides, false = clean. Implies types:["INSTANCE"].
textContainsNoSubstring of a TEXT node's characters. Implies types:["TEXT"].
fillToleranceNo0-1 RGB distance allowed around fillHex. Default 0 (exact). ~0.1 catches near shades.
boundVariableIdNoMatch nodes bound to this specific variable id.
hasBoundVariableNotrue = nodes with any bound variable; false = nodes with none.
missingFillStyleNotrue = nodes with a solid fill but no paint style and no bound variable (hardcoded colors); false = the inverse.
mainComponentNameNoInstances only: substring of the main component's name. Implies types:["INSTANCE"].

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

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 full burden and does so well: it discloses in-engine evaluation, that all predicates are optional and ANDed, the columnar return shape (fields/rows plus scanned/total/truncated counts), and implicit type constraints. It does not cover permissions, error behavior, or performance limits, so it falls just short of complete.

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 purpose and the anti-pattern it replaces, followed by predicate semantics and then worked examples. Efficient, though the example block is dense; every element still earns its place by illustrating the predicate system.

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 22-parameter, no-required, annotation-less query tool, the description supplies the execution model, combination semantics, and return format (including truncation counts) that no other field provides. A reader has enough to call it correctly; only edge-case/error behavior is absent.

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 real meaning beyond the schema: it explains AND-combination semantics and shows how individual predicates (mainComponentName, fillHex, missingFillStyle, hasOverrides) compose into queries, including the design-system-drift use case.

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+resource (query the document for nodes matching predicates) and its execution model (evaluated inside Figma so only matching rows return). It also distinguishes itself from the read-subtree-and-filter approach used by siblings like get_document_tree, so the agent can tell them apart.

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?

Explicitly says 'use this instead of reading a whole subtree and filtering,' naming the alternative pattern being replaced. Three concrete examples map conditions (red button instances, hardcoded fills/design-system drift, overridden instances) to predicate combinations, leaving no ambiguity about when to reach for it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools