Brings Figma's REST API into your AI workflow so you can analyze design files, list components, export assets, and manage comments through natural language. Runs as a long-running web server on Apify or locally, exposing an MCP JSON-RPC endpoint at /mcp. Supports both personal access tokens and OAuth 2.0 for team access. Ships with MCP resources for browsing files and prompts for common design workflows. Reach for this when you want Claude or Cursor to pull design structure, export nodes as PNG/SVG, or automate documentation tasks without opening Figma's UI. The OAuth flow requires a real browser for token exchange, and container URLs change per Apify run.
Public tool metadata for what this MCP can expose to an agent.
figma_get_meGet the current userGet the current user
No parameter schema in public metadata yet.
figma_get_fileGet a Figma file by key7 paramsGet a Figma file by key
idsstringdepthnumberfileKeystringversionstringgeometrystringbranch_databooleanplugin_datastringfigma_get_file_nodesGet specific nodes from a Figma file6 paramsGet specific nodes from a Figma file
idsstringdepthnumberfileKeystringversionstringgeometrystringplugin_datastringfigma_get_imagesRender images from a Figma file11 paramsRender images from a Figma file
idsstringscalenumberformatstringjpg · png · svg · pdffileKeystringversionstringcontents_onlybooleansvg_include_idbooleansvg_outline_textbooleansvg_include_node_idbooleansvg_simplify_strokebooleanuse_absolute_boundsbooleanfigma_get_image_fillsGet image fills in a Figma file1 paramsGet image fills in a Figma file
fileKeystringfigma_get_file_versionsGet version history of a Figma file4 paramsGet version history of a Figma file
afternumberbeforenumberfileKeystringpage_sizenumberfigma_get_commentsGet comments in a Figma file2 paramsGet comments in a Figma file
as_mdbooleanfileKeystringfigma_post_commentAdd a comment to a Figma file4 paramsAdd a comment to a Figma file
fileKeystringmessagestringcomment_idstringclient_metavaluefigma_delete_commentDelete a comment from a Figma file2 paramsDelete a comment from a Figma file
fileKeystringcommentIdstringfigma_get_comment_reactionsGet reactions for a comment3 paramsGet reactions for a comment
cursorstringfileKeystringcommentIdstringfigma_post_comment_reactionAdd a reaction to a comment3 paramsAdd a reaction to a comment
emojistringfileKeystringcommentIdstringfigma_delete_comment_reactionDelete a reaction from a comment3 paramsDelete a reaction from a comment
emojistringfileKeystringcommentIdstringfigma_get_team_projectsGet projects in a team1 paramsGet projects in a team
teamIdstringfigma_get_project_filesGet files in a project2 paramsGet files in a project
projectIdstringbranch_databooleanfigma_get_team_componentsGet components in a team4 paramsGet components in a team
afternumberbeforenumberteamIdstringpage_sizenumberfigma_get_file_componentsGet components in a file1 paramsGet components in a file
fileKeystringfigma_get_componentGet a component by key1 paramsGet a component by key
keystringfigma_get_team_component_setsGet component sets in a team4 paramsGet component sets in a team
afternumberbeforenumberteamIdstringpage_sizenumberfigma_get_file_component_setsGet component sets in a file1 paramsGet component sets in a file
fileKeystringfigma_get_component_setGet a component set by key1 paramsGet a component set by key
keystringfigma_get_team_stylesGet styles in a team4 paramsGet styles in a team
afternumberbeforenumberteamIdstringpage_sizenumberfigma_get_file_stylesGet styles in a file1 paramsGet styles in a file
fileKeystringfigma_get_styleGet a style by key1 paramsGet a style by key
keystringfigma_post_webhookCreate a webhook6 paramsCreate a webhook
statusstringteam_idstringendpointstringpasscodestringevent_typestringdescriptionstringfigma_get_webhookGet a webhook by ID1 paramsGet a webhook by ID
webhook_idstringfigma_update_webhookUpdate a webhook5 paramsUpdate a webhook
statusstringendpointstringpasscodestringwebhook_idstringdescriptionstringfigma_delete_webhookDelete a webhook1 paramsDelete a webhook
webhook_idstringfigma_get_team_webhooksGet webhooks for a team1 paramsGet webhooks for a team
team_idstringfigma_get_library_analytics_component_usagesGet library analytics component usage data3 paramsGet library analytics component usage data
cursorstringfileKeystringgroup_bystringcomponent · filefigma_get_library_analytics_style_usagesGet library analytics style usage data3 paramsGet library analytics style usage data
cursorstringfileKeystringgroup_bystringstyle · filefigma_get_library_analytics_variable_usagesGet library analytics variable usage data3 paramsGet library analytics variable usage data
cursorstringfileKeystringgroup_bystringvariable · fileModel Context Protocol (MCP) server that exposes Figma REST API capabilities to AI assistants (Cursor, Claude, custom agents). Runs as a long-running web server on the Apify platform (standby / container URL) or locally via apify run.
Recommended for solo use. Set figmaAccessToken in Actor input (or FIGMA_ACCESS_TOKEN in env).
X-Figma-Token/oauth/* routes return an error).Use when you omit figmaAccessToken and provide a Figma OAuth app:
| Input | Purpose |
|---|---|
oauthClientId | From Figma → Developers → Apps |
oauthClientSecret | Same app |
oauthRedirectUri | Exact redirect URL registered on the app, e.g. https://<your-run>.runs.apify.net/oauth/callback |
oauthScopes | Optional; comma-separated scopes. Must be a subset of the app’s configured scopes. Defaults include file_content:read, file_content:write, file_comments:read, file_comments:write. |
Flow
GET https://<container-url>/oauth/authorize in a browser (normal browser — not an embedded WebView; Figma requirement)./oauth/callback; tokens are stored in the run’s default key-value store (FIGMA_OAUTH_SESSION) and refreshed when near expiry.Token exchange uses Figma’s documented endpoints (https://api.figma.com/v1/oauth/token and .../oauth/refresh). Codes expire quickly — complete the redirect promptly.
npm install
apify login
apify push
In Apify Console, open the Actor, set input (at minimum figmaAccessToken), start with web server / long-running as required by your template, then use the Container URL from the run.
Deploy reference: apify push builds and publishes; see Apify CLI.
| Parameter | Type | Default | Description |
|---|---|---|---|
figmaAccessToken | string | — | PAT (recommended). If set, used for all Figma API calls. |
port | integer | 8080 | HTTP listen port (Apify may override via web_server_port). |
oauthClientId | string | — | OAuth app client ID (only if not using PAT). |
oauthClientSecret | string | — | OAuth app secret (secret input). |
oauthRedirectUri | string | — | Must match Figma app redirect URI exactly. |
oauthScopes | string | — | Optional scope override (comma-separated). |
maxConcurrentRequests | integer | 10 | Reserved / future use. |
enableCaching | boolean | true | Cache GET responses from Figma. |
Local / CLI input file example (apify run):
{
"figmaAccessToken": "figd_...",
"port": 8080
}
| Method | Path | Description |
|---|---|---|
GET | / | Service info and endpoint list |
GET | /health | Liveness; includes auth_mode: pat | oauth | pending_oauth, figma_authenticated |
POST | /mcp | MCP JSON-RPC 2.0 (primary transport for this server) |
GET | /oauth/authorize | Start OAuth (browser); disabled if PAT is set |
GET | /oauth/callback | OAuth redirect handler |
Apify MCP path: .actor/actor.json sets webServerMcpPath to /mcp. Your MCP client URL is typically:
https://<container-id>.runs.apify.net/mcp
(Use the Container URL from the run page + /mcp.)
~/.cursor/mcp.json (paths differ on Windows/Linux — see Cursor docs).Example (remote HTTP MCP — adjust to your Cursor version’s expected shape):
{
"mcpServers": {
"figma-mcp-standby": {
"url": "https://YOUR_RUN_ID.runs.apify.net/mcp"
}
}
}
Notes
env.APIFY_TOKEN in mcp.json is not passed to this Node process; it does not replace Figma auth. Use figmaAccessToken (or OAuth) in Actor input.mcp.json and restart Cursor after a new run.curl https://.../health.Use your client’s supported way to attach a remote MCP URL (e.g. mcp-remote pointing at https://.../mcp). Paths and query params depend on the client version.
npm install
apify run
Or run the entry with Node if you inject env / input yourself:
export FIGMA_ACCESS_TOKEN="figd_..."
node src/main.js
Check health (port from logs or input):
curl -s http://localhost:8080/health | jq .
Sample MCP initialize:
curl -s -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
figma_mcp_actor/
├── .actor/
│ ├── actor.json # Apify Actor metadata (incl. webServerMcpPath: /mcp)
│ ├── input_schema.json
│ ├── output_schema.json
│ └── dataset_schema.json
├── src/
│ ├── main.js # Express app, /mcp, /oauth/*, Apify bootstrap
│ ├── figma/
│ │ ├── auth.js # PAT + OAuth token exchange, refresh, KV hook
│ │ └── client.js # Figma REST wrapper
│ ├── oauth/
│ │ └── persist.js # Apify KV: FIGMA_OAUTH_SESSION
│ ├── mcp/ # Protocol, handlers, server
│ ├── tools/
│ ├── resources/
│ └── prompts/
├── Dockerfile
├── package.json
└── README.md
Includes (names may vary slightly in code): file analysis (analyze_file, get_file_structure, …), components (list_components, …), export (export_node, …), comments (get_comments, create_comment, …), design modification helpers, plus resources (figma://file/..., etc.) and prompts for common tasks.
npm run lint
npm run lint:fix
npm run format
ISC
/oauth/authorize and /oauth/callback; session persisted in default KV (FIGMA_OAUTH_SESSION).oauthRedirectUri, oauthScopes.auth_mode, figma_authenticated./mcp JSON-RPC.References: Apify Actors · Figma REST API · Model Context Protocol
FIGMA_ACCESS_TOKEN*secretFigma Personal Access Token for API authentication. Get yours at https://www.figma.com/developers/api#access-tokens
miapre/html-to-figma-design-system
ie3jp/illustrator-mcp-server
coding-solo/godot-mcp
ivanmurzak/unity-mcp
yctimlin/mcp_excalidraw
figma/mcp-server-guide