All skills
figma avatar

/figma-use

@1729207 official
by figmafigma/mcp-server-guide2k stars
194

**MANDATORY prerequisite** — you MUST invoke this skill BEFORE every `use_figma` tool call. NEVER call `use_figma` directly without loading this skill first. Skipping it causes common, hard-to-debug failures. Trigger whenever the user wants to perform a write action or a unique read action that requires JavaScript execution in the Figma file context — e.g. create/edit/delete nodes, set up variables or tokens, build components and variants, modify auto-layout or fills, bind variables to properties, or inspect file structure programmatically.

Use this Skill: https://skilld.dev/gh/figma/mcp-server-guide/figma-use

This session only. Nothing lands on disk.

referencesworking-with-design-systemswwds-text-styles.md

≈1.4k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Working with design systems: Text Styles

Text styles in Figma are named, reusable typography definitions. They are the closest equivalent to a type ramp in a design token library. A text style bundles font family, size, weight, line height, letter spacing, and other typographic properties into a single named entity that can be applied to text nodes.

Text styles are distinct from variables. You cannot put typography into a single variable — there is no composite variable type. However, individual properties on a text style can be bound to variables (e.g. binding fontSize to a size variable, or fontFamily to a string variable), which allows the style to participate in a token system.

Model

A TextStyle has the following writable properties:

Property Type Notes
name string Slash-delimited for grouping (e.g. "Heading/XL")
fontSize number In pixels
fontName FontName { family: string, style: string } — font must be loaded before setting
letterSpacing LetterSpacing { value: number, unit: 'PIXELS' | 'PERCENT' }
lineHeight LineHeight { value: number, unit: 'PIXELS' | 'PERCENT' } or { unit: 'AUTO' }
textCase TextCase 'ORIGINAL' | 'UPPER' | 'LOWER' | 'TITLE' | 'SMALL_CAPS'
textDecoration TextDecoration 'NONE' | 'UNDERLINE' | 'STRIKETHROUGH'
paragraphSpacing number
paragraphIndent number
description string Inherited from BaseStyleMixin

lineHeight and letterSpacing format

These properties must be objects — not bare numbers:

// WRONG — bare number throws
style.lineHeight = 1.5;
style.letterSpacing = 0;

// CORRECT
style.lineHeight = { unit: "AUTO" }; // auto line height
style.lineHeight = { value: 24, unit: "PIXELS" }; // fixed pixel height
style.lineHeight = { value: 150, unit: "PERCENT" }; // 150% line height

style.letterSpacing = { value: 0, unit: "PIXELS" }; // zero tracking
style.letterSpacing = { value: -2, unit: "PIXELS" }; // tight tracking
style.letterSpacing = { value: 5, unit: "PERCENT" }; // percent-based tracking

When reading a lineHeight back, always check unit first — { unit: 'AUTO' } has no value key.

Variable bindings on text styles

The following fields can be bound to variables via style.setBoundVariable(field, variable):

fontFamily, fontSize, fontStyle, fontWeight, letterSpacing, lineHeight, paragraphSpacing, paragraphIndent

To unbind: style.setBoundVariable(field, null)

Important: where possible, use setBoundVariable instead of raw values

const ts = figma.createTextStyle();
ts.fontSize = 24; // set directly; not bound to a variable

const ts = figma.createTextStyle();
ts.setBoundVariable("fontSize", fontSizeVariable); // preferred if the variable exists.

Applying a text style to a node

Once you have a TextStyle, apply it to a TextNode by assigning its id to the node's textStyleId property. You can also use the async setter setTextStyleIdAsync(id). Setting textStyleId on a node does not require the font to be loaded — only editing the text content or font properties directly does.

Looking up a library text style by key

When a text style is found via a search_design_system queries entry with entity: "style", pass the returned key directly into $fig.getStyle(styleKey) — the plan queues the library import automatically, no separate await figma.importStyleByKeyAsync(...) step required. The handle can then be applied via the textStyle property on any $fig.text(...) / $fig.query('TEXT').set(...) call.

const heading = $fig.getStyle(HEADING_TEXT_STYLE_KEY)
$fig.text({ characters: 'Title', textStyle: heading })

Common gotchas

  • Font must be loaded before setting fontName: Call await figma.loadFontAsync({ family, style }) before creating or modifying a text style's font.
  • Font style names are file-dependent: Font style names vary by font provider and Figma file. Always call await figma.listAvailableFontsAsync() to discover exact style strings before loading — never guess or probe with try/catch.
  • Styles are not automatically applied: Creating a TextStyle has no effect on any node until you assign its ID to a text node.
  • getLocalTextStyles() is deprecated: Always use getLocalTextStylesAsync().
  • Names are not unique: Two text styles can share the same name. Match by ID or key when looking up a known style, not by name alone.
  • Slash grouping is visual only: "Heading/XL" and "HeadingXL" are different names; the slash is just a UI affordance.
  • lineHeight and letterSpacing must be objects: style.lineHeight = 1.5 throws. Always use { value, unit } format or { unit: 'AUTO' }.

Code patterns

For runnable code examples (listing, creating, discovering available fonts, type ramps, applying styles), see text-style-patterns.md.

Source: SKILL.md on GitHub

No alerts8d4 checks · Risk SAFE
  • Gen Agent Trust Hub8d

    The skill provides comprehensive instructions and reference material for interacting with the Figma Plugin API. No security issues were detected.

  • Socket8d

    No alerts

  • Snyk8d

    Risk: LOW · No issues

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at 1729207. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated 2 weeks ago
disable-model-invocation
false
  • figma
  • plugin-api
  • design-systems
  • javascript
  • components
  • variables
  • auto-layout
  • tokens

README badge

README badge for figma/mcp-server-guide/figma-use

Loads prerequisites for the `use_figma` tool, which executes JavaScript in Figma files via the Plugin API. This skill teaches critical rules for font loading, text editing, auto-layout, pagination, async operations, and incremental work patterns that prevent hard-to-debug failures. Install this before any Figma programmatic task—creating or editing nodes, binding variables, building components, or inspecting file structure.

Generated from the current SKILL.md.

Do I need to load this skill before calling use_figma?
Yes. This skill is a mandatory prerequisite. You must load figma-use before every use_figma tool call and include it in the skillNames parameter, or the call will fail with hard-to-debug errors.
What kind of operations does this skill cover?
Write actions and unique read actions that require JavaScript execution in Figma files: creating/editing/deleting nodes, setting up variables and tokens, building components and variants, modifying auto-layout or fills, binding variables to properties, and inspecting file structure programmatically.
Can I use console.log() to debug my code?
No. console.log() output is not returned. Use return statements to send data back instead — return values are automatically JSON-serialized.
How do I switch to a different page in Figma?
Use await figma.setCurrentPageAsync(page) to switch pages and load their content. The synchronous setter figma.currentPage = page does not work and will throw an error.
What should I do if a use_figma call fails?
Stop and do not retry immediately. Failed scripts are atomic — no changes are made to the file. Read the error message carefully, fix the script, and retry.

Generated from the current SKILL.md. These answers refresh after source changes.