figma-use▌
figma/mcp-server-guide · updated Apr 8, 2026
MDX-style export adds YAML metadata + attribution linking explainx.ai and this canonical listing URL.
Use the use_figma tool to execute JavaScript in Figma files via the Plugin API. All detailed reference docs live in references/.
use_figma — Figma Plugin API Skill
Use the use_figma tool 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}). Useawait figma.listAvailableFontsAsync()to discover all available fonts and their exact style strings — if aloadFontAsynccall fails, calllistAvailableFontsAsync()to find the correct style name or pick a fallback. - Pages load incrementally — use
await figma.setCurrentPageAsync(page)to switch pages and load their content. The sync setterfigma.currentPage = pagedoes NOT work and will throw (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 does NOT work — it throws "Setting figma.currentPage is not supported" in use_figma. Always use the async method.
// 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 an error
- STOP. Do not immediately fix the code and retry.
- Read the error message carefully. Understand exactly what went wrong — wrong API usage, missing font, invalid property value, etc.
- If the error is unclear, call
get_metadataorget_screenshotto understand the current file state. - Fix the script based on the error message.
- Retry the corrected script.
Common self-correction patterns
| Error message | Likely cause | How to fix |
|---|---|---|
"not implemented" |
Used figma.notify() |
Remove it — use return for output |
"node must be an auto-layout frame..." |
Set FILL/HUG before appending to auto-layout parent |
Move appendChild before layoutSizingX = 'FILL' |
"Setting figma.currentPage is not supported" |
Used sync page setter (figma.currentPage = page) which does NOT work |
Use await figma.setCurrentPageAsync(page) — the only way to switch pages |
| Property value out of range | Color channel > 1 (used 0–255 instead of 0–1) | Divide by 255 |
"Cannot read properties of null" |
Node doesn't exist (wrong ID, wrong page) | Check page context, verify ID |
| Script hangs / no response | Infinite loop or unresolved promise | Check for while(true) or missing await; ensure code terminates |
"The node with id X does not exist" |
Parent instance was implicitly detached by a child detachInstance(), changing IDs |
Re-discover nodes by traversal from a stable (non-instance) parent frame |
When the script succeeds but the result looks wrong
- Call
get_metadatato check structural correctness (hierarchy, counts, positions). - Call
get_screenshotto check visual correctness. Look closely for cropped/clipped text (line heights cutting off content) and overlapping elements — these are common and easy to miss. - Identify the discrepancy — is it structural (wrong hierarchy, missing nodes) or visual (wrong colors, broken layout, clipped content)?
- Write a targeted fix script that modifies only the broken parts — don't recreate everything.
For the full validation workflow, see Validation & Error Recovery.
7. Pre-Flight Checklist
Before submitting ANY use_figma call, verify:
- Code uses
returnto send data back (NOTfigma.closePlugin()) - Code is NOT wrapped in an async IIFE (auto-wrapped for you)
-
returnvalue includes structured data with actionable info (IDs, counts) - NO usage of
figma.notify()anywhere - NO usage of
console.log()as output (usereturninstead) - All colors use 0–1 range (not 0–255)
- Fills/strokes are reassigned as new arrays (not mutated in place)
- Page switches use
await figma.setCurrentPageAsync(page)(sync setterfigma.currentPage = pagedoes NOT work) -
layoutSizingVertical/Horizontal = 'FILL'is set AFTERparent.appendChild(child) -
loadFontAsync()called BEFORE any text property changes (uselistAvailableFontsAsync()to verify font availability if unsure) -
lineHeight/letterSpacinguse{unit, value}format (not bare numbers) -
resize()is called BEFORE setting sizing modes (resize resets them to FIXED) - For multi-step workflows: IDs from previous calls are passed as string literals (not variables)
- New top-level nodes are positioned away from (0,0) to avoid overlapping existing content
- ALL created/mutated node IDs are collected and included in the
returnvalue - Every async call (
loadFontAsync,setCurrentPageAsync,importComponentByKeyAsync, etc.) isawaited — no fire-and-forget Promises
8. Discover Conventions Before Creating
Always inspect the Figma file before creating anything. Different files use different naming conventions, variable structures, and component patterns. Your code should match what's already there, not impose new conventions.
When in doubt about any convention (naming, scoping, structure), check the Figma file first, then the user's codebase. Only fall back to common patterns when neither exists.
Quick inspection scripts
List all pages and top-level nodes:
const pages = figma.root.children.map(p => `${p.name} id=${p.id} children=${p.children.length}`);
return pages.joinhow to use figma-useHow to use figma-use on Cursor
AI-first code editor with Composer
1Prerequisites
Before installing skills in Cursor, ensure your development environment meets these requirements:
- ›Cursor installed and configured on your development machine
- ›Node.js version 16.0+ with npm package manager (verify with
node --version) - ›Active project directory or workspace where you want to add figma-use
2Execute installation command
Execute the skills CLI command in your project's root directory to begin installation:
$npx skills add https://github.com/figma/mcp-server-guide --skill figma-useThe skills CLI fetches figma-use from GitHub repository figma/mcp-server-guide and configures it for Cursor.
3Select Cursor when prompted
The CLI will show a list of available agents. Use arrow keys to navigate and space to select Cursor:
◆ Which agents do you want to install to?││ ── Universal (.agents/skills) ── always included ────│ • Amp│ • Antigravity│ • Cline│ • Codex│ ●Cursor(selected)│ • Cursor│ • Windsurf4Verify installation
Confirm successful installation by checking the skill directory location:
.cursor/skills/figma-useReload or restart Cursor to activate figma-use. Access the skill through slash commands (e.g., /figma-use) or your agent's skill management interface.
⚠Security & Verification Notice
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your development environment. Always verify the publisher's identity, review recent commits, and test in isolated environments before production deployment.
Additional Resources
List & Monetize Your Skill
Submit your Claude Code skill and start earning
GET_STARTED →Use Cases▌
User Story & Requirements Generation
Create detailed user stories, acceptance criteria, and feature specs
Example
Generate user stories for 'password reset feature' with acceptance criteria, edge cases, and test scenarios
✓Reduce spec writing time by 50%, ensure comprehensive coverage
Competitive Analysis
Research competitors, compare features, identify gaps
Example
Analyze 5 competitor products, create feature comparison matrix, suggest differentiation opportunities
✓Complete competitive research in 2 hours instead of 2 days
Roadmap Prioritization
Evaluate features using frameworks (RICE, ICE, Kano) and create prioritized backlogs
Example
Score 20 feature ideas using RICE framework, generate prioritized roadmap with rationale
✓Make data-driven prioritization decisions faster
Stakeholder Communication
Draft PRDs, status updates, and stakeholder presentations
Example
Create executive summary of Q3 roadmap, monthly progress report, feature launch announcement
✓Save 3-5 hours/week on communication overhead
Implementation Guide▌
Prerequisites
- ›Claude Desktop or compatible AI client
- ›Access to product documentation and roadmap tools (Jira, Notion, etc.)
- ›Understanding of product management frameworks (RICE, Jobs-to-be-Done, etc.)
- ›Stakeholder contact information and communication channels
Time Estimate
30-60 minutes to see productivity improvements
Installation Steps
- 1.Install product management skill
- 2.Start with user story generation for known feature
- 3.Progress to competitive analysis: research 2-3 competitors
- 4.Use for roadmap prioritization: apply RICE/ICE scoring
- 5.Draft stakeholder communications and refine based on feedback
- 6.Build template library for recurring PM tasks
- 7.Share effective prompts with product team
Common Pitfalls
- ⚠Not validating competitive research—verify facts before sharing
- ⚠Accepting user stories without involving engineering team
- ⚠Over-relying on frameworks without qualitative judgment
- ⚠Not customizing outputs to company culture and communication style
- ⚠Skipping stakeholder validation of generated requirements
Best Practices▌
✓ Do
- +Validate research and competitive analysis with real data
- +Collaborate with engineering when generating technical requirements
- +Customize frameworks and templates to your company context
- +Use skill for first drafts, refine with stakeholder input
- +Document successful prompt patterns for PM tasks
- +Combine AI efficiency with human judgment and intuition
✗ Don't
- −Don't publish competitive analysis without fact-checking
- −Don't finalize user stories without engineering review
- −Don't make prioritization decisions solely on AI scoring
- −Don't skip customer validation of generated requirements
- −Don't ignore company-specific context and culture
💡 Pro Tips
- ★Provide context: company goals, constraints, customer feedback
- ★Ask for alternatives: 'Show 3 ways to prioritize this roadmap'
- ★Request stakeholder-specific formatting: 'Executive summary vs. engineering spec'
- ★Use skill for 70% generation + 30% customization to company needs
When to Use This▌
✓ Use When
Use for user story writing, competitive research, roadmap prioritization, stakeholder communication, and PRD drafting. Best for reducing repetitive documentation and research work.
✗ Avoid When
Avoid for strategic product vision (requires deep customer empathy), pricing decisions (needs market and financial expertise), or when face-to-face customer discovery is more valuable than speed.
Learning Path▌
- 1Basic: user stories, feature specs, status updates
- 2Intermediate: competitive analysis, prioritization frameworks, PRDs
- 3Advanced: product strategy, go-to-market planning, OKR setting
- 4Expert: product vision, market positioning, business model innovation
Discussion
Product Hunt–style comments (not star reviews)- No comments yet — start the thread.
general reviewsRatings
4.7★★★★★28 reviews- ★★★★★Isabella Rahman· Dec 28, 2024
Registry listing for figma-use matched our evaluation — installs cleanly and behaves as described in the markdown.
- ★★★★★Chaitanya Patil· Dec 20, 2024
I recommend figma-use for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
- ★★★★★Zara Chawla· Nov 27, 2024
figma-use has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Zara Malhotra· Nov 19, 2024
Solid pick for teams standardizing on skills: figma-use is focused, and the summary matches what you get after install.
- ★★★★★Piyush G· Nov 11, 2024
Useful defaults in figma-use — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
- ★★★★★Min Rao· Oct 18, 2024
Keeps context tight: figma-use is the kind of skill you can hand to a new teammate without a long onboarding doc.
- ★★★★★Ishan Singh· Oct 10, 2024
We added figma-use from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Shikha Mishra· Oct 2, 2024
figma-use is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
- ★★★★★Rahul Santra· Sep 9, 2024
Keeps context tight: figma-use is the kind of skill you can hand to a new teammate without a long onboarding doc.
- ★★★★★Daniel Wang· Sep 5, 2024
Registry listing for figma-use matched our evaluation — installs cleanly and behaves as described in the markdown.
showing 1-10 of 28
1 / 3