figma-use
Prerequisite skill that must be loaded before any Figma plugin API write/read operations.
Install
mkdir -p .claude/skills/figma-use-victorios20 && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/15816" && unzip -o skill.zip -d .claude/skills/figma-use-victorios20 && rm skill.zipInstalls to .claude/skills/figma-use-victorios20
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
**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.Key capabilities
- →Execute JavaScript in Figma files via the Plugin API
- →Create, edit, or delete nodes in Figma
- →Set up variables or design tokens
- →Build components and variants
- →Modify auto-layout or fills
- →Inspect Figma file structure programmatically
How it works
The skill enables execution of JavaScript in Figma files through the Plugin API, providing a controlled environment for programmatic interaction with design elements.
Inputs & outputs
When to use figma-use
- →Prepare for figma api interaction
- →Configure figma plugin context
- →Set up design tokens
- →Edit figma components
About this skill
use_figma — Figma Plugin API Skill
Use use_figma MCP to execute JavaScript in Figma files via the Plugin API. All detailed reference docs live in references/.
Always pass skillNames: "figma-use" when calling use_figma. This is a logging parameter used to track skill usage — it does not affect execution.
If the task involves building or updating a full page, screen, or multi-section layout in Figma from code, also load figma-generate-design. It provides the workflow for discovering design system components via search_design_system, importing them, and assembling screens incrementally. Both skills work together: this one for the API rules, that one for the screen-building workflow.
Before anything, load plugin-api-standalone.index.md to understand what is possible. When you are asked to write plugin API code, use this context to grep plugin-api-standalone.d.ts for relevant types, methods, and properties. This is the definitive source of truth for the API surface. It is a large typings file, so do not load it all at once, grep for relevant sections as needed.
IMPORTANT: Whenever you work with design systems, start with working-with-design-systems/wwds.md to understand the key concepts, processes, and guidelines for working with design systems in Figma. Then load the more specific references for components, variables, text styles, and effect styles as needed.
1. Critical Rules
- Use
returnto send data back. The return value is JSON-serialized automatically (objects, arrays, strings, numbers). Do NOT callfigma.closePlugin()or wrap code in an async IIFE — this is handled for you. - Write plain JavaScript with top-level
awaitandreturn. Code is automatically wrapped in an async context. Do NOT wrap in(async () => { ... })(). figma.notify()throws "not implemented" — never use it 3a.getPluginData()/setPluginData()are not supported inuse_figma— do not use them. UsegetSharedPluginData()/setSharedPluginData()instead (these ARE supported), or track node IDs by returning them and passing them to subsequent calls.console.log()is NOT returned — usereturnfor output- Work incrementally in small steps. Break large operations into multiple
use_figmacalls. Validate after each step. This is the single most important practice for avoiding bugs. - Colors are 0–1 range (not 0–255):
{r: 1, g: 0, b: 0}= red - Fills/strokes are read-only arrays — clone, modify, reassign
- Font MUST be loaded before any text operation:
await figma.loadFontAsync({family, style}) - Pages load incrementally — use
await figma.setCurrentPageAsync(page)to switch pages and load their content (see Page Rules below) setBoundVariableForPaintreturns a NEW paint — must capture and reassigncreateVariableaccepts collection object or ID string (object preferred)layoutSizingHorizontal/Vertical = 'FILL'MUST be set AFTERparent.appendChild(child)— setting before append throws. Same applies to'HUG'on non-auto-layout nodes.- Position new top-level nodes away from (0,0). Nodes appended directly to the page default to (0,0). Scan
figma.currentPage.childrento find a clear position (e.g., to the right of the rightmost node). This only applies to page-level nodes — nodes nested inside other frames or auto-layout containers are positioned by their parent. See Gotchas. - On
use_figmaerror, STOP. Do NOT immediately retry. Failed scripts are atomic — if a script errors, it is not executed at all and no changes are made to the file. Read the error message carefully, fix the script, then retry. See Error Recovery. - MUST
returnALL created/mutated node IDs. Whenever a script creates new nodes or mutates existing ones on the canvas, collect every affected node ID and return them in a structured object (e.g.return { createdNodeIds: [...], mutatedNodeIds: [...] }). This is essential for subsequent calls to reference, validate, or clean up those nodes. - Always set
variable.scopesexplicitly when creating variables. The defaultALL_SCOPESpollutes every property picker — almost never what you want. Use specific scopes like["FRAME_FILL", "SHAPE_FILL"]for backgrounds,["TEXT_FILL"]for text colors,["GAP"]for spacing, etc. See variable-patterns.md for the full list. awaitevery Promise. Never leave a Promise unawaited — unawaited async calls (e.g.figma.loadFontAsync(...)withoutawait, orfigma.setCurrentPageAsync(page)withoutawait) will fire-and-forget, causing silent failures or race conditions. The script may return before the async operation completes, leading to missing data or half-applied changes.
For detailed WRONG/CORRECT examples of each rule, see Gotchas & Common Mistakes.
2. Page Rules (Critical)
Page context resets between use_figma calls — figma.currentPage starts on the first page each time.
Switching pages
Use await figma.setCurrentPageAsync(page) to switch pages and load their content. The sync setter figma.currentPage = page throws an error in use_figma runtimes.
// Switch to a specific page (loads its content)
const targetPage = figma.root.children.find((p) => p.name === "My Page");
await figma.setCurrentPageAsync(targetPage);
// targetPage.children is now populated
// Iterate over all pages
for (const page of figma.root.children) {
await figma.setCurrentPageAsync(page);
// page.children is now loaded — read or modify them here
}
Across script runs
figma.currentPage resets to the first page at the start of each use_figma call. If your workflow spans multiple calls and targets a non-default page, call await figma.setCurrentPageAsync(page) at the start of each invocation.
You can call use_figma multiple times to incrementally build on the file state, or to retrieve information before writing another script. For example, write a script to get metadata about existing nodes, return that data, then use it in a subsequent script to modify those nodes.
3. return Is Your Output Channel
The agent sees ONLY the value you return. Everything else is invisible.
- Returning IDs (CRITICAL): Every script that creates or mutates canvas nodes MUST return all affected node IDs — e.g.
return { createdNodeIds: [...], mutatedNodeIds: [...] }. This is a hard requirement, not optional. - Progress reporting:
return { createdNodeIds: [...], count: 5, errors: [] } - Error info: Thrown errors are automatically captured and returned — just let them propagate or
throwexplicitly. console.log()output is never returned to the agent- Always return actionable data (IDs, counts, status) so subsequent calls can reference created objects
4. Editor Mode
use_figma works in design mode (editorType "figma", the default). FigJam ("figjam") has a different set of available node types — most design nodes are blocked there.
Available in design mode: Rectangle, Frame, Component, Text, Ellipse, Star, Line, Vector, Polygon, BooleanOperation, Slice, Page, Section, TextPath.
Blocked in design mode: Sticky, Connector, ShapeWithText, CodeBlock, Slide, SlideRow, Webpage.
5. Incremental Workflow (How to Avoid Bugs)
The most common cause of bugs is trying to do too much in a single use_figma call. Work in small steps and validate after each one.
The pattern
- Inspect first. Before creating anything, run a read-only
use_figmato discover what already exists in the file — pages, components, variables, naming conventions. Match what's there. - Do one thing per call. Create variables in one call, create components in the next, compose layouts in another. Don't try to build an entire screen in one script.
- Return IDs from every call. Always
returncreated node IDs, variable IDs, collection IDs as objects (e.g.return { createdNodeIds: [...] }). You'll need these as inputs to subsequent calls. - Validate after each step. Use
get_metadatato verify structure (counts, names, hierarchy, positions). Useget_screenshotafter major milestones to catch visual issues. - Fix before moving on. If validation reveals a problem, fix it before proceeding to the next step. Don't build on a broken foundation.
Suggested step order for complex tasks
Step 1: Inspect file — discover existing pages, components, variables, conventions
Step 2: Create tokens/variables (if needed)
→ validate with get_metadata
Step 3: Create individual components
→ validate with get_metadata + get_screenshot
Step 4: Compose layouts from component instances
→ validate with get_screenshot
Step 5: Final verification
What to validate at each step
| After... | Check with get_metadata | Check with get_screenshot |
|---|---|---|
| Creating variables | Collection count, variable count, mode names | — |
| Creating components | Child count, variant names, property definitions | Variants visible, not collapsed, grid readable |
| Binding variables | Node properties reflect bindings | Colors/tokens resolved correctly |
| Composing layouts | Instance nodes have mainComponent, hierarchy correct | No cropped/clipped text, no overlapping elements, correct spacing |
6. Error Recovery & Self-Correction
use_figma is atomic — failed scripts do not execute. If a script errors, no changes are made to the file. The file remains in the same state as before the call. This means there are no partial nodes, no orphaned elements from the failed script, and retrying after a fix is safe.
When use_figma returns
Content truncated.
When not to use it
- →When calling `use_figma` directly without loading this skill first
- →When the task does not require JavaScript execution in the Figma file context
- →When the task involves building a full page, screen, or multi-section layout without `figma-generate-design`
Limitations
- →It requires `skillNames: "figma-use"` when calling `use_figma`
- →It does not support `figma.notify()` or `getPluginData()`/`setPluginData()`
- →Colors are in 0-1 range, not 0-255
How it compares
This skill provides a structured and rule-based approach to interacting with the Figma Plugin API, preventing common failures and ensuring proper execution, unlike direct, unguided API calls.
Compared to similar skills
figma-use side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| figma-use (this skill) | 0 | 4mo | No flags | Advanced |
| design-lab | 7 | 6mo | No flags | Intermediate |
| figma-use | 9 | 3mo | Review | Advanced |
| icon-lookup | 1 | 7mo | Review | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
design-lab
0xdesign
Conduct design interviews, generate five distinct UI variations in a temporary design lab, collect feedback, and produce implementation plans. Use when the user wants to explore UI design options, redesign existing components, or create new UI with multiple approaches to compare.
figma-use
dannote
Control Figma via CLI — create shapes, frames, text, components, set styles, layout, variables, export images. Use when asked to create/modify Figma designs or automate design tasks.
icon-lookup
malob
Workaround for Claude Code filtering BMP PUA Unicode (U+E000-U+F8FF). Supplementary PUA Nerd Font icons like (U+F0000+, e.g. nf-md-github, nf-md-kubernetes, nf-md-battery) can be written directly. BMP PUA icons (Powerline, Font Awesome, Devicons) require placeholder syntax like {{ U+E0A0 }} or {{ nf-fa-star }} (without spaces), which hooks auto-convert. Invoke when reading or writing Starship configs, tmux themes, shell prompts, or statuslines.
screenshots
sickn33
Generate marketing screenshots of your app using Playwright. Use when the user wants to create screenshots for Product Hunt, social media, landing pages, or documentation.
layout-pcb
Dogmeat88
Lay out an imported EasyEDA PCB before routing using the EasyEDA MCP server. Use when planning functional zones, placing footprints, orienting connectors, defining the board outline, and validating routing readiness on an already imported PCB. Assumes the PCB already exists and the schematic import
visual-evidence
bamr87
**WORKFLOW SKILL** — The standard for proving a UI/behavioural change works: a regression test + before/after visual evidence, attached to the PR and surfaced in release notes. USE FOR: any change under _sass/ _includes/ _layouts/ assets/ (or any user-visible behaviour); after a bug fix that changed