Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.arimunandar/figsnap-mcp

NPM · FIGSNAP-MCP · SCANNED SEP 20

The Figma file you have open, as MCP tools. Extract, edit, and keep a saved set.

Available components

+4 this week 90 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 96 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to arimunandar/figsnap-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 13 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability84
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5758 tokens (~130/item across 44 items; 41 tools + 3 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management60
  • Stability observed for 18 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage90
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 70% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the io.github.arimunandar/figsnap-mcp server?

io.github.arimunandar/figsnap-mcp runs locally as an npm package, launched with npx -y figsnap-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · figsnap-mcp

# add to Claude Code
claude mcp add arimunandar-figsnap-mcp -- npx -y figsnap-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "arimunandar-figsnap-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "arimunandar-figsnap-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add arimunandar-figsnap-mcp -- npx -y figsnap-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "arimunandar-figsnap-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "figsnap-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add arimunandar-figsnap-mcp --command npx --arg -y --arg figsnap-mcp
# ~/.hermes/config.yaml
mcp_servers:
  arimunandar-figsnap-mcp:
    command: "npx"
    args: ["-y", "figsnap-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "arimunandar-figsnap-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add arimunandar-figsnap-mcp -t stdio -c npx -a -y figsnap-mcp
// mcp.json
{
  "mcpServers": {
    "arimunandar-figsnap-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

  • 12 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

  • 10 Sept 26 +1
    • Security disclosure: unverified → fail functional
  • 9 Sept 26 0
    • Security disclosure: fail → unverified functional
  • 8 Sept 26 +15
    • Malware scan: unverified → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/figsnap-mcp@0.2.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo arimunandar/figsnap-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/arimunandar/figsnap-mcp/.github/workflows/publish.yml@refs/tags/v0.2.0
Rekor log index 2746654559
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:234efc8eeb7e06d4597411f8185b8576689ec6620f0ba73893e73a6abfcb59c2bbb4a04b51c04be59d3ee9c5e4735534a31a1b0731fed15dea583ebc7

Background: How many MCP packages publish verified provenance →

Dependencies 96 packages
Packages resolved 96
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 41 exposed · ~5,697 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
figma_apply_style ~97

Applies a paint, text or effect style from this file by id, from figma_list_library. The right way to make something "match": the layer follows the style afterwards, where a copied hex code does not.

NameTypeReqDescription
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
styleIdstringyesFrom figma_list_library.

No output schema declared.

No examples provided.

figma_bind_variable ~137

Binds a variable from this file to a property, so the value follows the token rather than being a copy of it. Use "fill" or "stroke" for a colour variable; for a number use the property name, like cornerRadius, itemSpacing, paddingLeft, width or opacity.

NameTypeReqDescription
fieldstringyes"fill", "stroke", or a numeric property such as cornerRadius or itemSpacing.
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
variableIdstringyesFrom figma_list_library.

No output schema declared.

No examples provided.

figma_clone_node ~91

Copies a node, with everything inside it, into the same parent or one you name. The cheapest way to make a second row, card or list item that matches the first exactly.

NameTypeReqDescription
nodeIdstringyesThe node to copy.
parentIdstringWhere the copy goes. Default: beside the original.
xnumber
ynumber

No output schema declared.

No examples provided.

figma_component_properties ~120

The properties a component, component set or instance has: the variants, and the text, boolean and instance-swap properties, with what this instance currently has them set to. Call this before figma_set_instance_properties. The key that setter needs carries an id suffix for everything but a variant — "Label#8:2", not "Label" — and there is no way to guess it.

NameTypeReqDescription
nodeIdstringFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.

No output schema declared.

No examples provided.

figma_create_ellipse ~97

Creates an ellipse. Equal width and height give a circle — an avatar, a dot, a radio button.

NameTypeReqDescription
fillstringHex colour. Omit for no fill.
heightnumberDefault 100.
namestring
parentIdstring
widthnumberDefault 100.
xnumber
ynumber

No output schema declared.

No examples provided.

figma_create_frame ~129

Creates an empty frame, on the current page or inside a parent you name. Returns the new node’s id so the next call can fill it.

NameTypeReqDescription
fillstringHex colour for a solid background. Omit to keep Figma’s default white.
heightnumberDefault 100.
namestringLayer name. Default "Frame".
parentIdstringPut it inside this node. Default: the current page.
widthnumberDefault 100.
xnumber
ynumber

No output schema declared.

No examples provided.

figma_create_instance ~102

Creates an instance of a component in this file. Get the id from figma_list_library. Naming a variant set places its default variant. Prefer this over drawing a lookalike: an instance keeps its link to the component and updates with it.

NameTypeReqDescription
componentIdstringyesFrom figma_list_library.
namestring
parentIdstring
xnumber
ynumber

No output schema declared.

No examples provided.

figma_create_rectangle ~120

Creates a rectangle. The workhorse shape: dividers, bars, backgrounds, placeholders. Omit the fill for an empty one.

NameTypeReqDescription
cornerRadiusnumber
fillstringHex colour. Omit for no fill.
heightnumberDefault 100.
namestring
parentIdstringPut it inside this node. Default: the current page.
widthnumberDefault 100.
xnumber
ynumber

No output schema declared.

No examples provided.

figma_create_svg ~133

Turns SVG markup into real Figma vectors — not an image, but editable paths in a frame. This is how to add an icon, a logo or any shape the other create tools cannot express. Extraction returns icons as SVG too, so a shape can be read out of one place and drawn into another unchanged.

NameTypeReqDescription
heightnumber
namestring
parentIdstring
svgstringyesThe <svg> markup.
widthnumberScale it to this width.
xnumber
ynumber

No output schema declared.

No examples provided.

figma_create_text ~178

Creates a TEXT layer with the words you give it. The font is loaded before anything is typed, and a font this machine does not have is refused rather than substituted. Give a width to make it wrap; without one it hugs its text.

NameTypeReqDescription
colorstringHex colour for the text.
fontFamilystringDefault Inter.
fontSizenumber
fontStylestringWeight or style, like "Bold". Default Regular.
namestringLayer name. Defaults to the text itself.
parentIdstringPut it inside this node. Default: the current page.
textstringyesThe characters.
widthnumberFixed width, so the text wraps.
xnumber
ynumber

No output schema declared.

No examples provided.

figma_delete_node ~58

Removes a node and everything inside it. One undo step, so the designer can take it back with a single Cmd-Z — but say what you are deleting before you do it.

NameTypeReqDescription
nodeIdstringyesThe node to delete.

No output schema declared.

No examples provided.

figma_export_png ~70

Renders one node and returns the picture itself, so a model that can see gets to look at the design rather than read a description of it. Nothing is stored anywhere.

NameTypeReqDescription
nodeIdstringyesThe node to render.
scalenumberRender scale. Default 2.

No output schema declared.

No examples provided.

figma_extract ~468

The full extraction of one node: HTML measured against what Figma draws, byte-exact figmaCss, a React component, plain CSS and CSS modules. Images are inlined and icons come out as real SVG, so the HTML stands on its own. This is the tool that answers "what does this design actually say". Several nodes at once, instead of one call each: nodeIds, urls, selection: true, or saved: true with an optional folder. A batch answers {results:[…]}, one entry per input, each {ok:true,extraction} or {ok:false,error}, so one bad id never sinks the rest. It is capped at 20 entries, and no batch returns an image — ask figma_export_png for a picture, a node at a time.

NameTypeReqDescription
folderstringOne folder of the saved set, with saved: true. "" is the root. This is a folder in the panel, not a directory on disk — nothing here writes files; ask for pngData and write the bytes yourself.
formatsarrayWhich representations to return. Default html and figmaCss. "png" comes back as a real image you can look at, alongside the text — there is no base64 in the answer, so ask for it freely on a single n…
inlineInstancesbooleanExpand component instances instead of referencing them.
nodeIdstringFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
nodeIdsarraySeveral node ids, extracted in one call. Up to 20.
savedbooleanExtract the designer’s saved set. Narrow it with folder.
scalenumberRender scale for any image output. Default 2.
selectionbooleanExtract every layer the designer has selected, not just the first.
topLayerOnlybooleanStop at the selected layer rather than walking into it.
urlstringA Figma link, as an alternative to nodeId.
urlsarraySeveral Figma links, extracted in one call. Up to 20.

No output schema declared.

No examples provided.

figma_find_nodes ~242

Finds layers by type, by name and by the words in them. Every filter is optional and they narrow together. This is the cheap way to locate something. Walking with figma_get_tree and figma_get_children costs a round trip per level and returns every sibling; asking here for {types:["INSTANCE"], name:"button"} costs one call. Searches the current page unless you pass nodeId to search inside one branch, or allPages to search the whole file — which is the only way to find something that is not on the page the designer happens to have open.

NameTypeReqDescription
allPagesbooleanSearch every page in the file. Slower, and the answer names the page each row is on.
limitintegerMost rows to return. Default 50.
namestringSubstring of the layer name, case-insensitive.
nodeIdstringSearch inside this branch instead of the whole page.
textstringSubstring of a text layer’s words, case-insensitive. Implies TEXT.
typesarrayLayer types to keep. Omit for any type.

No output schema declared.

No examples provided.

figma_get_children ~63

The direct children of one node, by id. The cheap way to explore a page a branch at a time.

NameTypeReqDescription
depthintegerHow many levels to walk. Default 1.
nodeIdstringyesThe node whose children to list.

No output schema declared.

No examples provided.

figma_get_selection ~52

The layers the designer has selected on the canvas right now, with their ids, names, types and sizes. Start here when the request says "this", "the selected frame", or names nothing at all.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

figma_get_tree ~66

The top-level layers of the page the designer is looking at. Increase depth to walk further down, but note that a deep page is thousands of rows: prefer figma_get_children on one branch.

NameTypeReqDescription
depthintegerHow many levels to walk. Default 1.

No output schema declared.

No examples provided.

figma_group ~138

group — puts nodeIds in a new group, inside the first one’s own parent. ungroup — dissolves a group or frame and returns the children it let go. A group is the honest answer when several layers are one thing but need no layout of their own; reach for figma_create_frame with auto layout when they do.

NameTypeReqDescription
actionstringDefault group.
namestringFor group: what to call it.
nodeIdstringFor ungroup: the group or frame to dissolve.
nodeIdsarrayFor group: the layers to gather, up to 20.

No output schema declared.

No examples provided.

figma_insert_image ~248

Places a PNG, JPG or GIF, passed as base64. With nodeId it becomes that layer’s fill, which is how a placeholder gets its picture; without one it arrives as a new rectangle at its own pixel size. Base64 rather than a URL on purpose: the plugin’s manifest allows only the relay and the local daemon as network destinations, so the plugin cannot fetch an image from anywhere a designer keeps one. Read the file yourself and send the bytes. The cap is 700KB of base64, which is roughly a 500KB image.

NameTypeReqDescription
datastringyesThe image as base64. A data: URL prefix is accepted and ignored.
heightnumberDefault: the image’s own height.
namestring
nodeIdstringFill this layer instead of making a new one.
parentIdstringWhere a new rectangle goes. Default: the current page.
scaleModestringHow it sits in the frame. Default FILL.
widthnumberDefault: the image’s own width.
xnumber
ynumber

No output schema declared.

No examples provided.

figma_ios_spec ~375

One node and its children as the properties Figma actually holds, in points: per-axis sizing, auto layout with its padding, stroke weight and alignment, corner smoothing, effects, the whole text block, and every fill and stroke marked with whether it is painted. Read this rather than figmaCss when the answer becomes code. Dev Mode CSS answers what a node would look like on the web, which drops what an implementation needs — which side of the bounds a stroke sits on, whether a height was authored or measured, whether the corners are smoothed — and it also reports paint that is never painted: a stroke switched off still comes back as "border: 1px solid". Here a fill or stroke carries `painted`, so a border that is not drawn cannot be mistaken for one that is. A stroke also reports layoutFrame and visualFrame, because a CENTER stroke puts half its weight outside the bounds and UIKit draws borders inside them. Effects report uikitShadowRadius, which is half the blur. And the answer names the scale it read: a 750-wide artboard is a 375pt design drawn at 2x, and treating it as points doubles every number silently. One limit worth knowing: a gradient paint reports its type, opacity and whether it is painted, but not its stops — so you learn a gradient is there and cannot yet reproduce it. Ask figma_export_png for the node and read the colours off the render until that lands.

NameTypeReqDescription
nodeIdstringFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
scalenumberThe scale the artboard was drawn at. Default: inferred from the root width against the widths a phone actually has, and the answer says which it used.

No output schema declared.

No examples provided.

figma_list_library ~93

The components, styles and variables this file has, with the ids the other tools need. Read this before "make it match our button" or "use our brand colour" — instantiating the real component or binding the real variable is what makes a change survive contact with the design system, rather than a hex code that looks right today.

NameTypeReqDescription
onlystringNarrow the answer. Default all three.

No output schema declared.

No examples provided.

figma_list_saved ~55

The nodes the designer curated in the panel, by folder. A shortlist of what matters in this file, which is usually a better starting point than the whole page.

NameTypeReqDescription
folderstringRestrict to one folder.

No output schema declared.

No examples provided.

figma_move_node ~91

Moves a node into another parent, or to a different position among its siblings. Index 0 is the back of the canvas and the top of a layer list; leaving it out puts the node last.

NameTypeReqDescription
indexintegerPosition among siblings.
nodeIdstringyesThe node to move.
parentIdstringNew parent. Default: keep the one it has.

No output schema declared.

No examples provided.

figma_pages ~159

list — every page in the file, and which is current. open — switch to one, by pageId or by name. Worth calling before concluding something is missing: every other reading tool answers about the current page only, so a frame on another page looks exactly like a frame that does not exist. Opening a page moves the designer’s view, which is the same kind of act as figma_select — nothing in the file changes and there is nothing to undo, so it is not behind the Edits switch.

NameTypeReqDescription
actionstringyesWhich of the two.
namestringFor open: the page name, if you have no id.
pageIdstringFor open: the page id from list.

No output schema declared.

No examples provided.

figma_resolve_url ~40

Turns one or more Figma links into the nodes they name, without exporting anything.

NameTypeReqDescription
urlsarrayyesFigma links to resolve.

No output schema declared.

No examples provided.

figma_save_version ~69

Saves a named point in the file’s version history. Call this before a run that will change several things, so there is one place to fall back to that is not a stack of undos.

NameTypeReqDescription
descriptionstring
titlestringyesWhat this checkpoint is for.

No output schema declared.

No examples provided.

figma_saved ~352

Read and change the designer’s shortlist of nodes in this file, and the folders it is grouped into. One action argument: list, folders, save, unsave, clear, move, newFolder, renameFolder, deleteFolder. list — the entries, optionally in one folder. folders — the folders with their counts; "" is the root. save — add nodeIds, or whatever is selected when you give none. unsave — remove nodeIds. clear — empty one folder, or the whole set when you name none. move — put nodeIds in folder. newFolder / renameFolder / deleteFolder — the folders themselves; deleteFolder keeps the entries and returns them to the root unless deleteEntries is true. This is a bookmark list, not the design: it lives in the plugin’s own storage, so none of it is behind the Edits switch and none of it can be undone with Cmd-Z. Saving what a long job is about is a cheap way to leave the designer something to look at afterwards.

NameTypeReqDescription
actionstringyesWhich of the nine.
deleteEntriesbooleanFor deleteFolder: remove what was in it too, rather than returning it to the root.
folderstringFor list, save, clear and move. "" is the root; the folder must already exist for move.
fromstringFor renameFolder: the folder as it is called now.
namestringFor newFolder and deleteFolder.
nodeIdsarrayFor save, unsave and move. Omitting them on save means the current selection.
tostringFor renameFolder: what to call it instead.

No output schema declared.

No examples provided.

figma_select ~146

Selects one or more layers and scrolls the canvas to them, so the designer is looking at whatever you are talking about. Use it before describing a node you found by walking the tree — pointing is faster than naming an id — and after an edit, so the change is on screen. It changes no design data, which is why it works whether or not Edits is on, and why it leaves no undo step. It does move the designer’s viewport, so say what you are showing them.

NameTypeReqDescription
nodeIdstringOne node to select and scroll to.
nodeIdsarraySeveral, selected together and framed together. Up to 20.

No output schema declared.

No examples provided.

figma_set_auto_layout ~161

Turns auto layout on for a frame and sets its direction, spacing, padding and alignment. Pass mode "NONE" to turn it off. Only the properties you name are changed.

NameTypeReqDescription
counterAxisAlignItemsstringAlignment across the layout direction.
itemSpacingnumberGap between children.
modestringyesLayout direction.
nodeIdstringyesThe frame, component or instance to lay out.
paddingnumberShorthand: sets all four paddings.
paddingBottomnumber
paddingLeftnumber
paddingRightnumber
paddingTopnumber
primaryAxisAlignItemsstringAlignment along the layout direction.

No output schema declared.

No examples provided.

figma_set_bounds ~103

Sets position and size. Position is ignored inside an auto-layout frame, where the parent decides it — use figma_set_layout_sizing and the parent’s spacing there instead.

NameTypeReqDescription
heightnumber
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
widthnumber
xnumber
ynumber

No output schema declared.

No examples provided.

figma_set_corner_radius ~101

Sets one radius for every corner, or each corner on its own.

NameTypeReqDescription
bottomLeftRadiusnumber
bottomRightRadiusnumber
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
radiusnumberAll four corners.
topLeftRadiusnumber
topRightRadiusnumber

No output schema declared.

No examples provided.

figma_set_effects ~99

Replaces a node’s effects with the list you give. An empty list clears them. Elevation in most design systems is a drop shadow, so this is what "make it look raised" means.

NameTypeReqDescription
effectsarrayyesIn back-to-front order. Empty clears every effect.
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.

No output schema declared.

No examples provided.

figma_set_fill ~157

Replaces a node’s fills with one solid colour, and answers with the colour read back off the node — so a write that did not land is visible without a screenshot. It replaces every fill the node had, which is worth knowing before pointing it at a gradient or a photograph; the answer names what was there. Borders are strokes, not fills: use figma_set_stroke for those. One call is one undo step, so the designer takes it back with a single Cmd-Z.

NameTypeReqDescription
colorstringyesHex colour, like "#1e88e5".
nodeIdstringyesThe node to fill.
opacitynumberFill opacity, 0 to 1. Default 1.

No output schema declared.

No examples provided.

figma_set_instance_properties ~164

Sets which variant an instance is, and the text and booleans its component exposes. Take the keys from figma_component_properties; a key given without its id suffix is matched anyway, and one that matches nothing is refused with the list of what does. This is the difference between placing a component and using it. figma_create_instance gives you the default variant — this is how it becomes the large one, or the disabled one, with the right label.

NameTypeReqDescription
nodeIdstringFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
propertiesobjectyesKey to value. A variant takes its option name, a boolean property true or false, a text property a string.

No output schema declared.

No examples provided.

figma_set_layout_sizing ~104

How a child behaves inside an auto-layout frame: HUG shrinks to its contents, FILL stretches to the parent, FIXED keeps its size. This, not figma_set_bounds, is how widths are set inside auto layout.

NameTypeReqDescription
horizontalstring
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
verticalstring

No output schema declared.

No examples provided.

figma_set_node_name ~77

Renames a layer. Layer names are what the generated code turns into class names, so tidying them is a real change and not cosmetic.

NameTypeReqDescription
namestringyes
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.

No output schema declared.

No examples provided.

figma_set_stroke ~153

Replaces a node’s strokes with one solid colour, and optionally sets the stroke weight. Pass remove: true to take the stroke off entirely. Borders in Figma are strokes, not fills — a row outline or an icon drawn as an outline needs this rather than figma_set_fill.

NameTypeReqDescription
colorstringHex colour, like "#1e88e5". Omit only with remove.
nodeIdstringyesThe node to stroke.
opacitynumberStroke opacity, 0 to 1. Default 1.
removebooleanRemove every stroke instead of setting one.
weightnumberStroke weight in pixels. Left alone when omitted.

No output schema declared.

No examples provided.

figma_set_text ~69

Replaces the text of one TEXT node. The font is loaded first; a layer whose font is missing from this machine is refused rather than silently retyped in a substitute.

NameTypeReqDescription
nodeIdstringyesThe TEXT node to retype.
textstringyesThe new characters.

No output schema declared.

No examples provided.

figma_set_text_style ~174

Font, size, line height, letter spacing, alignment and colour, on a TEXT layer. Only what you name is changed. Prefer figma_apply_style where the file has a text style for it — a named style survives a redesign and a hard-coded 14px does not.

NameTypeReqDescription
alignstring
autoResizestring
colorstringHex colour.
fontFamilystring
fontSizenumber
fontStylestringWeight or style, like "Semi Bold".
letterSpacingnumberIn pixels.
lineHeightnumberIn pixels.
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.

No output schema declared.

No examples provided.

figma_set_visibility ~81

Sets opacity, visibility and lock. Hidden layers are skipped by extraction, which is often the point.

NameTypeReqDescription
lockedboolean
nodeIdstringyesFigma node id, like "21:10314". Omit to use whatever is selected on the canvas.
opacitynumber
visibleboolean

No output schema declared.

No examples provided.

figsnap_skill ~265

Whether this project has the figsnap skill installed, and the skill itself when it does not. The skill is what stops the usual mistakes: an agent handed figmaCss gets the geometry right and the type wrong, because Dev Mode CSS cannot say whether a height was authored or measured, which side of the bounds a stroke sits on, or that line-height is a box rather than a font metric. It also carries the artboard-to-device widths, the frame-versus-glyph padding an icon export has to keep, and the fact that a design system’s font is probably not on iOS. install answers with the file and where it goes; it does not write it. Whatever is calling this already asks before it writes into a repository, which is the right place for that question. Statuses are missing, current, or modified — an edited skill is the caller’s, so it is reported rather than replaced.

NameTypeReqDescription
actionstringDefault check.
projectDirstringThe project to look in. Default: the directory the MCP client is running in, which the bridge names on every call. Failing that, the daemon’s own — which is wherever it was started and usually not th…

No output schema declared.

No examples provided.

Common questions

What is the io.github.arimunandar/figsnap-mcp server?

io.github.arimunandar/figsnap-mcp is listed in the public MCP registry as io.github.arimunandar/figsnap-mcp. The Figma file you have open, as MCP tools. Extract, edit, and keep a saved set. This page covers its npm package (figsnap-mcp).

Is the io.github.arimunandar/figsnap-mcp server safe to use?

io.github.arimunandar/figsnap-mcp scores 90 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.arimunandar/figsnap-mcp server expose?

io.github.arimunandar/figsnap-mcp exposes 41 tools: figma_get_selection, figma_get_tree, figma_get_children, figma_extract, figma_export_png, and 36 more. Their descriptions and schemas cost roughly 5,697 tokens of context every time the server is loaded.

Is the io.github.arimunandar/figsnap-mcp server still maintained?

io.github.arimunandar/figsnap-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.arimunandar/figsnap-mcp server under?

io.github.arimunandar/figsnap-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.