@mp3wizard/figma-console-mcp
npm
v1.40.1
Published by @mp3wizard — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.
The most comprehensive MCP server for Figma — design tokens, variables, components, write tools, version history diff, accessibility audits, FigJam, Slides, and more. Local (WebSocket Desktop Bridge plugin) and Cloudflare Workers (paired + remote) modes.
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 21.7 = 78. What the published surface and source actually contain:
| Points | What was found | Category |
|---|---|---|
| −15.4 | Assembled command execution and dynamic evaluation in the same server MTC-SRC-011 | injection |
| −6.3 | Untrusted input concatenated into a command sink MTC-SRC-009 | injection |
2. Client adoption risk — 78 − 11 = 67. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −10 | capability blast radius (critical) — client exposure if the model is manipulated |
| −1 | publisher verification (public source) — no provenance, but the source is public and inspectable |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
This server (without client built-ins) exposes a complete data-exfiltration chain: figma_get_file_at_version → figma_get_token_values → figma_export_tokens. Untrusted input is ingested, private data is read, and it can be sent to an external sink via the agent composing the tools (→). Static analysis proves the primitive exists, not that a specific run will occur.
Fix: Remove one leg of the trifecta: isolate untrusted-input tools from secret-reading tools and from egress tools, or require human approval between them.
Location: flow figma_get_file_at_version → figma_get_token_values → figma_export_tokens
In the server's implementation (`figma-desktop-bridge/code.js:519`): Evaluating a runtime value as code (rather than a fixed literal) executes whatever reaches it — a direct RCE primitive, and almost never necessary in legitimate code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: E codePromise = eval(wrappedCode); } catch (syntaxError) { // Log the actual syntax error message
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server figma-desktop-bridge/code.js
The implementation both builds shell commands out of runtime values (`dist/core/port-discovery.js`) and evaluates runtime values as code (`figma-desktop-bridge/code.js`). Each is a separate arbitrary-execution primitive; a server exposing both gives anything that reaches either one a direct path to running attacker-chosen code. These two sinks are in different files — confirm whether they are actually connected, or are unrelated code paths (e.g. a vendored bundle plus a CLI wrapper).
Fix: Remove the dynamic eval, and pass command arguments as an argv array instead of building a shell string. If both are genuinely required, constrain and validate every value that can reach them.
Location: server implementation
In the server's implementation (`figma-desktop-bridge/code.js:519`): Evaluating strings as code is the most direct RCE primitive; if any tool input reaches it, the server executes attacker-chosen code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: E codePromise = eval(wrappedCode); } catch (syntaxError) { // Log the actual syntax error message
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server figma-desktop-bridge/code.js
In the server's implementation (`dist/core/history/git-history.js:124`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ckIgnore: true */ "node:child_process"); const execFile = mod.execFile; if (typeof execFile !== "function") {
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/core/history/git-history.js
In the server's implementation (`dist/core/port-discovery.js:35`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: e, execFileSync } from 'child_process'; import { promisify } from 'util'; import { createChildLogger } from './logger.js
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/core/port-discovery.js
In the server's implementation (`dist/core/port-discovery.js:388`): A shell/process command assembled from concatenated or interpolated values is command injection when any part is attacker-influenced — the OWASP canonical RCE flow. Verify what reaches the interpolated value. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: '); const out = execSync(`ps -p ${pid} -o etime= 2>/dev/null`, { encoding: 'utf-8', time
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/core/port-discovery.js
Each tool and what it can reach — statically extracted from the published source.
figma_export_tokensnetwork egressfigma_get_file_at_versioningests untrusted inputfigma_get_token_valuesreads sensitive datafigjam_auto_arrangeno sensitive capabilityfigjam_create_code_blockno sensitive capabilityfigjam_create_connectorno sensitive capabilityfigjam_create_sectionno sensitive capabilityfigjam_create_shape_with_textno sensitive capabilityfigjam_create_stickiesno sensitive capabilityfigjam_create_stickyno sensitive capabilityfigjam_create_tableno sensitive capabilityfigjam_get_board_contentsno sensitive capabilityfigjam_get_connectionsno sensitive capabilityfigma_add_component_propertyno sensitive capabilityfigma_add_modeno sensitive capabilityfigma_add_shape_to_slideno sensitive capabilityfigma_add_slot_propertyno sensitive capabilityfigma_add_text_to_slideno sensitive capabilityfigma_analyze_component_setno sensitive capabilityfigma_append_to_slotno sensitive capabilityfigma_arrange_component_setno sensitive capabilityfigma_audit_component_accessibilityno sensitive capabilityfigma_audit_design_system_reportno sensitive capabilityfigma_batch_create_variablesno sensitive capabilityfigma_batch_update_variablesno sensitive capabilityfigma_blame_nodeno sensitive capabilityfigma_capture_screenshotno sensitive capabilityfigma_check_design_parityno sensitive capabilityfigma_clear_consoleno sensitive capabilityfigma_clone_nodeno sensitive capabilityfigma_create_childno sensitive capabilityfigma_create_component_setno sensitive capabilityfigma_create_slideno sensitive capabilityfigma_create_slotno sensitive capabilityfigma_create_variableno sensitive capabilityfigma_create_variable_collectionno sensitive capabilityfigma_delete_commentno sensitive capabilityfigma_delete_component_propertyno sensitive capabilityfigma_delete_nodeno sensitive capabilityfigma_delete_slideno sensitive capabilityfigma_delete_variableno sensitive capabilityfigma_delete_variable_collectionno sensitive capabilityfigma_diagnoseno sensitive capabilityfigma_diff_versionsno sensitive capabilityfigma_ds_analyzeno sensitive capabilityfigma_ds_extract_componentno sensitive capabilityfigma_ds_extract_tokensno sensitive capabilityfigma_ds_scaffoldno sensitive capabilityfigma_ds_setup_storybookno sensitive capabilityfigma_ds_statusno sensitive capabilityfigma_ds_verifyno sensitive capabilityfigma_duplicate_slideno sensitive capabilityfigma_edit_component_propertyno sensitive capabilityfigma_executeno sensitive capabilityfigma_execute_across_filesno sensitive capabilityfigma_focus_slideno sensitive capabilityfigma_generate_changelogno sensitive capabilityfigma_generate_component_docno sensitive capabilityfigma_get_annotation_categoriesno sensitive capabilityfigma_get_annotationsno sensitive capabilityfigma_get_changes_since_versionno sensitive capabilityfigma_get_commentsno sensitive capabilityfigma_get_componentno sensitive capabilityfigma_get_component_detailsno sensitive capabilityfigma_get_component_for_developmentno sensitive capabilityfigma_get_component_for_development_deepno sensitive capabilityfigma_get_component_imageno sensitive capabilityfigma_get_console_logsno sensitive capabilityfigma_get_design_changesno sensitive capabilityfigma_get_design_system_kitno sensitive capabilityfigma_get_design_system_summaryno sensitive capabilityfigma_get_file_datano sensitive capabilityfigma_get_file_for_pluginno sensitive capabilityfigma_get_file_versionsno sensitive capabilityfigma_get_focused_slideno sensitive capabilityfigma_get_library_component_by_keyno sensitive capabilityfigma_get_library_componentsno sensitive capabilityfigma_get_library_variablesno sensitive capabilityfigma_get_selectionno sensitive capabilityfigma_get_slide_contentno sensitive capabilityfigma_get_slide_gridno sensitive capabilityfigma_get_slide_transitionno sensitive capabilityfigma_get_slotsno sensitive capabilityfigma_get_statusno sensitive capabilityfigma_get_stylesno sensitive capabilityfigma_get_text_stylesno sensitive capabilityfigma_get_variablesno sensitive capabilityfigma_import_library_variableno sensitive capabilityfigma_import_tokensno sensitive capabilityfigma_instantiate_componentno sensitive capabilityfigma_lint_designno sensitive capabilityfigma_list_open_filesno sensitive capabilityfigma_list_slidesno sensitive capabilityfigma_move_nodeno sensitive capabilityfigma_navigateno sensitive capabilityfigma_post_commentno sensitive capabilityfigma_reconnectno sensitive capabilityfigma_reload_pluginno sensitive capabilityfigma_rename_modeno sensitive capabilityfigma_rename_nodeno sensitive capabilityfigma_rename_variableno sensitive capabilityfigma_reorder_slidesno sensitive capabilityfigma_reset_slotno sensitive capabilityfigma_resize_nodeno sensitive capabilityfigma_scan_code_accessibilityno sensitive capabilityfigma_search_componentsno sensitive capabilityfigma_set_annotationsno sensitive capabilityfigma_set_descriptionno sensitive capabilityfigma_set_fillsno sensitive capabilityfigma_set_image_fillno sensitive capabilityfigma_set_instance_propertiesno sensitive capabilityfigma_set_slide_backgroundno sensitive capabilityfigma_set_slide_transitionno sensitive capabilityfigma_set_slides_view_modeno sensitive capabilityfigma_set_strokesno sensitive capabilityfigma_set_textno sensitive capabilityfigma_setup_design_tokensno sensitive capabilityfigma_skip_slideno sensitive capabilityfigma_take_screenshotno sensitive capabilityfigma_update_variableno sensitive capabilityfigma_watch_consoleno sensitive capabilityCross-tool combinations that form a data-exfiltration primitive (untrusted input → sensitive source → external sink).
Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v1.40.1 latest |
D 67/100 | 7 | 1.13.0 | 2026-09-07 |
v1.39.2 |
D 67/100 | 7 | 1.12.1 | 2026-08-16 |
v1.38.3 |
D 67/100 | 7 | 1.12.1 | 2026-08-03 |
v1.38.1 |
D 64/100 | 11 | 1.12.1 | 2026-07-29 |
v1.37.2 |
D 64/100 | 10 | 1.10.0 | 2026-07-25 |
v1.36.1 |
D 60/100 | 9 | 1.5.0 | 2026-07-22 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan @mp3wizard/figma-console-mcp --online
Independent packages implementing the same tool, scanned with the same engine. Compare all 4 side by side →
Obra Studio fork of figma-console-mcp (by Southleft) adding Obra Autodocs: generate labeled component-variant documentation from inside the Desktop Bridge. The most comprehensive MCP server for Figma — design tokens, variables, components, write tools, ve
The most comprehensive MCP server for Figma — design tokens, variables, components, write tools, version history diff, accessibility audits, FigJam, Slides, and more. Local (WebSocket Desktop Bridge plugin) and Cloudflare Workers (paired + remote) modes.
The most comprehensive MCP server for Figma — design tokens, variables, components, write tools, version history diff, accessibility audits, FigJam, Slides, and more. Local (WebSocket Desktop Bridge plugin) and Cloudflare Workers (paired + remote) modes.
Turn designs into shipped parts: quote 3D printing, CNC, and decals, then check out.
Aleph's official SiliconFlow media-generation MCP server (image / video / TTS)
MCP server for image generation using Google Gemini AI
Ambience AI MCP Server - Generate images, videos, and audio through Model Context Protocol
MCP server exposing every endpoint of the AstroWay Calculation API as tools — natal, synastry, transits, Vedic dashas, Tarot, Numerology, Human Design, AI horoscopes — for Claude Desktop, Cursor and any MCP-compatible AI agent.
Audio-guide and trip-planning tools for 1,100+ cities from Audiala. Free, no API key.