A side-by-side look at the Figsnap MCP and HTML to Figma — Design System MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Figsnap MCP for architecture & design work as a local process; choose HTML to Figma — Design System for architecture & design as a local process. You can also run both side by side in one mcpServers block.
FIGSNAP_MCP_TOKEN, FIGSNAP_MCP_URL.figma_get_selection, figma_get_tree, figma_get_children.mimic_status, mimic_discover_ds, figma_preload_styles.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Architecture & Design | Architecture & Design |
| Quality signal | 59/100 · Good | 60/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | FIGSNAP_MCP_TOKENFIGSNAP_MCP_URL | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 0 | 14 |
| Directory activity | 1 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 41 | 60 |
| Full listing | View Figsnap MCP | View HTML to Figma — Design System |
figma_get_selectionThe 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_treeThe 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.figma_get_childrenThe direct children of one node, by id. The cheap way to explore a page a branch at a time.figma_extractThe 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.figma_export_pngRenders 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.figma_resolve_urlTurns one or more Figma links into the nodes they name, without exporting anything.figma_list_savedThe 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.figma_savedRead 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.figma_list_libraryThe 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.figma_selectSelects 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.figma_set_fillReplaces 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.figma_set_strokeReplaces 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.mimic_statusReturns plugin connection status, current build phase, enforcement profile, knowledge store summary, and a contextual hint for what to do next.mimic_discover_dsComplete DS discovery in two steps. Step 1: call with fileKey — discovers variables, text styles, components via plugin API, caches everything, stays at Phase 1. Step 2: call again with communitySearchResults (library names from Figma MCP search_design_system) — verifies no community libraries were missed, then advances to Phase 2 (build-ready). Build tools are BLOCKED until Step 2 completes. If a community library's variables are not discoverable via the plugin API (communityVariablesRequired response), fetch them via Figma MCP search_design_system and pass as externalVariables.figma_preload_stylesSends text style keys to the plugin for caching. Call during DS setup phase.figma_preload_variablesStores DS variables in the local cache for enforcement and resolution.figma_set_session_defaultsComputes the enforcement profile from cached DS data and sends it to the plugin. Advances to Phase 2 (inventory ready).figma_list_text_stylesReturns all cached text styles from the DS.figma_preload_fill_stylesPreloads fill (color) styles into the DS cache from a library file key. Call when discovery missed fill styles (e.g. library variables not enumerable but fill styles exist in the REST API).figma_list_fill_stylesReturns all cached fill (color) styles from the DS. Use the style key as fillStyleId in create_frame, create_text, create_rectangle, create_ellipse, or set_node_fill.figma_discover_library_stylesDiscovers and caches text styles from a Figma library file.figma_discover_library_variablesDiscovers and caches variables from a Figma library file.figma_discover_library_componentsScans existing component instances on the current page to discover available DS library components, their keys, and variant properties. Call during DS discovery phase.mimic_map_componentsMaps HTML element types to DS component keys. Call once to get initial mapping. If FIGMA_TOKEN is configured (REST API discovery), all library components are already cached — missing types after the first call are confirmed gaps, proceed to build. If REST API is not available (no token), search the library via Figma MCP search_design_system for missing types, then call AGAIN with librarySearchResults to confirm gaps.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"figsnap-mcp": {
"command": "npx",
"args": [
"-y",
"figsnap-mcp"
],
"env": {
"FIGSNAP_MCP_TOKEN": "YOUR_FIGSNAP_MCP_TOKEN_HERE",
"FIGSNAP_MCP_URL": "YOUR_FIGSNAP_MCP_URL_HERE"
}
}
}
}
{
"mcpServers": {
"html-to-figma-design-system": {
"command": "npx",
"args": [
"-y",
"@miapre/mimic-ai"
]
}
}
}