{"name":"io.github.neozhehan/figma-edit-mcp","slug":"neozhehan-figma-edit-mcp","title":null,"description":"Programmatically read, create, and modify Figma designs via MCP.","url":"https://mcp.market/server/neozhehan-figma-edit-mcp","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":34,"stars":9,"forks":1,"downloads_week":65,"last_push_at":"2026-09-24T01:14:03.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/neozhehan/figma-edit-mcp","website":null,"version":"2.3.3","remotes":[],"packages":[{"registryType":"npm","identifier":"figma-edit-mcp","version":"2.3.3","transport":{"type":"stdio"}}],"tools":[{"name":"annotation_list","description":"Read the native annotations on a page or node (and subtree); exactly one of pageId or nodeId is required. The file's annotation categories are returned by default; pass includeCategories: false to omit them. Page loading is bounded; a page-scoped failure returns its structured error directly and successful reads include `coverage`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"annotation_set","description":"Append native annotations to one or more nodes in a batched call. If the status is 'partial_success', treat it as an incomplete operation and report the failed and skipped items to the user. Appending is NOT idempotent and a 'failed' row may already have appended its annotation (verified counts differ, or outcomeUnknown is true when post-state is unreadable; both carry partialMutation: true) \\u201","write_action":false,"price_micros":0,"input_schema":null},{"name":"channel_join","description":"Join a plugin channel to establish the live connection to the Figma document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"component_delete_property","description":"Remove a component-property definition from a main component or variant set; propagates to every instance.","write_action":true,"price_micros":0,"input_schema":null},{"name":"component_list","description":"List components in the document, with filtering and scope options. Document scans isolate page failures and report them in `coverage`; page-scoped failures return their structured error directly.","write_action":false,"price_micros":0,"input_schema":null},{"name":"component_manage_property","description":"Add or edit a component-property definition (BOOLEAN/TEXT/INSTANCE_SWAP) on a main component or variant set. Deleting is `component_delete_property`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_component","description":"Convert an existing frame into a main component.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_component_set","description":"Combine components into a component set (variants) with property definitions.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_frame","description":"Create a frame (container) with optional fill/stroke and full auto-layout configuration.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_instance","description":"Instantiate a component (by `componentKey` or `componentId`) at a position.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_shape","description":"Create a rectangle, ellipse, polygon, or star via `type`, with position/size and optional `fillColor`/`strokeColor`. Shape-specific params (`arcData`; `pointCount`/`innerRadius`) validated by `type`. `pointCount` = sides (polygon) or points (star), native count \\u2014 no even-parity rule.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_svg","description":"Create a node from an SVG markup string.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_text","description":"Create a text node with content and optional font size/weight/color.","write_action":true,"price_micros":0,"input_schema":null},{"name":"instance_get_overrides","description":"Read the override properties from a source instance, to later apply them to other instances.","write_action":false,"price_micros":0,"input_schema":null},{"name":"instance_set_overrides","description":"Apply previously-read overrides to target instances; targets are swapped to the source component and all overrides applied. If the status is 'partial_success', treat it as an incomplete operation, report the failed and skipped items to the user, and retry every non-success item (both failed and skipped).","write_action":false,"price_micros":0,"input_schema":null},{"name":"instance_set_property","description":"Set one property on an instance \\u2014 boolean toggle, text override, instance swap, or variant selection.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_apply_style","description":"Link a node to a shared library style (paint/text/effect/grid) by `styleId`. Use the raw `node_set_*` setters for ad-hoc values not backed by a style.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_bind_variable","description":"Bind a variable to a node property, or set an explicit variable mode. Use instead of a literal `node_set_*` when the value should track a design token. Ordering rules: set auto-layout before binding padding/spacing; set a solid fill before binding a colour token.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_clone","description":"Duplicate an existing node, optionally at a new `x`/`y`. Produces a new node id.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_delete","description":"Delete one or more nodes in a single batched, per-item-validated call. No API undo. If the status is 'partial_success', treat it as an incomplete operation, report the failed and skipped items to the user, and retry every non-success item (both failed and skipped).","write_action":true,"price_micros":0,"input_schema":null},{"name":"node_export_visual","description":"Render a node to an image (PNG/JPG/SVG/PDF) at a given scale. Read-only; the canonical way to visually verify edits. SVG returns raw XML in `svg` (directly readable); PNG/JPG/PDF return base64 in `imageData` (PDF is a delivery artifact \\u2014 prefer PNG/SVG for inspection).","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_flatten","description":"Flatten a node and its children into a single vector. Lossy \\u2014 original structure is not recoverable.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_group","description":"Wrap multiple nodes in a new group node.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_info","description":"Read one or more nodes \\u2014 recursive subtree traversal with `properties` selection, `filter`, and `maxDepth`. Returns only the requested properties (incl. resolved `boundVariables`/`explicitVariableModes`) under each node's `properties` key. A node whose containing page could not be read is listed in `pageFailedNodes` with that page's ID, and the page's structured reason is in `coverage.pageErr","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_insert_child","description":"Reparent a node under a new parent at an optional `index`. Valid range is 0 to parent's child count. Omit `index` to append.","write_action":true,"price_micros":0,"input_schema":null},{"name":"node_rename","description":"Rename a node (sets `name` to an exact value).","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_set_auto_layout","description":"Configure a frame's auto-layout (mode, padding, spacing, alignment, sizing) in one unified setter.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_set_corner_radius","description":"Set a node's corner radius \\u2014 uniform or per-corner.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_set_effects","description":"Set a node's effect array (shadows, blurs). Use `node_apply_style` to link a shared effect style instead.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_set_fill","description":"Set a node's fill to a literal RGBA color, an image, or clear it. Use `node_apply_style` to link a shared paint style, or `node_bind_variable` to bind a color token.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_set_stroke","description":"Set a node's stroke color and weight; supports uniform or per-side weights.","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_transform","description":"Move and/or resize a node by setting absolute `x`/`y`/`width`/`height` (any subset).","write_action":false,"price_micros":0,"input_schema":null},{"name":"node_ungroup","description":"Dissolve a group, promoting its children to the parent. Removes the group container.","write_action":false,"price_micros":0,"input_schema":null},{"name":"page_info","description":"List the document's pages; no args \\u2192 all pages (no children), or pass `pageIds` \\u2192 those pages with their top-level children. Batch \\u226425 ids/call. Inspect `coverage`: a failed page is omitted with a structured `pageErrors` row while other pages still return.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reaction_list","description":"Read prototype reactions from one or more nodes and their descendants.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reaction_update","description":"Replace a node's prototype reactions with a full new reactions array (read first via `reaction_list`).","write_action":true,"price_micros":0,"input_schema":null},{"name":"style_delete","description":"Delete a local style by id. Detaches consumers \\u2014 they keep their resolved values and lose only the style link.","write_action":true,"price_micros":0,"input_schema":null},{"name":"style_list","description":"List all local styles (paint/text/effect/grid) in the document.","write_action":false,"price_micros":0,"input_schema":null},{"name":"style_manage","description":"Create a named style (paint/text/effect/grid), or update an existing one when `styleId` is given. UPDATE requires currentStyleName.","write_action":true,"price_micros":0,"input_schema":null},{"name":"text_set_content","description":"Set the text of one or more text nodes in a single batched, per-item-validated call. If the status is 'partial_success', treat it as an incomplete operation, report the failed and skipped items to the user, and retry every non-success item (both failed and skipped).","write_action":false,"price_micros":0,"input_schema":null},{"name":"text_set_style","description":"Set any combination of typography properties (font, size, weight, spacing, decoration, \\u2026) on a text node.","write_action":false,"price_micros":0,"input_schema":null},{"name":"variable_delete","description":"Delete specific variables or an entire collection. Runs a full-document consumer check first, before any removal: if a target is still in use the call is refused with VARIABLE_IN_USE, whose `details.variablesInUse` lists every consumer; if any page cannot be loaded and read it is refused with DOCUMENT_SCAN_INCOMPLETE, because a page error can never mean zero consumers.","write_action":true,"price_micros":0,"input_schema":null},{"name":"variable_list","description":"List local variables/collections, or detailed info for specific variable ids; optionally scan for consumers. Document consumer scans isolate page failures and report them in `coverage`; page-scoped failures return their structured error directly.","write_action":false,"price_micros":0,"input_schema":null},{"name":"variable_manage","description":"Create collections and variables and set their values/aliases (create/update router). UPDATE_VARIABLE requires `currentVariableName`. CREATE_VARIABLE requires `collectionName` and `scopes`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"view_navigate","description":"Navigate the editor view to a page or node(s).","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-09-24T05:07:09.528Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T05:07:09.455Z","components":{"code":{"score":20,"max":25,"notes":["37 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/server.js: …ode, sch); const makeValidate = new Function(`${names_1.default.self}`, `${names_1.de…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"figma-edit-mcp","version":"2.3.3","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-08-04T05:45:40.737Z","repositoryUrl":"git+https://github.com/neozhehan/figma-edit-mcp.git","weeklyDownloads":65}],"repo":{"found":true,"owner":"neozhehan","repo":"figma-edit-mcp","archived":false,"pushedAt":"2026-09-24T01:14:03Z","stars":9,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/129329?v=4","ownerCreatedAt":"2009-09-21T00:07:07Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/129329?v=4&s=128","source":"github"},"presence":{"stars":9,"forks":1,"downloadsWeek":65,"license":"MIT","lastPushAt":"2026-09-24T01:14:03.000Z","score":34}}}},"grade_history":[],"reviews":[]}