figma-context-mcp
Figma Context MCP
Expert guide for the Figma Context MCP (also known as Framelink). Teaches efficient API usage patterns that prevent 429 rate-limit lockouts.
Tools
| Tool | Purpose | API Tier |
|---|---|---|
get_figma_data |
Fetch file/node structure, layout, components | Tier 1 (most restricted) |
download_figma_images |
Export PNG/SVG renders of specific nodes | Tier 2-3 |
Critical: Rate Limits
Figma enforces per-plan rate limits. Limits apply based on the file owner's plan, not yours:
| Tier | Starter | Pro | Org |
|---|---|---|---|
| Tier 1 (files) | 10/min | 15/min | 20/min |
| Tier 2 (images) | 25/min | 50/min | 100/min |
| Tier 3 | 50/min | 100/min | 150/min |
View/Collab seats get only 6 Tier-1 calls/month. If accessing files owned by someone on a Starter/free plan, their limits apply to you.
429 lockouts can last 4-5 days. Prevention is essential.
Workflow: Metadata-First Pipeline
Never fetch everything upfront. Adopt this pipeline to keep most jobs under 2-3 API calls and <500 KB:
1. Start with a targeted node, not the whole file
When a user provides a Figma URL like figma.com/design/FILEKEY/Name?node-id=123-456, always extract and pass the nodeId. Never fetch the entire file when a specific node is available.
get_figma_data(fileKey="ABC123", nodeId="123-456", depth=2)
2. Use minimal depth
Always set depth to limit tree traversal:
- depth=1: Top-level frame only (layout structure, component names)
- depth=2: Frame + direct children (usually sufficient for code generation)
- depth=3: Maximum recommended — only when nested auto-layouts require it
Default if omitted: the API returns the ENTIRE subtree — often megabytes for complex frames with 50-200+ children. This is the #1 cause of 429 errors.
3. Analyze locally before fetching more
After receiving the initial response:
- Identify which child nodes actually need detail (skip hidden, decorative, or library-referenced nodes)
- Extract design tokens (colors, spacing, typography) directly from the response — no extra calls needed
- Build your component structure from what you already have
4. Fetch deeper nodes only if necessary
If a specific child node needs more detail, fetch just that node:
get_figma_data(fileKey="ABC123", nodeId="child-node-id", depth=1)
5. Download images last, in small batches
Only request images for the final deduplicated set of visual assets you actually need:
- Deduplicate by
imageRef— multiple nodes can reference the same fill image - Batch into groups of 5-10 nodes per call
- Use
pngScale=1unless the user specifically needs @2x/@3x assets
download_figma_images(
fileKey="ABC123",
nodes=[{nodeId: "1:2", fileName: "hero", ...}], # max 5-10 per call
localPath="./assets",
pngScale=1
)
When You Hit a 429
See references/rate-limit-recovery.md for diagnostics and recovery steps.
Quick checklist:
- Stop all Figma API calls immediately — additional calls extend the lockout
- Check if the file is owned by a Starter/free-plan user (limits are per-owner)
- If the user has a Pro/Org plan, suggest duplicating the file into their own workspace
- Wait for
Retry-Afterheader duration before retrying - When retrying, use the minimal-depth pipeline above
Common Patterns
Design-to-code (single component)
get_figma_datawith specificnodeId+depth=2(1 call)- Generate code from response — no image calls unless the component contains raster assets
- If images needed:
download_figma_imagesfor just the raster fills (1 call) - Total: 1-2 API calls
Design-to-code (full page)
get_figma_datawith pagenodeId+depth=1to get frame list (1 call)- Identify the 2-3 key frames that matter
get_figma_datafor each key frame withdepth=2(2-3 calls)- Extract tokens locally, download only unique raster assets (1 call)
- Total: 4-5 API calls
Extract design tokens only
get_figma_datawithnodeId+depth=2(1 call)- Parse colors, typography, spacing from the response — no image calls needed
- Total: 1 API call
Anti-Patterns
| Pattern | Problem | Fix |
|---|---|---|
Omitting depth |
Returns entire subtree (MB of data) | Always set depth=2 or less |
Omitting nodeId |
Fetches entire file | Always extract nodeId from URL |
| Downloading all images upfront | Bursts of image requests hit Tier 2 limits | Download only final deduplicated set |
| Retrying on 429 | Extends lockout duration | Stop, wait for Retry-After, then resume with minimal calls |
| Fetching library components | Remote library nodes trigger extra API calls | Use local component data from initial response |