figma-rust-mcp 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/plugin/code.js +54 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "figma-rust-mcp",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "Claude Code to Figma — Bidirectional MCP bridge. AI draws UI on Figma canvas, reads designs back. Works with Claude, Cursor, VS Code, Windsurf, Antigravity. No API key needed.",
5
5
  "mcpName": "io.github.BuiHung1612/figma-mcp",
6
6
  "type": "module",
package/plugin/code.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // figma-mcp — Figma Plugin main thread v1.2.1
2
2
  // Handles both WRITE (draw UI) and READ (extract design) operations.
3
3
  // AUTO-GENERATED by scripts/build-plugin.js — edit plugin-src/*.js instead
4
- // Generated: 2026-08-29T04:54:16.262Z
4
+ // Generated: 2026-08-29T13:39:20.933Z
5
5
 
6
6
  // ── plugin-src/utils.js ──
7
7
  // ─── UTILS ────────────────────────────────────────────────────────────────────
@@ -1348,7 +1348,7 @@ const handlers = {};
1348
1348
 
1349
1349
  handlers.status = async () => ({
1350
1350
  connected: true,
1351
- version: "3.0.1",
1351
+ version: "3.0.3",
1352
1352
  fileName: figma.root.name,
1353
1353
  currentPage: figma.currentPage.name,
1354
1354
  pageCount: figma.root.children.length,
@@ -1359,19 +1359,54 @@ handlers.listPages = async () =>
1359
1359
  figma.root.children.map(p => ({ id: p.id, name: p.name }));
1360
1360
 
1361
1361
  handlers.setPage = async (params) => {
1362
- var name = params.name || params.pageName || (typeof params.page === "string" ? params.page : null);
1363
- var id = params.id || params.pageId;
1362
+ if (typeof figma.loadAllPagesAsync === "function") {
1363
+ try { await figma.loadAllPagesAsync(); } catch (e) {}
1364
+ }
1365
+ params = params || {};
1366
+ var name = typeof params === "string" ? params : (params.name || params.pageName || params.title || (typeof params.page === "string" ? params.page : (params.page && typeof params.page.name === "string" ? params.page.name : null)));
1367
+ var id = (typeof params === "object" && params !== null) ? (params.id || params.pageId || (params.page && typeof params.page.id === "string" ? params.page.id : null)) : null;
1368
+ var index = (typeof params === "number") ? params : ((typeof params === "object" && params !== null) ? (params.index !== undefined ? params.index : params.pageIndex) : undefined);
1369
+
1364
1370
  var page = null;
1365
- if (id) page = figma.root.children.find(function(p) { return p.id === id; });
1366
- if (!page && name) page = figma.root.children.find(function(p) { return p.name === name; });
1367
- if (!page && figma.root.children.length === 1) page = figma.root.children[0];
1368
- if (!page) throw new Error("Page not found: \"" + (name || id) + "\". Available: " + figma.root.children.map(function(p) { return p.name; }).join(", "));
1371
+ if (id) {
1372
+ page = figma.root.children.find(function(p) { return p.id === id; });
1373
+ }
1374
+ if (!page && name) {
1375
+ page = figma.root.children.find(function(p) { return p.name === name; });
1376
+ if (!page) {
1377
+ // Case-insensitive & trimmed match fallback
1378
+ var lowerName = String(name).trim().toLowerCase();
1379
+ page = figma.root.children.find(function(p) { return p.name.trim().toLowerCase() === lowerName; });
1380
+ }
1381
+ }
1382
+ if (!page && typeof index === "number" && index >= 0 && index < figma.root.children.length) {
1383
+ page = figma.root.children[index];
1384
+ }
1385
+ if (!page && !name && !id && index === undefined && figma.root.children.length === 1) {
1386
+ page = figma.root.children[0];
1387
+ }
1388
+ if (!page) {
1389
+ var requested = name || id || (index !== undefined ? ("index " + index) : null);
1390
+ var available = figma.root.children.map(function(p) { return p.name; }).join(", ");
1391
+ if (requested) {
1392
+ throw new Error("Page not found: \"" + requested + "\". Available: " + available);
1393
+ } else {
1394
+ throw new Error("setPage requires a valid page name, id, or index. Available: " + available);
1395
+ }
1396
+ }
1369
1397
  await figma.setCurrentPageAsync(page);
1370
1398
  return { id: page.id, name: page.name };
1371
1399
  };
1372
1400
 
1373
- handlers.createPage = async ({ name }) => {
1374
- const existing = figma.root.children.find(p => p.name === name);
1401
+ handlers.createPage = async (params) => {
1402
+ if (typeof figma.loadAllPagesAsync === "function") {
1403
+ try { await figma.loadAllPagesAsync(); } catch (e) {}
1404
+ }
1405
+ var name = typeof params === "string" ? params : (params && (params.name || params.pageName || params.title));
1406
+ if (!name || typeof name !== "string") {
1407
+ throw new Error("createPage requires a valid page name string");
1408
+ }
1409
+ const existing = figma.root.children.find(p => p.name === name || p.name.trim().toLowerCase() === name.trim().toLowerCase());
1375
1410
  if (existing) return { id: existing.id, name: existing.name, existed: true };
1376
1411
  const page = figma.createPage();
1377
1412
  page.name = name;
@@ -3851,6 +3886,12 @@ handlers.get_design_context = async function(params) {
3851
3886
  };
3852
3887
  };
3853
3888
 
3889
+ // Aliases for developer convenience & MCP tool naming compatibility
3890
+ handlers.inspect_node = handlers.get_design_context;
3891
+ handlers.inspect = handlers.get_design_context;
3892
+ handlers.get_node_info = handlers.get_node_detail;
3893
+ handlers.node_detail = handlers.get_node_detail;
3894
+
3854
3895
  // get_component_map — list every component instance in a frame with variant properties
3855
3896
  // Use this to map Figma components to their code equivalents
3856
3897
  handlers.get_component_map = async function(params) {
@@ -4159,6 +4200,9 @@ handlers.get_variables = async function() {
4159
4200
  return { collections: collections, resolvedTokens: resolvedTokensMap };
4160
4201
  };
4161
4202
 
4203
+ handlers.get_tokens = handlers.get_variable_tokens;
4204
+ handlers.tokens = handlers.get_variable_tokens;
4205
+
4162
4206
  // ─── EXPORT ASSETS (Batch Icon & Image Extractor) ────────────────────────────
4163
4207
  handlers.export_assets = async function(params) {
4164
4208
  var id = params ? (params.id || params.nodeId) : null;