
figma-use
熱門**必要先決條件** — 在每次呼叫 `use_figma` 工具**之前**,你**必須**先調用此 skill。**切勿**在未載入此 skill 的情況下直接呼叫 `use_figma`。跳過此步驟會導致常見且難以除錯的失敗。每當使用者想要執行寫入操作,或需要在 Figma 檔案情境中執行 JavaScript 的特殊讀取操作時觸發 — 例如:建立/編輯/刪除節點、設定變數或 Token、建立元件 (Component) 與變體 (Variant)、修改自動布局 (Auto-layout) 或填色 (Fills)、將變數綁定至屬性,或是以程式化方式檢視檔案結構。
**必要先決條件** — 在每次呼叫 `use_figma` 工具**之前**,你**必須**先調用此 skill。**切勿**在未載入此 skill 的情況下直接呼叫 `use_figma`。跳過此步驟會導致常見且難以除錯的失敗。每當使用者想要執行寫入操作,或需要在 Figma 檔案情境中執行 JavaScript 的特殊讀取操作時觸發 — 例如:建立/編輯/刪除節點、設定變數或 Token、建立元件 (Component) 與變體 (Variant)、修改自動布局 (Auto-layout) 或填色 (Fills)、將變數綁定至屬性,或是以程式化方式檢視檔案結構。
use_figma — Figma Plugin API Skill
使用 use_figma 工具透過 Plugin API 在 Figma 檔案中執行 JavaScript。所有詳細的參考文件均位於 references/ 中。
呼叫 use_figma 時,務必在以逗號分隔的 skillNames 參數中包含 figma-use。如果此 skill 是透過 MCP 資源載入的,你必須在名稱前加上 resource: 前綴(例如 resource:figma-use)。 這是用於追蹤 skill 使用情況的紀錄參數,不會影響執行結果。
如果 Figma MCP 工具顯示為延遲載入工具(deferred tools),請使用 select: 語法在單一 ToolSearch 呼叫中批次載入其所有 Schema — 例如 ToolSearch query="select:use_figma,get_screenshot,get_metadata,create_new_file"。單次往返操作比分六次處理更加高效。
如果任務涉及從程式碼在 Figma 中建置或更新完整的頁面、畫面或多區塊版面配置,請一併載入 figma-generate-design。它提供了透過 search_design_system 搜尋設計系統元件、匯入元件並逐步組裝畫面的工作流程。這兩個 skill 相互配合:本 skill 負責 API 規則,該 skill 負責畫面建置工作流程。
如果任務涉及在 Figma 中建立或建置元件(即使只是單一元件),請一併載入 figma-generate-library。它提供了元件建立工作流程 — 變數基礎架構、變體集 (Variant sets)、設計 Token 綁定 — 這些是僅靠 figma-use 無法涵蓋的。
在開始任何操作之前,請先載入 plugin-api-standalone.index.md 以瞭解所有可行操作。當要求你撰寫 Plugin API 程式碼時,請利用此 context 去 grep plugin-api-standalone.d.ts 中相關的型別、方法與屬性。這是 API 規格最權威的資料來源。由於這是一個大型型別定義檔,請勿一次載入全部內容,請依需求 grep 相關區段。
重要事項:每當處理設計系統時,請先閱讀 working-with-design-systems/wwds.md,瞭解在 Figma 中使用設計系統的核心概念、流程與規範。接著再根據需要載入針對元件、變數、文字樣式及效果樣式的具體參考文件。
1. 核心規則
- 使用
return將資料傳回。 傳回值會自動進行 JSON 序列化(物件、陣列、字串、數字)。切勿呼叫figma.closePlugin()或將程式碼包裹在非同步 IIFE 中 — 系統會自動為你處理。 - 撰寫純 JavaScript,並在最外層使用
await與return。 程式碼會自動包裹在非同步 (async) 情境中。切勿包裹在(async () => { ... })()中。 figma.notify()會拋出 "not implemented" 錯誤 — 切勿使用。
3a.use_figma中不支援getPluginData()/setPluginData()— 請勿使用。請改用getSharedPluginData()/setSharedPluginData()(這些有支援),或是透過傳回節點 ID 並將其傳遞給後續呼叫來追蹤節點。console.log()不會傳回內容 — 請使用return輸出結果。- 採小步漸進方式作業。 將大型操作拆分為多次
use_figma呼叫。每一步完成後進行驗證。這是避免 Bug 最重要的一項做法。 - 顏色數值範圍為 0–1(而非 0–255):
{r: 1, g: 0, b: 0}= 紅色。 - 填色 (Fills) 與線條 (Strokes) 為唯讀陣列 — 需先複製、修改後再重新賦值。
- 所有文字編輯均須遵循標準流程:載入字型 →
await→ 修改內容 → 傳回受影響的節點 ID。 若跳過載入步驟,會拋出Cannot write to node with unloaded font "<family> <style>"。此規則不限於characters— 也適用於對未載入字型節點執行的任何操作(appendChild、insertChild、setBoundVariable、setExplicitVariableModeForCollection、setValueForMode、觸及文字的findAll回呼)。修改現有文字時,請透過getStyledTextSegments(['fontName'])載入該節點目前使用的字型,而非使用硬編碼的預設字型。Inter 在多數環境中已預先載入,因此其他字型系列更容易觸發此 Bug — 但處理任何字型時流程完全相同。若樣式字串未經驗證,請先使用await figma.listAvailableFontsAsync()。詳見 Canonical text-edit recipe。 - 頁面為漸進式載入 — 請使用
await figma.setCurrentPageAsync(page)切換頁面並載入其內容。同步設定語法figma.currentPage = page無法運作且會拋出錯誤(詳見下方頁面規則)。 setBoundVariableForPaint會傳回新的 Paint 物件 — 必須接收並重新賦值。createVariable接受 Collection 物件或 ID 字串(偏好傳入物件)。layoutSizingHorizontal/Vertical的數值受到結構情境限制 —FIXED始終有效,HUG與FILL則有限制。'HUG'僅在自動布局框 (Auto-layout frame) 本身,或其內部的文字 (TEXT) 子節點上有效。'FILL'僅在自動布局框的子節點上有效,且該子節點不得為絕對定位、不得位於不可變框 (Immutable frame) 內,亦不得為 Canvas 網格 (Canvas-grid) 子節點。實際操作建議:先將節點新增 (append) 至自動布局父容器中,再設定HUG/FILL— 新建立或尚未設定父容器的節點無法符合此規則。該屬性本身存在於每個SceneNode上;拋出的錯誤是數值退回/拒絕,而非「無此屬性」。詳見 Gotchas。
12a. 針對具有相關性的子節點容器,請使用自動布局 (Auto-layout)。 當子節點存在結構上的關係 — 例如垂直堆疊、橫向並排、對齊、設定間距或適應內容 (Hug) — 請將它們包裹在figma.createAutoLayout()中,而非使用帶有絕對座標x/y的figma.createFrame()。絕對座標決定容器在畫布 (Canvas) 上的位置;自動布局則控制其內部子節點的排列關係。若跳過自動布局容器,文字換行、內容變更或重疊時將無法獲得任何保護。
12b.layoutSizing*與*AxisSizingMode是不同的 Enum — 切勿混用。layoutSizingHorizontal/layoutSizingVertical(設定於子節點上)接收'FIXED'|'HUG'|'FILL';primaryAxisSizingMode/counterAxisSizingMode(設定於框 (Frame) 本身)接收'FIXED'|'AUTO'。因此layoutSizingVertical = 'AUTO'無效,而counterAxisSizingMode = 'FILL'會拋出Expected 'FIXED' | 'AUTO', received 'FILL'(應改用'FIXED'/'AUTO')。同一個 Setter 引發的另外兩個錯誤 —Error: in set_layoutSizingHorizontal: node must be an auto-layout frame or a child of an auto-layout frame以及Error: in set_layoutSizingHorizontal: FILL can only be set on children of auto-layout frames— 代表該節點尚未處於自動布局情境中;建議做法:將父容器改為自動布局 (figma.createAutoLayout()),並在設定屬性之前先appendChild該節點(參見規則 12)。詳見 Gotchas。- 將新建的頂層節點擺放在遠離 (0,0) 的位置。 直接新增至頁面的節點預設座標為 (0,0)。請掃描
figma.currentPage.children找到未被佔用的位置(例如最右側節點的右方)。這僅適用於頁面層級的節點 — 巢狀於其他 Frame 或 Auto-layout 容器內部的節點會由其父容器進行定位。詳見 Gotchas。 - 發生
use_figma錯誤時,請立即停止,切勿直接重試。 失敗的 Script 具備原子性 (Atomic) — 如果 Script 發生錯誤,將完全不會執行,也不會對檔案做任何修改。請仔細閱讀錯誤訊息,修正 Script 後再重新嘗試。詳見 錯誤恢復。 - 必須傳回所有新建/修改的節點 ID。 每當 Script 建立新節點或修改畫布上的既有節點時,請收集所有受影響的節點 ID 並以結構化物件傳回(例如
return { createdNodeIds: [...], mutatedNodeIds: [...] })。這對於後續呼叫進行引用、驗證或清理這些節點至關重要。 - 建立變數時務必明確設定
variable.scopes。 預設的ALL_SCOPES會污染每一個屬性選擇器 — 這幾乎絕非你所期望的。背景請使用特定 Scope,如["FRAME_FILL", "SHAPE_FILL"];文字顏色使用["TEXT_FILL"];間距使用["GAP"]等。完整清單請參閱 variable-patterns.md。 - 對每一個 Promise 使用
await。 切勿遺漏await— 未使用await的非同步呼叫(例如未加await的figma.loadFontAsync(...)或figma.setCurrentPageAsync(page))會以 fire-and-forget 方式執行,導致隱形失敗或 Race condition。Script 可能在非同步操作完成前就已傳回,進而導致資料遺失或變更僅部分生效。
關於每條規則的詳細錯誤/正確範例,請參閱 Gotchas & Common Mistakes。
2. 頁面規則(關鍵)
use_figma 呼叫之間的頁面情境會重置 — 每次執行時 figma.currentPage 都會從第一頁開始。
切換頁面
使用 await figma.setCurrentPageAsync(page) 切換頁面並載入其內容。同步設定語法 figma.currentPage = page 無法運作 — 它會在 use_figma 中拋出 "Setting figma.currentPage is not supported" 錯誤。請務必使用非同步方法。
// 切換至特定頁面(並載入其內容)
const targetPage = figma.root.children.find((p) => p.name === "My Page");
await figma.setCurrentPageAsync(targetPage);
// targetPage.children 此時已載入內容
每次 use_figma 調用最多呼叫 setCurrentPageAsync 一次 — 以平行方式展開多頁面作業
單一 Script 切換頁面的次數最多只能有一次。 切勿在迴圈中走訪 figma.root.children 並在迴圈內部切換頁面。
如果作業跨越多個頁面,請將其拆分為 N 個 use_figma 呼叫(每個目標頁面一個),並平行發送 — 在單一 Assistant 訊息中包含 N 個 use_figma 工具呼叫區塊。執行環境會發起平行處理;每個 Script 各自設定 currentPage 正好一次。
明確指示: 展開平行呼叫時,你必須在單一訊息中發送這 N 個工具呼叫。切勿跨多個回合發送,也不要在發送下一個之前等待前一個完成。逐頁順序呼叫比此規則所替代的迴圈模式更慢,且會完全浪費拆分帶來的效益。
// 避免 — 在單一 Script 中切換頁面 N 次,每次都會重新載入檔案
for (const page of figma.root.children) {
await figma.setCurrentPageAsync(page);
// ... 處理此頁面 ...
}
// 推薦 — 先發起唯讀探索呼叫取得頁面 ID,然後在下一次訊息中
// 同時發送 N 個平行的 use_figma 工具呼叫(每個頁面一個),每個僅設定 currentPage 一次。
無論讀取還是寫入,對於任何多頁面作業預設均使用平行展開處理。完整原理說明請參閱 gotchas.md → 每次 use_figma 呼叫僅設定 current page 一次。
跨 Script 執行
在每次 use_figma 呼叫開始時,figma.currentPage 都會重置為第一頁。如果你的工作流程跨越多次呼叫且目標為非預設頁面,請在每次呼叫的開頭呼叫 await figma.setCurrentPageAsync(page)。
你可以多次呼叫 use_figma 以在檔案狀態上漸進式建置,或在撰寫下一個 Script 之前先檢索資訊。例如,先撰寫一個 Script 來取得既有節點的 Metadata 並 return 該資料,接著在後續 Script 中使用該資料來修改這些節點。





