figma-rest-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FIGMA_TEAM_ID | No | Optional Figma team ID used for listing projects and project files. | |
| FIGMA_ACCESS_TOKEN | Yes | Your Figma personal access token (required for all API calls). | |
| FIGMA_BRIDGE_TOKEN | No | Shared token for the optional write bridge when enabled. | |
| FIGMA_ENABLE_WRITE_BRIDGE | No | Set to enable the optional write bridge (e.g., '1'). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| whoamiA | GET /v1/me — the user that owns FIGMA_ACCESS_TOKEN. Does not include team_id; pass a team URL or id to list_projects (or set FIGMA_TEAM_ID). |
| get_fileB | GET /v1/files/{key} — file JSON. depth defaults to 2. mode=trim|summary|full shrinks node payloads (see README). |
| get_nodesB | GET /v1/files/{key}/nodes?ids=... — specific nodes by id. Supports mode=trim|summary|full. |
| get_design_context_liteA | REST-only codegen snapshot for a subtree: identity, bbox, best-effort CSS flex from auto-layout, text + typography, fill/stroke summaries, component/instance ids. Optional include_tokens attaches a compact token summary (variables or labeled fallback). Not official MCP get_design_context. Image fills are refs — use get_images or bundle_image_fills for pixels. |
| get_imagesA | GET /v1/images/{key}?ids=&format= — render nodes to short-lived image URLs (png default). Distinct from get_image_fills (uploaded fill assets). |
| get_image_fillsA | GET /v1/files/{key}/images — download URLs for images already uploaded as fills (imageRef). Not a node render; use get_images to rasterize frames. |
| bundle_image_fillsA | Design-to-code helper: GET /v1/files/{key}/images then download each fill (Figma/S3 hosts only). Returns imageRef → { contentType, byteLength, dataUri }. Skips assets over max_bytes (default 250KB). Not canvas mutation. |
| render_nodes_as_data_uriA | GET /v1/images/{key} then download renders (Figma/S3 only) as data URIs. Same size/SSRF caps as bundle_image_fills. For design-to-code, not writing back to Figma. |
| get_file_metaA | GET /v1/files/{key}/meta — lightweight file metadata (name, folder, thumbnail, role). Scope: file_metadata:read. |
| get_file_versionsA | GET /v1/files/{key}/versions — version history. Auto-follows pagination.next_page. Scope: file_versions:read. |
| list_projectsA | GET /v1/teams/{team_id}/projects — projects visible to the PAT. Pass team (id or team URL) or set FIGMA_TEAM_ID. Scope: projects:read. |
| list_project_filesA | GET /v1/projects/{project_id}/files — files in a project. Scope: projects:read. |
| get_commentsA | GET /v1/files/{key}/comments — Figma returns the full comment list (not cursor-paginated). Optional as_md. |
| post_commentA | POST /v1/files/{key}/comments — add a comment or reply (comment_id of a root comment). Scope: file_comments:write. |
| delete_commentA | DELETE /v1/files/{key}/comments/{comment_id} — only the author can delete. Scope: file_comments:write. |
| get_comment_reactionsC | GET /v1/files/{key}/comments/{comment_id}/reactions — auto-follows pagination.next_page. |
| post_comment_reactionB | POST /v1/files/{key}/comments/{comment_id}/reactions — emoji shortcode such as :heart: or :+1:. |
| delete_comment_reactionA | DELETE /v1/files/{key}/comments/{comment_id}/reactions?emoji= — only the author can delete. |
| get_file_componentsB | GET /v1/files/{key}/components — published components in a file library. Scope: library_content:read. |
| get_file_component_setsB | GET /v1/files/{key}/component_sets — published component sets in a file library. |
| get_file_stylesB | GET /v1/files/{key}/styles — published styles in a file library. Scope: library_content:read. |
| get_team_componentsA | GET /v1/teams/{team_id}/components — published team library components. Auto-paginates meta.cursor.after. Scope: team_library_content:read. |
| get_team_component_setsA | GET /v1/teams/{team_id}/component_sets — published team library component sets. Auto-paginates meta.cursor.after. Scope: team_library_content:read. |
| get_team_stylesA | GET /v1/teams/{team_id}/styles — published team library styles. Auto-paginates meta.cursor.after. Scope: team_library_content:read. |
| get_componentA | GET /v1/components/{key} — metadata for a published component key (library key, not a file key). Scope: library_assets:read. |
| get_styleA | GET /v1/styles/{key} — metadata for a published style key (library key, not a file key). Scope: library_assets:read. |
| find_nodesA | Utility (not a REST endpoint): fetch a file tree then return only { id, name, type, absoluteBoundingBox, parentId } matches. Requires name and/or type. Prefer this over dumping get_file to locate a frame. |
| extract_textB | Utility: walk TEXT nodes and return { id, name, characters, parentId } copy. Default depth 8. |
| get_local_variablesA | GET /v1/files/{key}/variables/local — raw REST (local + consumed remote). Enterprise + file_variables:read. Prefer get_variable_defs for codegen shape and automatic fallback. |
| get_published_variablesA | GET /v1/files/{key}/variables/published — raw REST published names (no valuesByMode). Enterprise + file_variables:read. Prefer get_variable_defs. |
| get_variable_defsA | Preferred token path (REST, not official Desktop get_variable_defs). Tries local Figma variables first (Enterprise + file_variables:read), shapes { collections, modes, variables: [{ id, name, resolvedType, valuesByMode, scopes }] }, resolves aliases one level. If variables 403/empty and fallback is on (default), uses file styles + inferred subtree tokens labeled inferred: true. Pass node_id so fallback can resolve style usage and infer colors/type/radii/spacing. |
| get_design_tokens_fallbackA | Skip the variables API. Build labeled tokens from file styles (library_content:read) plus optional inferred fills/type/radii/spacing from a subtree. Every inferred token has inferred: true — not real Figma variables. |
| get_dev_resourcesA | GET /v1/files/{key}/dev_resources — Dev Mode links on nodes. Scope: file_dev_resources:read. |
| create_dev_resourcesC | POST /v1/dev_resources — attach a Dev Mode URL to a node. Scope: file_dev_resources:write. |
| update_dev_resourcesA | PUT /v1/dev_resources — update name/url by dev resource id. Scope: file_dev_resources:write. |
| delete_dev_resourceA | DELETE /v1/files/{key}/dev_resources/{id}. Scope: file_dev_resources:write. |
| list_webhooksA | GET /v2/webhooks — list Webhooks v2 for a context (team/project/file) or plan_api_id. Auto-paginates next_page. Scope: webhooks:read. 403 usually means missing scope or plan without webhooks. |
| get_webhookA | GET /v2/webhooks/{id}. Scope: webhooks:read. Passcode is redacted by Figma. |
| create_webhookA | POST /v2/webhooks — Figma sends a PING on create unless status=PAUSED. Scope: webhooks:write. Requires passcode for endpoint verification. |
| update_webhookB | PUT /v2/webhooks/{id}. Scope: webhooks:write. Empty description deletes it. |
| delete_webhookA | DELETE /v2/webhooks/{id} — irreversible. Scope: webhooks:write. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 41 tools
Most tools target a unique resource and action, and descriptions explicitly cross-reference sibling functions (get_images vs get_image_fills, get_variable_defs vs fallbacks). However, the variable/token helpers and design-to-code utilities overlap closely enough that an agent could still pick the wrong one without careful attention.
The majority use snake_case verb_noun names, but conventions are mixed: list_projects vs get_team_components, post_comment vs create_dev_resources, singular/plural dev_resource(s), plus non-standard utility names like whoami, find_nodes, extract_text, and suffix-based helpers (_lite, _fallback).
41 tools is well beyond the comfortable range and spans many subdomains such as files, nodes, images, comments, libraries, variables, dev resources, and webhooks. This would be more manageable as several focused MCP servers.
The server covers the major Figma REST surface: file/project/team reads, node inspection, rendering, images, comments/reactions, component/style libraries, variables, dev resources, and webhook CRUD. Mutation-capable resources have read/write/update/delete covered, so agents are unlikely to hit dead ends.