@obra-studio/figma-console-mcp
npm
v1.32.1
Published by @obra-studio — 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.
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 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:326`): 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:326`): 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/port-discovery.js:198`): 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: { execSync } = require('child_process'); // `etime` (formatted elapsed time) is portable across macOS and Linux;
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:202`): 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: 1". 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_text_to_slideno sensitive capabilityfigma_analyze_component_setno sensitive capabilityfigma_arrange_component_setno sensitive capabilityfigma_audit_component_accessibilityno 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_slideno 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_duplicate_slideno sensitive capabilityfigma_edit_component_propertyno sensitive capabilityfigma_executeno sensitive capabilityfigma_focus_slideno sensitive capabilityfigma_generate_autodocsno 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_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_remove_autodocsno sensitive capabilityfigma_rename_modeno sensitive capabilityfigma_rename_nodeno sensitive capabilityfigma_rename_variableno sensitive capabilityfigma_reorder_slidesno 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.32.1 latest |
D 67/100 | 6 | 1.13.0 | 2026-09-07 |
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 @obra-studio/figma-console-mcp --online
Independent packages implementing the same tool, scanned with the same engine. Compare all 4 side by side →
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.
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.
Hotel booking MCP server — 300K+ properties, real confirmation numbers, loyalty programs. Builders monetize every booking via Stripe Connect. The first MCP server that completes real hotel reservations inside AI conversations.
Manage AdGuard Home through AI assistants
Read-only Azure DevOps for MCP clients using only your existing browser session — no PAT, no Azure CLI. Browse work items, pull requests, comments, attachments and Artifacts feeds across every project, repo and feed you can access.
MCP server for Adobe Experience Manager Assets integration development
Servidor MCP para el tiempo oficial de España (API pública OpenData de AEMET). Predicción, observación y avisos como herramientas MCP tipadas.
A standalone MCP stdio bridge for Affinity by Canva's local MCP SSE server.