Figma MCP Bridge
Read and edit open Figma and FigJam files through a desktop plugin instead of the Figma REST API
Read and edit Figma designs, variables and components, and sync design tokens with code
By Southleft, LLC TypeScript Remote (hosted) · Streamable HTTPLocal · stdio DesignDeveloper tools
85 popularity score ★ 3.2k ↓ 14k/wk
Opens the app, which asks before it adds the server.
https://figma-console-mcp.southleft.com/mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs FIGMA_ACCESS_TOKEN. Replace each <NAME> with your value.
claude mcp add figma-console -e FIGMA_ACCESS_TOKEN=<FIGMA_ACCESS_TOKEN> -- npx -y figma-console-mcp@latest{
"mcpServers": {
"figma-console": {
"command": "npx",
"args": [
"-y",
"figma-console-mcp@latest"
],
"env": {
"FIGMA_ACCESS_TOKEN": "<FIGMA_ACCESS_TOKEN>"
}
}
}
}{
"mcpServers": {
"figma-console": {
"command": "npx",
"args": [
"-y",
"figma-console-mcp@latest"
],
"env": {
"FIGMA_ACCESS_TOKEN": "<FIGMA_ACCESS_TOKEN>"
}
}
}
}{
"servers": {
"figma-console": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"figma-console-mcp@latest"
],
"env": {
"FIGMA_ACCESS_TOKEN": "<FIGMA_ACCESS_TOKEN>"
}
}
}
}[mcp_servers.figma-console]
command = "npx"
args = ["-y", "figma-console-mcp@latest"]
[mcp_servers.figma-console.env]
FIGMA_ACCESS_TOKEN = "<FIGMA_ACCESS_TOKEN>"gemini mcp add --scope user -e FIGMA_ACCESS_TOKEN=<FIGMA_ACCESS_TOKEN> figma-console npx -- -y figma-console-mcp@latestOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs FIGMA_ACCESS_TOKEN. Replace each <NAME> with your value.
git clone https://github.com/southleft/figma-console-mcp.git
cd figma-console-mcp
npm install
npm run build:localclaude mcp add figma-console -e FIGMA_ACCESS_TOKEN=<FIGMA_ACCESS_TOKEN> -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/local.js'{
"mcpServers": {
"figma-console": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/local.js"
],
"env": {
"FIGMA_ACCESS_TOKEN": "<FIGMA_ACCESS_TOKEN>"
}
}
}
}{
"mcpServers": {
"figma-console": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/local.js"
],
"env": {
"FIGMA_ACCESS_TOKEN": "<FIGMA_ACCESS_TOKEN>"
}
}
}
}{
"servers": {
"figma-console": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/local.js"
],
"env": {
"FIGMA_ACCESS_TOKEN": "<FIGMA_ACCESS_TOKEN>"
}
}
}
}[mcp_servers.figma-console]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/local.js"]
[mcp_servers.figma-console.env]
FIGMA_ACCESS_TOKEN = "<FIGMA_ACCESS_TOKEN>"gemini mcp add --scope user -e FIGMA_ACCESS_TOKEN=<FIGMA_ACCESS_TOKEN> figma-console node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/local.js'FIGMA_ACCESS_TOKEN secret |
Required: Figma personal access token (figd_...). REST tools fail without it. See requirements for the scopes the README asks for. |
|---|---|
ENABLE_MCP_APPS |
Optional: Set to true to turn on the experimental MCP Apps token browser, as the docs' example config does. |
FIGMA_WS_PORT |
Optional: Preferred port for the plugin's WebSocket link. The server tries the next ports up to 9232 if it is taken. |
FIGMA_WS_HOST |
Optional: Address the WebSocket bridge binds to. |
| Set together: http | |
FIGMA_MCP_HTTP_PORT |
Optional: Also serve MCP over Streamable HTTP at http://127.0.0.1:<port>/mcp. Off when unset. |
FIGMA_MCP_HTTP_TOKEN secret |
Optional: With FIGMA_MCP_HTTP_PORT, require this bearer token on every HTTP request. |
Figma Console MCP is aimed at design-system work in Figma. It reads variables, components and styles as structured data, and it can build and edit frames, components, slots and variables. It also handles comments, annotations and version diffs, and checks accessibility and how closely code matches the design. Newer tools set auto layout or a CSS-style grid on a frame in one call (figma_set_layout) and apply shaders with their properties set by name. A token sync tool writes Figma variables out as DTCG and other token files and can push edits from those files back into Figma. In local mode a group of figma_ds tools scans an app's codebase, pulls tokens out of its styling and scaffolds a design-system package.
There are four ways to run it. The npm package (npx) and a built clone are the local mode with all 130 tools. They need Node.js 18 or later, Figma Desktop, a personal access token and the Desktop Bridge plugin, which you import from a manifest the server writes under ~/.figma-console-mcp/plugin/. Cloud Mode is a hosted endpoint for web clients such as Claude.ai, v0, Replit or Lovable. You pair it with the same plugin using a six-character code and get 105 tools, writing included. A hosted SSE endpoint gives read-only access after Figma sign-in.
Some details only show up in the source. A figma_execute script stops after 5 seconds unless you pass a longer timeout, and the server caps that at 300000 ms. figma_list_shaders allows 30 seconds for a page and two minutes when it scans the whole file. Since 1.44 a local server can also answer over Streamable HTTP on 127.0.0.1 when FIGMA_MCP_HTTP_PORT is set, so several local clients can share one Figma connection.
Southleft makes it, not Figma, under the MIT licence.
| To run it yourself | Node.js 18+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Figma | FreePersonal access token for local mode. Variable editing goes through the plugin, so it works without an Enterprise plan |
| Also |
|
Create a Figma personal access token (it starts with figd_). The README asks for read on File content, File versions, Library content, Library assets and Current user, read and write on Comments, and Variables read only on Enterprise plans, where it is optional. Set it as FIGMA_ACCESS_TOKEN. Start the server once, then in Figma Desktop use Plugins > Development > Import plugin from manifest and pick ~/.figma-console-mcp/plugin/manifest.json (`npx figma-console-mcp --print-path` prints the path). Run the plugin in your file and it finds the server on ports 9223 to 9232. Re-import if your plugin predates 1.41.5. Cloud Mode needs no Node.js but still needs Figma Desktop with the plugin.
Suits design-system teams who work in Figma Desktop and want an assistant to inspect and change variables, components and slots, or to keep token files in a repo in step with Figma. The local npx setup gives the full tool set and touches files in your codebase. Pick Cloud Mode when you only use a web client such as Claude.ai and do not want Node.js, accepting fewer tools and a relay through Southleft's server. If you only need to read design data, the hosted SSE endpoint is the lighter option. It is a community project from Southleft rather than Figma's own server, and anyone working in Figma in the browser only cannot use the write tools.
26 only read, 27 change things, 7 can delete or overwrite. A ? marks an optional parameter.
figma_get_statusfigma_reconnectfigma_navigatefigma_list_open_filesfigma_get_console_logsfigma_watch_consolefigma_clear_console changesfigma_reload_plugin changesfigma_take_screenshotfigma_capture_screenshotfigma_get_selectionfigma_get_design_changesfigma_get_design_system_summaryfigma_get_token_valuestype?: enumfilter?: stringlimit?: numberfigma_search_componentsfigma_get_component_detailsfigma_get_library_componentsfigma_get_file_datafigma_get_variablesfigma_get_componentfigma_get_stylesfigma_get_component_imagefigma_get_component_for_developmentfigma_set_instance_properties changesfigma_execute deletescode: stringtimeout?: numberfileKey?: stringfigma_create_component_set changesfigma_arrange_component_set changesfigma_set_description changesfigma_instantiate_component changesfigma_add_component_property changesfigma_edit_component_property changesfigma_delete_component_property deletesfigma_create_child changesfigma_move_node changesfigma_resize_node changesfigma_delete_node deletesfigma_set_text changesfigma_set_fills changesfigma_set_strokes changesfigma_set_image_fill changesfigma_set_layout changesnodeId: stringmode?: enumgap?: numberpadding?: anyprimaryAlign?: enumcounterAlign?: enumwrap?: booleangrid?: objectchildren?: arrayfileKey?: stringfigma_list_shadersscope?: enumnodeId?: stringfileKey?: stringfigma_apply_shader changesnodeId: stringshaderId?: stringtarget?: enumindex?: integerreplace?: booleanproperties?: objectopacity?: numberblendMode?: enumvisible?: booleanfileKey?: stringfigma_create_slot changesnodeId: stringname?: stringwidth?: numberheight?: numberlayoutMode?: enumfileKey?: stringfigma_get_slotsfigma_append_to_slot changesfigma_reset_slot deletesfigma_add_slot_property changesfigma_create_variable changesfigma_update_variable changesfigma_batch_create_variables changesfigma_setup_design_tokens changesfigma_delete_variable deletesfigma_delete_variable_collection deletesfigma_lint_designfigma_get_commentsfigma_post_comment changesfigma_export_tokens changesfigma_import_tokens deletesfigma_ds_analyze