# io.github.arimunandar/figsnap-mcp (npm · figsnap-mcp)

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

- Trust score: 90/100 (high trust)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `figsnap-mcp`: 90/100 (this document), [markdown](https://verifymcp.io/servers/arimunandar-figsnap-mcp/figsnap-mcp.md), [page](https://verifymcp.io/servers/arimunandar-figsnap-mcp/figsnap-mcp)

## Channel facts

- Registry: `npm`
- Package: `figsnap-mcp`
- Version: `0.2.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 31 of 96 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to arimunandar/figsnap-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 13 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 60/100
  - Stability observed for 18 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 90/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 70% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## 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.

### Claude

```bash
claude mcp add arimunandar-figsnap-mcp -- npx -y figsnap-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "arimunandar-figsnap-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "arimunandar-figsnap-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
```

### Codex

```bash
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
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add arimunandar-figsnap-mcp --command npx --arg -y --arg figsnap-mcp
```

### Hermes

```yaml
mcp_servers:
  arimunandar-figsnap-mcp:
    command: "npx"
    args: ["-y", "figsnap-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "arimunandar-figsnap-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add arimunandar-figsnap-mcp -t stdio -c npx -a -y figsnap-mcp
```

### Other

```json
{
  "mcpServers": {
    "arimunandar-figsnap-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "figsnap-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 90, +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.

### 2026-09-18 (score 89, +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.

### 2026-09-16 (score 88, +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.

### 2026-09-14 (score 87, +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.

### 2026-09-12 (score 86, +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.

### 2026-09-10 (score 85, +1)

- [functional regression] Security disclosure: unverified → fail

### 2026-09-09 (score 84, 0)

- [functional regression] Security disclosure: fail → unverified

### 2026-09-08 (score 84, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (41)

### `figma_get_selection` (~52 tokens)

What is selected

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.

### `figma_get_tree` (~66 tokens)

Layers on the current page

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.

Input parameters:

- `depth` (integer): How many levels to walk. Default 1.

### `figma_get_children` (~63 tokens)

Children of one layer

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

Input parameters:

- `depth` (integer): How many levels to walk. Default 1.
- `nodeId` (string, required): The node whose children to list.

### `figma_extract` (~468 tokens)

Read a design as code

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.

Input parameters:

- `folder` (string): One 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.
- `formats` (array): Which 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…
- `inlineInstances` (boolean): Expand component instances instead of referencing them.
- `nodeId` (string): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `nodeIds` (array): Several node ids, extracted in one call. Up to 20.
- `saved` (boolean): Extract the designer’s saved set. Narrow it with folder.
- `scale` (number): Render scale for any image output. Default 2.
- `selection` (boolean): Extract every layer the designer has selected, not just the first.
- `topLayerOnly` (boolean): Stop at the selected layer rather than walking into it.
- `url` (string): A Figma link, as an alternative to nodeId.
- `urls` (array): Several Figma links, extracted in one call. Up to 20.

### `figma_export_png` (~70 tokens)

See the design

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.

Input parameters:

- `nodeId` (string, required): The node to render.
- `scale` (number): Render scale. Default 2.

### `figma_resolve_url` (~40 tokens)

What a Figma link points at

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

Input parameters:

- `urls` (array, required): Figma links to resolve.

### `figma_list_saved` (~55 tokens)

The designer’s saved set

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.

Input parameters:

- `folder` (string): Restrict to one folder.

### `figma_saved` (~352 tokens)

Curate the saved set

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.

Input parameters:

- `action` (string, required): Which of the nine.
- `deleteEntries` (boolean): For deleteFolder: remove what was in it too, rather than returning it to the root.
- `folder` (string): For list, save, clear and move. "" is the root; the folder must already exist for move.
- `from` (string): For renameFolder: the folder as it is called now.
- `name` (string): For newFolder and deleteFolder.
- `nodeIds` (array): For save, unsave and move. Omitting them on save means the current selection.
- `to` (string): For renameFolder: what to call it instead.

### `figma_list_library` (~93 tokens)

The design system in this file

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.

Input parameters:

- `only` (string): Narrow the answer. Default all three.

### `figma_select` (~146 tokens)

Show it on the canvas

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.

Input parameters:

- `nodeId` (string): One node to select and scroll to.
- `nodeIds` (array): Several, selected together and framed together. Up to 20.

### `figma_set_fill` (~157 tokens)

Set a solid fill

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.

Input parameters:

- `color` (string, required): Hex colour, like "#1e88e5".
- `nodeId` (string, required): The node to fill.
- `opacity` (number): Fill opacity, 0 to 1. Default 1.

### `figma_set_stroke` (~153 tokens)

Set or clear a stroke

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.

Input parameters:

- `color` (string): Hex colour, like "#1e88e5". Omit only with remove.
- `nodeId` (string, required): The node to stroke.
- `opacity` (number): Stroke opacity, 0 to 1. Default 1.
- `remove` (boolean): Remove every stroke instead of setting one.
- `weight` (number): Stroke weight in pixels. Left alone when omitted.

### `figma_set_text` (~69 tokens)

Set the characters of a text layer

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.

Input parameters:

- `nodeId` (string, required): The TEXT node to retype.
- `text` (string, required): The new characters.

### `figma_set_auto_layout` (~161 tokens)

Set auto layout on a frame

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.

Input parameters:

- `counterAxisAlignItems` (string): Alignment across the layout direction.
- `itemSpacing` (number): Gap between children.
- `mode` (string, required): Layout direction.
- `nodeId` (string, required): The frame, component or instance to lay out.
- `padding` (number): Shorthand: sets all four paddings.
- `paddingBottom` (number)
- `paddingLeft` (number)
- `paddingRight` (number)
- `paddingTop` (number)
- `primaryAxisAlignItems` (string): Alignment along the layout direction.

### `figma_create_frame` (~129 tokens)

Create a frame

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.

Input parameters:

- `fill` (string): Hex colour for a solid background. Omit to keep Figma’s default white.
- `height` (number): Default 100.
- `name` (string): Layer name. Default "Frame".
- `parentId` (string): Put it inside this node. Default: the current page.
- `width` (number): Default 100.
- `x` (number)
- `y` (number)

### `figma_create_text` (~178 tokens)

Add a text layer

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.

Input parameters:

- `color` (string): Hex colour for the text.
- `fontFamily` (string): Default Inter.
- `fontSize` (number)
- `fontStyle` (string): Weight or style, like "Bold". Default Regular.
- `name` (string): Layer name. Defaults to the text itself.
- `parentId` (string): Put it inside this node. Default: the current page.
- `text` (string, required): The characters.
- `width` (number): Fixed width, so the text wraps.
- `x` (number)
- `y` (number)

### `figma_create_rectangle` (~120 tokens)

Add a rectangle

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

Input parameters:

- `cornerRadius` (number)
- `fill` (string): Hex colour. Omit for no fill.
- `height` (number): Default 100.
- `name` (string)
- `parentId` (string): Put it inside this node. Default: the current page.
- `width` (number): Default 100.
- `x` (number)
- `y` (number)

### `figma_create_ellipse` (~97 tokens)

Add an ellipse

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

Input parameters:

- `fill` (string): Hex colour. Omit for no fill.
- `height` (number): Default 100.
- `name` (string)
- `parentId` (string)
- `width` (number): Default 100.
- `x` (number)
- `y` (number)

### `figma_create_svg` (~133 tokens)

Draw with SVG

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.

Input parameters:

- `height` (number)
- `name` (string)
- `parentId` (string)
- `svg` (string, required): The <svg> markup.
- `width` (number): Scale it to this width.
- `x` (number)
- `y` (number)

### `figma_create_instance` (~102 tokens)

Place a component

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.

Input parameters:

- `componentId` (string, required): From figma_list_library.
- `name` (string)
- `parentId` (string)
- `x` (number)
- `y` (number)

### `figma_clone_node` (~91 tokens)

Duplicate a layer

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.

Input parameters:

- `nodeId` (string, required): The node to copy.
- `parentId` (string): Where the copy goes. Default: beside the original.
- `x` (number)
- `y` (number)

### `figma_move_node` (~91 tokens)

Reparent or reorder a layer

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.

Input parameters:

- `index` (integer): Position among siblings.
- `nodeId` (string, required): The node to move.
- `parentId` (string): New parent. Default: keep the one it has.

### `figma_delete_node` (~58 tokens)

Delete a layer

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.

Input parameters:

- `nodeId` (string, required): The node to delete.

### `figma_set_bounds` (~103 tokens)

Move or resize

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.

Input parameters:

- `height` (number)
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `width` (number)
- `x` (number)
- `y` (number)

### `figma_set_corner_radius` (~101 tokens)

Round the corners

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

Input parameters:

- `bottomLeftRadius` (number)
- `bottomRightRadius` (number)
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `radius` (number): All four corners.
- `topLeftRadius` (number)
- `topRightRadius` (number)

### `figma_set_node_name` (~77 tokens)

Rename a layer

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

Input parameters:

- `name` (string, required)
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.

### `figma_set_visibility` (~81 tokens)

Hide, lock or fade a layer

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

Input parameters:

- `locked` (boolean)
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `opacity` (number)
- `visible` (boolean)

### `figma_set_effects` (~99 tokens)

Set shadows and blurs

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.

Input parameters:

- `effects` (array, required): In back-to-front order. Empty clears every effect.
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.

### `figma_set_text_style` (~174 tokens)

Set type on a text layer

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.

Input parameters:

- `align` (string)
- `autoResize` (string)
- `color` (string): Hex colour.
- `fontFamily` (string)
- `fontSize` (number)
- `fontStyle` (string): Weight or style, like "Semi Bold".
- `letterSpacing` (number): In pixels.
- `lineHeight` (number): In pixels.
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.

### `figma_set_layout_sizing` (~104 tokens)

Hug, fill or fix a size

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.

Input parameters:

- `horizontal` (string)
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `vertical` (string)

### `figma_apply_style` (~97 tokens)

Apply a shared style

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.

Input parameters:

- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `styleId` (string, required): From figma_list_library.

### `figma_bind_variable` (~137 tokens)

Bind a variable

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.

Input parameters:

- `field` (string, required): "fill", "stroke", or a numeric property such as cornerRadius or itemSpacing.
- `nodeId` (string, required): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `variableId` (string, required): From figma_list_library.

### `figma_save_version` (~69 tokens)

Checkpoint the file

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.

Input parameters:

- `description` (string)
- `title` (string, required): What this checkpoint is for.

### `figma_find_nodes` (~242 tokens)

Find layers

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.

Input parameters:

- `allPages` (boolean): Search every page in the file. Slower, and the answer names the page each row is on.
- `limit` (integer): Most rows to return. Default 50.
- `name` (string): Substring of the layer name, case-insensitive.
- `nodeId` (string): Search inside this branch instead of the whole page.
- `text` (string): Substring of a text layer’s words, case-insensitive. Implies TEXT.
- `types` (array): Layer types to keep. Omit for any type.

### `figma_pages` (~159 tokens)

The pages, and which one is open

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.

Input parameters:

- `action` (string, required): Which of the two.
- `name` (string): For open: the page name, if you have no id.
- `pageId` (string): For open: the page id from list.

### `figma_component_properties` (~120 tokens)

What a component exposes

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.

Input parameters:

- `nodeId` (string): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.

### `figma_group` (~138 tokens)

Group or ungroup

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.

Input parameters:

- `action` (string): Default group.
- `name` (string): For group: what to call it.
- `nodeId` (string): For ungroup: the group or frame to dissolve.
- `nodeIds` (array): For group: the layers to gather, up to 20.

### `figma_insert_image` (~248 tokens)

Put an image on the canvas

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.

Input parameters:

- `data` (string, required): The image as base64. A data: URL prefix is accepted and ignored.
- `height` (number): Default: the image’s own height.
- `name` (string)
- `nodeId` (string): Fill this layer instead of making a new one.
- `parentId` (string): Where a new rectangle goes. Default: the current page.
- `scaleMode` (string): How it sits in the frame. Default FILL.
- `width` (number): Default: the image’s own width.
- `x` (number)
- `y` (number)

### `figma_set_instance_properties` (~164 tokens)

Set an instance’s properties

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.

Input parameters:

- `nodeId` (string): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `properties` (object, required): Key to value. A variant takes its option name, a boolean property true or false, a text property a string.

### `figma_ios_spec` (~375 tokens)

The design as node properties

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.

Input parameters:

- `nodeId` (string): Figma node id, like "21:10314". Omit to use whatever is selected on the canvas.
- `scale` (number): The 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.

### `figsnap_skill` (~265 tokens)

The skill for reading a design

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.

Input parameters:

- `action` (string): Default check.
- `projectDir` (string): The 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…

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/arimunandar-figsnap-mcp/figsnap-mcp#diagnostics

## Score history

- 2026-09-20: 90
- 2026-09-19: 89
- 2026-09-18: 89
- 2026-09-17: 88
- 2026-09-16: 88
- 2026-09-15: 87
- 2026-09-14: 87
- 2026-09-13: 86
- 2026-09-12: 86
- 2026-09-11: 85
- 2026-09-10: 85
- 2026-09-09: 84
- 2026-09-08: 84
- 2026-09-07: 69
- 2026-09-06: 81
- 2026-09-05: 81
- 2026-09-04: 81
- 2026-09-03: 81
- 2026-09-02: 66

## 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.

## Links

- npm package: https://www.npmjs.com/package/figsnap-mcp
- Socket report: https://socket.dev/npm/package/figsnap-mcp
- Repository: https://github.com/arimunandar/figsnap-mcp
- Changelog RSS feed: https://verifymcp.io/servers/arimunandar-figsnap-mcp/figsnap-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/arimunandar-figsnap-mcp/figsnap-mcp.json
- HTML version of this page: https://verifymcp.io/servers/arimunandar-figsnap-mcp/figsnap-mcp
