Use the use_figma tool to execute JavaScript in Figma files via the Plugin API. All detailed reference docs live in references/.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionfigma-useExecute the skills CLI command in your project's root directory to begin installation:
Fetches figma-use from figma/mcp-server-guide and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate figma-use. Access via /figma-use in your agent's command palette.
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 environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
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
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
Evaluate features using frameworks (RICE, ICE, Kano) and create prioritized backlogs
Example
Score 20 feature ideas using RICE framework, generate prioritized roadmap with rationale
0
total installs
0
this week
1.0K
GitHub stars
0
upvotes
Run in your terminal
0
installs
0
this week
1.0K
stars
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.
return to send data back. The return value is JSON-serialized automatically (objects, arrays, strings, numbers). Do NOT call figma.closePlugin() or wrap code in an async IIFE — this is handled for you.await and return. 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 in use_figma — do not use them. Use getSharedPluginData() / setSharedPluginData() instead (these ARE supported), or track node IDs by returning them and passing them to subsequent calls.console.log() is NOT returned — use return for outputuse_figma calls. Validate after each step. This is the single most important practice for avoiding bugs.{r: 1, g: 0, b: 0} = redawait figma.loadFontAsync({family, style}). Use await figma.listAvailableFontsAsync() to discover all available fonts and their exact style strings — if a loadFontAsync call fails, call listAvailableFontsAsync() to find the correct style name or pick a fallback.await figma.setCurrentPageAsync(page) to switch pages and load their content. The sync setter figma.currentPage = page does NOT work and will throw (see Page Rules below)setBoundVariableForPaint returns a NEW paint — must capture and reassigncreateVariable accepts collection object or ID string (object preferred)layoutSizingHorizontal/Vertical = 'FILL' MUST be set AFTER parent.appendChild(child) — setting before append throws. Same applies to 'HUG' on non-auto-layout nodes.figma.currentPage.children to 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.use_figma error, 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.return ALL 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.variable.scopes explicitly when creating variables. The default ALL_SCOPES pollutes 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.await every Promise. Never leave a Promise unawaited — unawaited async calls (e.g. figma.loadFontAsync(...) without await, or figma.setCurrentPageAsync(page) without await) 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.
Page context resets between use_figma calls — figma.currentPage starts on the first page each time.
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
}
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.
return Is Your Output ChannelThe agent sees ONLY the value you return. Everything else is invisible.
return { createdNodeIds: [...], mutatedNodeIds: [...] }. This is a hard requirement, not optional.return { createdNodeIds: [...], count: 5, errors: [] }throw explicitly.console.log() output is never returned to the agentuse_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.
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.
use_figma to discover what already exists in the file — pages, components, variables, naming conventions. Match what's there.return created node IDs, variable IDs, collection IDs as objects (e.g. return { createdNodeIds: [...] }). You'll need these as inputs to subsequent calls.get_metadata to verify structure (counts, names, hierarchy, positions). Use get_screenshot after major milestones to catch visual issues.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
| 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 |
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.
use_figma returns an errorget_metadata or get_screenshot to understand the current file state.| 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 |
get_metadata to check structural correctness (hierarchy, counts, positions).get_screenshot to check visual correctness. Look closely for cropped/clipped text (line heights cutting off content) and overlapping elements — these are common and easy to miss.For the full validation workflow, see Validation & Error Recovery.
Before submitting ANY use_figma call, verify:
return to send data back (NOT figma.closePlugin())return value includes structured data with actionable info (IDs, counts)figma.notify() anywhereconsole.log() as output (use return instead)await figma.setCurrentPageAsync(page) (sync setter figma.currentPage = page does NOT work)layoutSizingVertical/Horizontal = 'FILL' is set AFTER parent.appendChild(child)loadFontAsync() called BEFORE any text property changes (use listAvailableFontsAsync() to verify font availability if unsure)lineHeight/letterSpacing use {unit, value} format (not bare numbers)resize() is called BEFORE setting sizing modes (resize resets them to FIXED)return valueloadFontAsync, setCurrentPageAsync, importComponentByKeyAsync, etc.) is awaited — no fire-and-forget PromisesAlways 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.
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.join✓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
Steps
- 1Install product management skill
- 2Start with user story generation for known feature
- 3Progress to competitive analysis: research 2-3 competitors
- 4Use for roadmap prioritization: apply RICE/ICE scoring
- 5Draft stakeholder communications and refine based on feedback
- 6Build template library for recurring PM tasks
- 7Share 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
Related Skills
grill-me
704mattpocock/skills
Productivitysame categorypremortem
217parcadei/continuous-claude-v3
Productivitysame categorydeslop
163cursor/plugins
Productivitysame categorytravel-planner
144ailabs-393/ai-labs-claude-skills
Productivitysame categorynutritional-specialist
140ailabs-393/ai-labs-claude-skills
Productivitysame categoryframer-motion
138pproenca/dot-skills
Productivitysame categoryReviews
4.7★★★★★28 reviews- IIsabella Rahman★★★★★Dec 28, 2024
Registry listing for figma-use matched our evaluation — installs cleanly and behaves as described in the markdown.
- CChaitanya Patil★★★★★Dec 20, 2024
I recommend figma-use for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
- ZZara Chawla★★★★★Nov 27, 2024
figma-use has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ZZara Malhotra★★★★★Nov 19, 2024
Solid pick for teams standardizing on skills: figma-use is focused, and the summary matches what you get after install.
- PPiyush G★★★★★Nov 11, 2024
Useful defaults in figma-use — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
- MMin 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.
- IIshan Singh★★★★★Oct 10, 2024
We added figma-use from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- SShikha Mishra★★★★★Oct 2, 2024
figma-use is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
- RRahul 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.
- DDaniel 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 / 3Discussion
Comments — not star reviews- No comments yet — start the thread.