{"_id":"@alvinindra/figma-mcp-rust","_rev":"7-4d2e48e54a94e9c6eb7e54b709bd0539","name":"@alvinindra/figma-mcp-rust","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.2":{"name":"@alvinindra/figma-mcp-rust","version":"0.1.2","keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"license":"MIT","_id":"@alvinindra/figma-mcp-rust@0.1.2","maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"bin":{"figma-mcp-rust":"bin/run.js"},"dist":{"shasum":"ff6b852a9af5c93709c6b2ed236e29c66f28ac3a","tarball":"https://registry.npmjs.org/@alvinindra/figma-mcp-rust/-/figma-mcp-rust-0.1.2.tgz","fileCount":9,"integrity":"sha512-j2Npav0f7L2RCblUbydrcHo1LTZ2K4AlIDHVmls9g9+W/p08ns/gN05VDZdjJpI64YrGLf9q34h6SPFKhFw1sA==","signatures":[{"sig":"MEQCIEXup4FpS+cDk6Idy6O3AcF0FJjLAG7TWUKPSzfIhWN7AiAdYZSXe5SQ6/YE0LJQg1QDwj05CyxyRcFQJYkiBCMSFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46773571},"engines":{"node":">=18.0.0"},"gitHead":"6b8619e2c33157698e591c243637615398e5a7b4","mcpName":"io.github.alvinindra/figma-mcp-rust","_npmUser":{"name":"alvinindra","email":"alvinindrap@gmail.com"},"repository":{"url":"git+https://github.com/alvinindra/figma-mcp-rust.git","type":"git"},"_npmVersion":"10.8.2","description":"A zero-cost, unlimited Figma MCP server — no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/figma-mcp-rust_0.1.2_1779760787420_0.33973059607881595","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@alvinindra/figma-mcp-rust","version":"0.1.3","keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"license":"MIT","_id":"@alvinindra/figma-mcp-rust@0.1.3","maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"bin":{"figma-mcp-rust":"bin/run.js"},"dist":{"shasum":"167fe8be9c1bd65f4e2d49f36ce180b06ef97315","tarball":"https://registry.npmjs.org/@alvinindra/figma-mcp-rust/-/figma-mcp-rust-0.1.3.tgz","fileCount":9,"integrity":"sha512-q5050W8/tVhgMgtEdbmNTqtVDPztpMxSPY5p/HMjv2A580cxb843uDIh5BI2YrbIbZ+Y2IK0YqJqfw0ej7GD1Q==","signatures":[{"sig":"MEUCIDq/PDvgwItqGoxoYk0f/h5xElk4annyRzaiR8Qso1xkAiEA8m4PAVz718QEE1rL5b5oqWkLbz1nflk2ZRENHfpIzv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46773611},"engines":{"node":">=18.0.0"},"gitHead":"ce46e97d5533432cf378965556c96709afd70e31","mcpName":"io.github.alvinindra/figma-mcp-rust","_npmUser":{"name":"alvinindra","email":"alvinindrap@gmail.com"},"repository":{"url":"git+https://github.com/alvinindra/figma-mcp-rust.git","type":"git"},"_npmVersion":"10.8.2","description":"A zero-cost, unlimited Figma MCP server — no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/figma-mcp-rust_0.1.3_1779761230920_0.43929100045403735","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@alvinindra/figma-mcp-rust","version":"0.1.4","keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"license":"MIT","_id":"@alvinindra/figma-mcp-rust@0.1.4","maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"bin":{"figma-mcp-rust":"bin/run.js"},"dist":{"shasum":"554f1e42338da2e709fa911279be892598680331","tarball":"https://registry.npmjs.org/@alvinindra/figma-mcp-rust/-/figma-mcp-rust-0.1.4.tgz","fileCount":9,"integrity":"sha512-XXsHzVvnODB94+Kk5+bOk4i7+2/mgPSOWa9T9cgbZc9ItB/3KJ2KXHze00uK5jmQASoFxab3NhPFTo2mLRCsOg==","signatures":[{"sig":"MEQCIGO5lVcvtWkoR3893bxprL5Aq1HEEaMXCFEt3BHHQ6RRAiAbti1Uy2Dj9mjwkUbZzEYJJwkA+kgXHtXcSEaF/z2/YA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46774931},"engines":{"node":">=18.0.0"},"gitHead":"5453dcfa69f744b4b27d93069ebedb7af5339bb9","mcpName":"io.github.alvinindra/figma-mcp-rust","_npmUser":{"name":"alvinindra","email":"alvinindrap@gmail.com"},"repository":{"url":"git+https://github.com/alvinindra/figma-mcp-rust.git","type":"git"},"_npmVersion":"10.8.2","description":"A zero-cost, unlimited Figma MCP server — no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/figma-mcp-rust_0.1.4_1779766748799_0.8960686417380834","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@alvinindra/figma-mcp-rust","version":"0.1.5","keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"license":"MIT","_id":"@alvinindra/figma-mcp-rust@0.1.5","maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"bin":{"figma-mcp-rust":"bin/run.js"},"dist":{"shasum":"9342224ea040245d861bd2e2dbded03fc3acbc7a","tarball":"https://registry.npmjs.org/@alvinindra/figma-mcp-rust/-/figma-mcp-rust-0.1.5.tgz","fileCount":9,"integrity":"sha512-oJRxn9OTuVaICJrGR/CnBbQsL1DzaiGN8mqC9h5xaAWXe0jwpD3srXrbf29gSljKkNe3krhf5n/SIB1TffD9fA==","signatures":[{"sig":"MEUCIQD6QUtW6ns0fEUFExlr+I+YpG4Kr4rw/gU0NgbT0iuraQIgNh/AVZoH2FAkEHf0sx83ShkZ6l2aF/jPdsCbARErVDc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46616616},"engines":{"node":">=18.0.0"},"gitHead":"97fc80b3bd18b4613ffc2ada9584056da46ef080","mcpName":"io.github.alvinindra/figma-mcp-rust","_npmUser":{"name":"alvinindra","email":"alvinindrap@gmail.com"},"repository":{"url":"git+https://github.com/alvinindra/figma-mcp-rust.git","type":"git"},"_npmVersion":"10.8.2","description":"A zero-cost, unlimited Figma MCP server — no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/figma-mcp-rust_0.1.5_1784044376219_0.41427368235384243","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@alvinindra/figma-mcp-rust","version":"0.1.6","keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"license":"MIT","_id":"@alvinindra/figma-mcp-rust@0.1.6","maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"bin":{"figma-mcp-rust":"bin/run.js"},"dist":{"shasum":"bddcf556edfed35a08e1884b66e0f139fbb63b55","tarball":"https://registry.npmjs.org/@alvinindra/figma-mcp-rust/-/figma-mcp-rust-0.1.6.tgz","fileCount":9,"integrity":"sha512-MlGYr22gbOtUly4PHpBs8i/JSuygalBYkmL+wPrIfmdczdRhK57qxy7F95UUG/e6Md/TvhWuSWunOpvLd6csJQ==","signatures":[{"sig":"MEUCIQCm/KXVixICj9T13HjEgIomUtiIBjaG8jkxD0drE+H58QIgda3Z2tNQidw8MXbUEWG8wKmfYONzEv+lYxdJm1joc28=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46757064},"engines":{"node":">=18.0.0"},"gitHead":"7861ee7dda2138e463d9ac3949ce5f5b7078c1a5","mcpName":"io.github.alvinindra/figma-mcp-rust","_npmUser":{"name":"alvinindra","email":"alvinindrap@gmail.com"},"repository":{"url":"git+https://github.com/alvinindra/figma-mcp-rust.git","type":"git"},"_npmVersion":"10.8.2","description":"A zero-cost, unlimited Figma MCP server — no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/figma-mcp-rust_0.1.6_1785821042644_0.9870103493109963","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@alvinindra/figma-mcp-rust","version":"0.1.7","keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"license":"MIT","_id":"@alvinindra/figma-mcp-rust@0.1.7","maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"bin":{"figma-mcp-rust":"bin/run.js"},"dist":{"shasum":"5375a45e4a52a29b8c69e47a670fcfc9508243e4","tarball":"https://registry.npmjs.org/@alvinindra/figma-mcp-rust/-/figma-mcp-rust-0.1.7.tgz","fileCount":9,"integrity":"sha512-7HH3T35WKZ48sgLKlkee5gu3ZBNQUbwBnYqz8ntwJ4MGnVOlQYO4lYNOkV/mo0meY6EZ3+ESVyZz0EQbhXMbRw==","signatures":[{"sig":"MEQCIEHZwBR7QKsQx3gwPHzUGoZNqNeVqZ9tS4BTE3Si/eJbAiBuTcZHTgIbUEf8SusZ/O+nb9D3wd2eu8RvP0zscZ9Gjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46757853},"engines":{"node":">=18.0.0"},"gitHead":"0f04468509786990697524c5aadb542eb092a28c","mcpName":"io.github.alvinindra/figma-mcp-rust","_npmUser":{"name":"alvinindra","email":"alvinindrap@gmail.com"},"repository":{"url":"git+https://github.com/alvinindra/figma-mcp-rust.git","type":"git"},"_npmVersion":"10.8.2","description":"Zero-cost, unlimited Figma MCP server: no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/figma-mcp-rust_0.1.7_1785850909930_0.8876131127291251","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alvinindra/figma-mcp-rust","version":"0.2.0","description":"Zero-cost, unlimited Figma MCP server: no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","mcpName":"io.github.alvinindra/figma-mcp-rust","bin":{"figma-mcp-rust":"bin/run.js"},"keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/alvinindra/figma-mcp-rust.git"},"homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"engines":{"node":">=18.0.0"},"_id":"@alvinindra/figma-mcp-rust@0.2.0","gitHead":"6094566436577b29d04393c774d51492c12671e1","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-sMJvWUD+U9CTMr0PMs9MBIQ4DmUxfZ7f/WthiWsCIBoI7TtZXtGCwA1oOObC/KG11CaQ+pBkVy4VhF+Jzvr7gA==","shasum":"612166fe5f76b01fddecd8be58e726cf17bd2641","tarball":"https://registry.npmjs.org/@alvinindra/figma-mcp-rust/-/figma-mcp-rust-0.2.0.tgz","fileCount":9,"unpackedSize":50766133,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHeelb1Q6erbY+2xp8oxEywZaEqf9aEj7Qvs0Ubg5pqDAiEAhHhDL+z15Ns+CnZrQRueBP08+Cm3ytLpzgS3L//Yr1A="}]},"_npmUser":{"name":"alvinindra","email":"alvinindrap@gmail.com"},"directories":{},"maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/figma-mcp-rust_0.2.0_1787136427397_0.47995419042165444"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T01:59:47.261Z","modified":"2026-08-19T10:47:08.074Z","0.1.2":"2026-05-26T01:59:48.345Z","0.1.3":"2026-05-26T02:07:11.429Z","0.1.4":"2026-05-26T03:39:09.251Z","0.1.5":"2026-07-14T15:52:56.686Z","0.1.6":"2026-08-04T05:24:03.050Z","0.1.7":"2026-08-04T13:41:50.360Z","0.2.0":"2026-08-19T10:47:07.892Z"},"bugs":{"url":"https://github.com/alvinindra/figma-mcp-rust/issues"},"license":"MIT","homepage":"https://github.com/alvinindra/figma-mcp-rust#readme","keywords":["figma","mcp","model-context-protocol","ai","design","rust"],"repository":{"type":"git","url":"git+https://github.com/alvinindra/figma-mcp-rust.git"},"description":"Zero-cost, unlimited Figma MCP server: no API key, no rate limits (Rust port of vkhanhqui/figma-mcp-go)","maintainers":[{"name":"alvinindra","email":"alvinindrap@gmail.com"}],"readme":"# figma-mcp-rust\n\n> A high-performance Rust port of **[vkhanhqui/figma-mcp-go](https://github.com/vkhanhqui/figma-mcp-go)**.\n> All credit for the original design, the Figma plugin bridge, and the tool catalogue goes to\n> [@vkhanhqui](https://github.com/vkhanhqui). This repo migrates that same MCP server to Rust\n> with structured logging, race-free request correlation, and a declarative tool table;\n> see \"What changed in the Rust rewrite\" below.\n\nFigma MCP: Free, No Rate Limits\n<p>\n  <a href=\"https://www.npmjs.com/package/@alvinindra/figma-mcp-rust\"><img src=\"https://img.shields.io/npm/v/@alvinindra/figma-mcp-rust?color=blue\" alt=\"npm version\" /></a>\n  <a href=\"https://registry.modelcontextprotocol.io/?q=figma-mcp-rust\"><img src=\"https://img.shields.io/badge/MCP-Registry-purple\" alt=\"MCP Registry\" /></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\" /></a>\n  <a href=\"https://github.com/alvinindra/figma-mcp-rust/stargazers\"><img src=\"https://img.shields.io/github/stars/alvinindra/figma-mcp-rust?style=social\" alt=\"GitHub stars\" /></a>\n</p>\n\nOpen-source Figma MCP server with full read/write access via plugin. No REST API, no rate limits. Turn text into designs and designs into real code. Works with Cursor, Claude, GitHub Copilot, and any MCP-compatible AI tool.\n\n**Highlights**\n- No Figma API token required\n- No rate limits, free plan friendly\n- **Read and Write** live Figma data via plugin bridge, 73 tools in total\n- Full design automation: styles, variables, components, prototypes, and content\n- Design strategies built in as MCP prompts, plus matching Claude Code skills\n\n---\n\n## Why this exists\n\nMost Figma MCP servers rely on the **Figma REST API**.\n\nThat sounds fine until you hit this:\n\n| Plan | Limit |\n|------|-------|\n| Starter / View / Collab | **6 tool calls/month** |\n| Pro / Org (Dev seat) | 200 tool calls/day |\n| Enterprise | 600 tool calls/day |\n\nIf you're experimenting with AI tools, you'll burn through that in minutes.\n\nI didn't have enough money to pay for higher limits.\nSo I built something that **doesn't use the API at all**.\n\n---\n\n## Installation & Setup\n\nInstall via `npx`, no build step required.\n\n### 1. Configure your AI tool\n\n**Claude Code CLI**\n```bash\nclaude mcp add -s project figma-mcp-rust -- npx -y @alvinindra/figma-mcp-rust@latest\n```\n\n**Claude Code plugin marketplace**\n```bash\n/plugin marketplace add alvinindra/figma-mcp-rust\n/plugin install figma-mcp-rust@figma-mcp-rust\n```\n\nInstalling the plugin also adds 13 skills covering the workflows below, from reading designs to generating tokens and troubleshooting the bridge.\n\n**Codex CLI**\n```bash\ncodex mcp add figma-mcp-rust -- npx -y @alvinindra/figma-mcp-rust@latest\n```\n\n**.mcp.json** (Claude and other MCP-compatible tools)\n```json\n{\n  \"mcpServers\": {\n    \"figma-mcp-rust\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@alvinindra/figma-mcp-rust\"]\n    }\n  }\n}\n```\n\n**.vscode/mcp.json** (Cursor / VS Code / GitHub Copilot)\n```json\n{\n  \"servers\": {\n    \"figma-mcp-rust\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@alvinindra/figma-mcp-rust\"\n      ]\n    }\n  }\n}\n```\n\n### 2. Install the Figma plugin\n\n1. In Figma Desktop: **Plugins → Development → Import plugin from manifest**\n2. Select `manifest.json` from the [plugin.zip](https://github.com/alvinindra/figma-mcp-rust/releases)\n3. Run the plugin inside any Figma file\n\n---\n\n## Available Tools\n\n### Write: Create\n\n| Tool | Description |\n|------|-------------|\n| `create_frame` | Create a frame with optional auto-layout, fill, and parent |\n| `create_rectangle` | Create a rectangle with optional fill and corner radius |\n| `create_ellipse` | Create an ellipse or circle |\n| `create_text` | Create a text node (font loaded automatically) |\n| `import_image` | Decode base64 image and place it as a rectangle fill |\n| `create_component` | Convert an existing FRAME node into a reusable component |\n| `create_section` | Create a Figma Section node to organise frames on a page |\n\n### Write: Modify\n\n| Tool | Description |\n|------|-------------|\n| `set_text` | Update text content of an existing TEXT node |\n| `set_fills` | Set solid fill color (hex) on a node |\n| `set_strokes` | Set solid stroke color and weight on a node |\n| `set_opacity` | Set opacity of one or more nodes (0 = transparent, 1 = opaque) |\n| `set_corner_radius` | Set corner radius, uniform or per-corner |\n| `set_auto_layout` | Set or update auto-layout (flex) properties on a frame |\n| `set_visible` | Show or hide one or more nodes |\n| `lock_nodes` | Lock one or more nodes to prevent accidental edits |\n| `unlock_nodes` | Unlock one or more nodes |\n| `rotate_nodes` | Set absolute rotation in degrees on one or more nodes |\n| `reorder_nodes` | Change z-order: `bringToFront`, `sendToBack`, `bringForward`, `sendBackward` |\n| `set_blend_mode` | Set blend mode (MULTIPLY, SCREEN, OVERLAY, and more) on one or more nodes |\n| `set_constraints` | Set responsive constraints `{ horizontal, vertical }` on one or more nodes |\n| `move_nodes` | Move nodes to an absolute x/y position |\n| `resize_nodes` | Resize nodes by width and/or height |\n| `rename_node` | Rename a node |\n| `clone_node` | Clone a node, optionally repositioning or reparenting |\n| `reparent_nodes` | Move nodes to a different parent frame, group, or section |\n| `batch_rename_nodes` | Bulk rename nodes via find/replace, regex, or prefix/suffix |\n| `find_replace_text` | Find and replace text across all TEXT nodes in a subtree or page; supports regex |\n\n### Write: Delete\n\n| Tool | Description |\n|------|-------------|\n| `delete_nodes` | Delete one or more nodes permanently |\n\n### Write: Prototype\n\n| Tool | Description |\n|------|-------------|\n| `set_reactions` | Set prototype reactions (triggers + actions) on a node; mode `replace` or `append` |\n| `remove_reactions` | Remove all or specific reactions by zero-based index from a node |\n\n### Write: Styles\n\n| Tool | Description |\n|------|-------------|\n| `set_effects` | Apply drop shadow / blur effects directly on a node (no style required) |\n| `create_paint_style` | Create a named paint style with a solid color |\n| `create_text_style` | Create a named text style with font, size, and spacing |\n| `create_effect_style` | Create a named effect style (drop shadow, inner shadow, blur) |\n| `create_grid_style` | Create a named layout grid style (columns, rows, or grid) |\n| `update_paint_style` | Rename or recolor an existing paint style |\n| `apply_style_to_node` | Apply an existing local style to a node, linking it to that style |\n| `delete_style` | Delete any style (paint, text, effect, or grid) by ID |\n\n### Write: Variables\n\n| Tool | Description |\n|------|-------------|\n| `create_variable_collection` | Create a new local variable collection with an optional initial mode |\n| `add_variable_mode` | Add a new mode to an existing collection (e.g. Light/Dark) |\n| `create_variable` | Create a variable (COLOR/FLOAT/STRING/BOOLEAN) in a collection |\n| `set_variable_value` | Set a variable's value for a specific mode |\n| `bind_variable_to_node` | Bind a variable to a node property; supports `fillColor`, `strokeColor`, `visible`, `opacity`, `rotation`, `width`, `height`, corner radii, spacing, and more |\n| `delete_variable` | Delete a variable or an entire collection |\n\n### Write: Pages\n\n| Tool | Description |\n|------|-------------|\n| `add_page` | Add a new page to the document (optional name and index) |\n| `delete_page` | Delete a page by ID or name (cannot delete the only page) |\n| `rename_page` | Rename a page by ID or current name |\n\n### Write: Components & Navigation\n\n| Tool | Description |\n|------|-------------|\n| `navigate_to_page` | Switch the active Figma page by ID or name |\n| `group_nodes` | Group two or more nodes into a GROUP |\n| `ungroup_nodes` | Ungroup GROUP nodes, moving children to the parent |\n| `swap_component` | Swap the main component of an INSTANCE node |\n| `detach_instance` | Detach component instances, converting them to plain frames |\n\n### Read: Document & Selection\n\n| Tool | Description |\n|------|-------------|\n| `get_document` | Full current page tree |\n| `get_metadata` | File name, pages, current page |\n| `get_pages` | All pages (IDs + names), lightweight, no tree loading |\n| `get_selection` | Currently selected nodes |\n| `get_node` | Single node by ID |\n| `get_nodes_info` | Multiple nodes by ID |\n| `get_design_context` | Depth-limited tree with `detail` level (`minimal`/`compact`/`full`) |\n| `search_nodes` | Find nodes by name substring and/or type within a subtree |\n| `scan_text_nodes` | All text nodes in a subtree |\n| `scan_nodes_by_types` | Nodes matching given type list |\n| `get_viewport` | Current viewport center, zoom, and visible bounds |\n\n### Read: Styles & Variables\n\n| Tool | Description |\n|------|-------------|\n| `get_styles` | Paint, text, effect, and grid styles |\n| `get_variable_defs` | Variable collections and values |\n| `get_local_components` | All components + component sets with variant properties |\n| `get_annotations` | Dev-mode annotations |\n| `get_fonts` | All fonts used on the current page, sorted by frequency |\n| `get_reactions` | Prototype/interaction reactions on a node |\n\n### Export\n\n| Tool | Description |\n|------|-------------|\n| `get_screenshot` | Base64 image export of any node |\n| `save_screenshots` | Export images to disk (server-side, no API call) |\n| `export_frames_to_pdf` | Export multiple frames as a single multi-page PDF file saved to disk |\n| `export_tokens` | Export design tokens (variables + paint styles) as JSON or CSS |\n\n### MCP Prompts\n\n| Prompt | Description |\n|--------|-------------|\n| `read_design_strategy` | Best practices for reading Figma designs |\n| `design_strategy` | Best practices for creating and modifying designs |\n| `text_replacement_strategy` | Chunked approach for replacing text across a design |\n| `annotation_conversion_strategy` | Convert manual annotations to native Figma annotations |\n| `swap_overrides_instances` | Transfer overrides between component instances |\n| `reaction_to_connector_strategy` | Map prototype reactions into interaction flow diagrams |\n| `style_audit_strategy` | Find nodes using raw values instead of linked styles or variables |\n| `bulk_rename_strategy` | Rename nodes to follow a consistent naming convention |\n| `design_token_generation_strategy` | Build a variable and style token system from an existing design |\n| `generate_color_palette` | Create a primitive color scale plus semantic aliases as variables |\n| `generate_type_scale` | Create a full typographic scale as text styles |\n| `generate_component_variants` | Clone a component into size, theme, state, or dark-mode variants |\n\nEach prompt is also available as a Claude Code skill when the server is installed through the plugin marketplace, alongside a `bridge-troubleshooting` skill for connection issues.\n\n---\n\n## Related Projects\n\n- [vkhanhqui/figma-mcp-go](https://github.com/vkhanhqui/figma-mcp-go), the Go original\n- [magic-spells/figma-mcp-bridge](https://github.com/magic-spells/figma-mcp-bridge)\n- [grab/cursor-talk-to-figma-mcp](https://github.com/grab/cursor-talk-to-figma-mcp)\n- [gethopp/figma-mcp-bridge](https://github.com/gethopp/figma-mcp-bridge)\n\n---\n\n## What changed in the Rust rewrite\n\n- **Memory-safe websocket bridge**: request/response correlation uses `tokio::sync::oneshot`\n  instead of Go channels guarded by `sync.Once`, removing the send-on-closed-channel race.\n- **Declarative tool table**: all 73 tool registrations live in a single static array\n  (`src/tools/definitions.rs`) instead of ~700 lines of repetitive Go handlers. New tools\n  are added by appending one entry plus an optional JSON Schema builder.\n- **Structured logging via `tracing`**: every component emits per-target events\n  (`bridge`, `leader`, `follower`, `election`, `node`) at adjustable levels. Set\n  `FIGMA_MCP_LOG=debug` for verbose output.\n- **`thiserror`-based error types** instead of formatted strings, so callers can match on\n  specific failure modes (`NotConnected`, `Timeout`, etc.).\n- **Pure-Rust PDF merging** via `lopdf`, no external CLI dependency.\n- **First-class CLI via `clap`** with derived help text and validation.\n\n## Contributing\n\nIssues and PRs are welcome.\n\n## Star History\n\n<a href=\"https://www.star-history.com/#alvinindra/figma-mcp-rust&Date\">\n <picture>\n   <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=alvinindra/figma-mcp-rust&type=Date&theme=dark\" />\n   <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=alvinindra/figma-mcp-rust&type=Date\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=alvinindra/figma-mcp-rust&type=Date\" />\n </picture>\n</a>\n","readmeFilename":"README.md"}