musepy/genable

musepy/genable

от musepy
Genable — MCP сервер, превращающий текстовый запрос в редактируемые слои Figma: авто-макет, переменные цветов и шрифтов, светлая и темная темы. Полезен дизайнерам и разработчикам для агентных инструментов (Claude Code, Cursor). Совместим с Gemini, Claude, OpenAI.
Genable

Genable

Hand off the design busywork. Detailed prompt in. Fully editable Figma layers out — components typed, variables bound, variants generated, pages laid out.

Install on Figma npm: genable-mcp Sponsor License: MIT

Skip the busywork. Keep the design.

Why Genable

Most AI design tools ship a flat image or a templated mock. Genable is agentic — it plans, executes against Figma's scene graph through typed tools, and verifies its work. The output is real, editable Figma layers, not screenshots.

  • Real layers — Frames with Auto Layout, real Text, real Components — not flattened images.
  • Variables, not pasted hex — Color, typography, and spacing bound to variables with light and dark modes.
  • Variants together — Light, dark, and brand-color themes generated in one pass, switchable in a click.
  • Whole pages — Hero, pricing, features, FAQ laid out as proper sections — not a slab of nodes.
  • Detailed prompts welcome — We don't sell prompt brevity. The more specific you are, the better the result.

What you can hand off

Six things Genable takes off your plate

Three steps

From describing to designing — three steps

Two surfaces, one engine

Use Genable as a Figma plugin (designers) or as the genable-mcp MCP server (Claude Code, Cursor, Cline, Continue, Zed, or any MCP-compatible agent). Same engine, same 41 tools.

add_component_prop

Добавляет свойство компонента к COMPONENT или COMPONENT_SET. Четыре типа: TEXT — переопределяемая строка для каждого экземпляра (надпись на кнопке). Автоматически привязывается к дочернему текстовому узлу через "bind". BOOLEAN — скрывает или показывает слой для каждого экземпляра (переключение иконки). Автоматически привязывается к видимости узла. INSTANCE_SWAP — заменяет вложенный экземпляр для каждого экземпляра (семейство иконок, аватар). Автоматически привязывается к дочернему экземпляру. Необязательный "preferredValues" предлагает варианты для замены. SLOT — открытый слот, который заполняется при использовании экземпляра (тело компонуемого Card, содержимое Modal). Необязательный "description" подсказывает, что должно быть в слоте; необязательный "preferredValues" предлагает содержимое. "bind" отсутствует (SLOT не привязан к одному дочернему узлу). Оси вариантов VARIANT (Size, State, Theme) здесь не добавляются. Figma получает оси вариантов из названий компонентов-вариантов — создайте один COMPONENT для каждой комбинации и используйте combine_components с сопоставлением `variants`. Вызов этого инструмента с type:"VARIANT" возвращает перенаправление. Автоматическая привязка (TEXT/BOOLEAN/INSTANCE_SWAP): если "bind" опущен, обработчик обходит дочерние узлы компонента и ищет совпадение по имени. SLOT пропускает привязку (заполняется потребителями). preferredValues — `{type, key}[]`, где `type` — "COMPONENT" или "COMPONENT_SET", а `key` — опубликованный ключ компонента (component.key), а не идентификатор узла сцены. Используйте, когда: - Строите переиспользуемый компонент, экземпляры которого должны меняться (надпись, иконка, состояние включено/выключено) - Определяете слот, который потребитель может заполнить (тело Card, содержимое Modal) Возвращает: { data: { message, nodeId, property, bound: boolean } } `bound` равен false, если автоматическая привязка не нашла подходящего дочернего узла — свойство всё равно создаётся, но экземпляры ничего не переопределят, пока вы не запустите инструмент заново с явным "bind". Пропустите, когда: - Исходный узел — FRAME: сначала выполните create_component; свойства требуют COMPONENT или COMPONENT_SET - Нужна ось вариантов (Size, State) — используйте combine_components (см. выше) - Вариация одноразовая — отредактируйте экземпляр напрямую, без шаблона Примеры: …

Добавляет свойство компонента к COMPONENT или COMPONENT_SET. Четыре типа: TEXT — переопределяемая строка для каждого экземпляра (надпись на кнопке). Автоматически привязывается к дочернему текстовому узлу через "bind". BOOLEAN — скрывает или показывает слой для каждого экземпляра (переключение иконки). Автоматически привязывается к видимости узла. INSTANCE_SWAP — заменяет вложенный экземпляр для каждого экземпляра (семейство иконок, аватар). Автоматически привязывается к дочернему экземпляру. Необязательный "preferredValues" предлагает варианты для замены. SLOT — открытый слот, который заполняется при использовании экземпляра (тело компонуемого Card, содержимое Modal). Необязательный "description" подсказывает, что должно быть в слоте; необязательный "preferredValues" предлагает содержимое. "bind" отсутствует (SLOT не привязан к одному дочернему узлу). Оси вариантов VARIANT (Size, State, Theme) здесь не добавляются. Figma получает оси вариантов из названий компонентов-вариантов — создайте один COMPONENT для каждой комбинации и используйте combine_components с сопоставлением `variants`. Вызов этого инструмента с type:"VARIANT" возвращает перенаправление. Автоматическая привязка (TEXT/BOOLEAN/INSTANCE_SWAP): если "bind" опущен, обработчик обходит дочерние узлы компонента и ищет совпадение по имени. SLOT пропускает привязку (заполняется потребителями). preferredValues — `{type, key}[]`, где `type` — "COMPONENT" или "COMPONENT_SET", а `key` — опубликованный ключ компонента (component.key), а не идентификатор узла сцены. Используйте, когда: - Строите переиспользуемый компонент, экземпляры которого должны меняться (надпись, иконка, состояние включено/выключено) - Определяете слот, который потребитель может заполнить (тело Card, содержимое Modal) Возвращает: { data: { message, nodeId, property, bound: boolean } } `bound` равен false, если автоматическая привязка не нашла подходящего дочернего узла — свойство всё равно создаётся, но экземпляры ничего не переопределят, пока вы не запустите инструмент заново с явным "bind". Пропустите, когда: - Исходный узел — FRAME: сначала выполните create_component; свойства требуют COMPONENT или COMPONENT_SET - Нужна ось вариантов (Size, State) — используйте combine_components (см. выше) - Вариация одноразовая — отредактируйте экземпляр напрямую, без шаблона Примеры: …

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • namestringобязательный

    Property display name

  • typeenumобязательный
    TEXTBOOLEANINSTANCE_SWAPSLOTVARIANT
  • defaultstring

    Default text value

  • bindstring

    Text child node ID to bind (auto-matched by name if omitted)

  • preferredValuesobject[]

    Suggested swap targets as {type, key} (published component keys)

  • descriptionstring

    Hint about what content belongs in the slot

  • variantOptionsstring[]
bind_variable

Привязывает переменную типа FLOAT, BOOLEAN или STRING к свойству узла. Переменные типа COLOR обрабатываются через set_fill / set_stroke / jsx — см. Skip when. prop — это плоское поле Figma, доступное для привязки (например, fontSize, itemSpacing, paddingTop, cornerRadius, opacity, visible, width, height, characters). Допускаются сокращения: gap → itemSpacing, padding → paddingTop, corner → cornerRadius, font-size → fontSize. Используйте, когда: - Привязываете числовой токен (расстояние, радиус, размер шрифта) к узлу, чтобы он отслеживал дизайн-систему - Переключаете видимость BOOLEAN через глобальную переменную - Привязываете содержимое STRING (например, characters) к локализованной текстовой переменной Возвращает: { data: { message, nodeId, variableId } } при успехе. Может содержать предупреждения: MODE_FALLBACK — переменной не хватает значения для одного из доступных узлу режимов; Figma откатывается к режиму по умолчанию по цепочке. Встроенные ошибки (LLM может исправить их самостоятельно): MISSING_MODE_VALUES — переменной не хватает обязательных режимов. Ответ `data.recommended_next_action` содержит готовый к вызову create_variable с заполненными недостающими режимами. Пропустите, когда: - Переменная является COLOR — используйте set_fill({node, bg: "$VarName"}), set_stroke({node, color: "$VarName"}) или укажите fill/bg="$VarName" при создании jsx - Целевое свойство является Paint (fills, strokes) — то же самое, что COLOR выше - Переменной не хватает обязательных режимов — сначала вызовите create_variable для их заполнения, или ожидайте MISSING_MODE_VALUES Совет по выбору режима: если узел является вариантом Tablet/Mobile (имя или свойство варианта содержит "Tablet"/"Mobile"), сопоставьте значение его свойства со столбцом режима Tablet/Mobile из list_variables — не Desktop. Примеры: bind_variable({node: "1:2", prop: "fontSize", variable: "VariableID:1:6"}) bind_variable({node: "1:3", prop: "paddingTop", variable: "VariableID:1:7"}) bind_variable({node: "1:4", prop: "visible", variable: "VariableID:1:8"}) bind_variable({node: "1:5", prop: "characters", variable: "VariableID:1:9"}) Привязываемые свойства (полный набор): FLOAT — fontSize, letterSpacing,…

Привязывает переменную типа FLOAT, BOOLEAN или STRING к свойству узла. Переменные типа COLOR обрабатываются через set_fill / set_stroke / jsx — см. Skip when. prop — это плоское поле Figma, доступное для привязки (например, fontSize, itemSpacing, paddingTop, cornerRadius, opacity, visible, width, height, characters). Допускаются сокращения: gap → itemSpacing, padding → paddingTop, corner → cornerRadius, font-size → fontSize. Используйте, когда: - Привязываете числовой токен (расстояние, радиус, размер шрифта) к узлу, чтобы он отслеживал дизайн-систему - Переключаете видимость BOOLEAN через глобальную переменную - Привязываете содержимое STRING (например, characters) к локализованной текстовой переменной Возвращает: { data: { message, nodeId, variableId } } при успехе. Может содержать предупреждения: MODE_FALLBACK — переменной не хватает значения для одного из доступных узлу режимов; Figma откатывается к режиму по умолчанию по цепочке. Встроенные ошибки (LLM может исправить их самостоятельно): MISSING_MODE_VALUES — переменной не хватает обязательных режимов. Ответ `data.recommended_next_action` содержит готовый к вызову create_variable с заполненными недостающими режимами. Пропустите, когда: - Переменная является COLOR — используйте set_fill({node, bg: "$VarName"}), set_stroke({node, color: "$VarName"}) или укажите fill/bg="$VarName" при создании jsx - Целевое свойство является Paint (fills, strokes) — то же самое, что COLOR выше - Переменной не хватает обязательных режимов — сначала вызовите create_variable для их заполнения, или ожидайте MISSING_MODE_VALUES Совет по выбору режима: если узел является вариантом Tablet/Mobile (имя или свойство варианта содержит "Tablet"/"Mobile"), сопоставьте значение его свойства со столбцом режима Tablet/Mobile из list_variables — не Desktop. Примеры: bind_variable({node: "1:2", prop: "fontSize", variable: "VariableID:1:6"}) bind_variable({node: "1:3", prop: "paddingTop", variable: "VariableID:1:7"}) bind_variable({node: "1:4", prop: "visible", variable: "VariableID:1:8"}) bind_variable({node: "1:5", prop: "characters", variable: "VariableID:1:9"}) Привязываемые свойства (полный набор): FLOAT — fontSize, letterSpacing,…

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • propstringобязательный

    Flat Figma bindable field (fontSize, paddingTop, ...)

  • variablestringобязательный

    VariableID like "VariableID:1:5"

clone_node

Создаёт глубокую копию узла с опциональными переопределениями свойств. Примеры: clone_node({node: "1:2"}) - клонировать в корень страницы, то же имя clone_node({node: "1:2", parent: "/"}) - явное клонирование в корень страницы clone_node({node: "1:2", parent: "/", name: "Hero Copy"}) - клонировать в корень с пользовательским именем clone_node({node: "1:2", parent: "1:4"}) - клонировать в родительский узел 1:4 clone_node({node: "1:2", parent: "1:4", overrides: {"bg": "#D9D9D9"}}) - с переопределениями

Создаёт глубокую копию узла с опциональными переопределениями свойств. Примеры: clone_node({node: "1:2"}) - клонировать в корень страницы, то же имя clone_node({node: "1:2", parent: "/"}) - явное клонирование в корень страницы clone_node({node: "1:2", parent: "/", name: "Hero Copy"}) - клонировать в корень с пользовательским именем clone_node({node: "1:2", parent: "1:4"}) - клонировать в родительский узел 1:4 clone_node({node: "1:2", parent: "1:4", overrides: {"bg": "#D9D9D9"}}) - с переопределениями

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • parentstring

    Target parent node ID or "/" for page root

  • namestring

    Name for the cloned node

  • overridesobject

    Property overrides applied to the clone — same registry key-space as edit.props (w/h/corner/opacity/rotate/blur/shadow/visible, any registry prop, or "Child.prop" to override a named descendant). Use the top-level `name` to rename. Pass real keys, never {}.

combine_components

Объединяет 2+ существующих COMPONENT в COMPONENT_SET (набор вариантов). Новый набор занимает место в макете родителя первого входного компонента; входные компоненты становятся его дочерними элементами (вариантами). Применяются разумные значения по умолчанию: горизонтальный переносной макет, расстояние 24px, отступ 20px. Это ЕДИНСТВЕННЫЙ способ создать оси вариантов (Size, State, Theme). Figma выводит каждую ось из имён компонентов-вариантов в форме "Axis=Value". Передайте отображение `variants`, и обработчик сам присвоит имена каждому компоненту (например, {Size:"Small", State:"Default"} → "Size=Small, State=Default"); все записи должны иметь одинаковые ключи осей. Опускайте `variants` только если компоненты уже названы в форме "Axis=Value" — иначе получите одну мусорную ось с именем "Property 1". Чтобы собрать набор вариантов: создайте один COMPONENT на каждую комбинацию (вызовите create_component на фреймах или используйте JSX), затем вызовите combine_components с `variants`. Используйте когда: - У вас есть ≥2 COMPONENT, которые различаются по одной или нескольким осям (Size, State, Theme) и нужен типизированный набор вариантов - Вариации на уровне экземпляра (текст метки, смена иконки, вкл/выкл) → используйте add_component_prop с TEXT/BOOLEAN/INSTANCE_SWAP/SLOT (а НЕ ось варианта) Возвращает: { data: { message, nodeId: "1:5", variants: ["Size=Small", "Size=Large"] } } Пропустите когда: - Входные данные — FRAME — сначала выполните create_component для каждого - Вариация относится к экземпляру, а не к форме компонента — используйте add_component_prop Примеры: // Одна ось (Size), обработчик сам даёт имена дочерним элементам: combine_components({nodes: ["1:2", "1:3", "1:4"], name: "Button", variants: [ {node: "1:2", props: {Size: "Small"}}, {node: "1:3", props: {Size: "Medium"}}, {node: "1:4", props: {Size: "Large"}} ]}) // Две оси (Size × State): combine_components({nodes: ["1:2", "1:3"], name: "Button", variants: [ {node: "1:2", props: {Size: "Small", State: "Default"}}, {node: "1:3", props: {Size: "Small", State: "Hover"}} ]}) // Компоненты уже названы "Axis=Value" — отображение не нужно: combine_components({nodes: ["1:2",…

Объединяет 2+ существующих COMPONENT в COMPONENT_SET (набор вариантов). Новый набор занимает место в макете родителя первого входного компонента; входные компоненты становятся его дочерними элементами (вариантами). Применяются разумные значения по умолчанию: горизонтальный переносной макет, расстояние 24px, отступ 20px. Это ЕДИНСТВЕННЫЙ способ создать оси вариантов (Size, State, Theme). Figma выводит каждую ось из имён компонентов-вариантов в форме "Axis=Value". Передайте отображение `variants`, и обработчик сам присвоит имена каждому компоненту (например, {Size:"Small", State:"Default"} → "Size=Small, State=Default"); все записи должны иметь одинаковые ключи осей. Опускайте `variants` только если компоненты уже названы в форме "Axis=Value" — иначе получите одну мусорную ось с именем "Property 1". Чтобы собрать набор вариантов: создайте один COMPONENT на каждую комбинацию (вызовите create_component на фреймах или используйте JSX), затем вызовите combine_components с `variants`. Используйте когда: - У вас есть ≥2 COMPONENT, которые различаются по одной или нескольким осям (Size, State, Theme) и нужен типизированный набор вариантов - Вариации на уровне экземпляра (текст метки, смена иконки, вкл/выкл) → используйте add_component_prop с TEXT/BOOLEAN/INSTANCE_SWAP/SLOT (а НЕ ось варианта) Возвращает: { data: { message, nodeId: "1:5", variants: ["Size=Small", "Size=Large"] } } Пропустите когда: - Входные данные — FRAME — сначала выполните create_component для каждого - Вариация относится к экземпляру, а не к форме компонента — используйте add_component_prop Примеры: // Одна ось (Size), обработчик сам даёт имена дочерним элементам: combine_components({nodes: ["1:2", "1:3", "1:4"], name: "Button", variants: [ {node: "1:2", props: {Size: "Small"}}, {node: "1:3", props: {Size: "Medium"}}, {node: "1:4", props: {Size: "Large"}} ]}) // Две оси (Size × State): combine_components({nodes: ["1:2", "1:3"], name: "Button", variants: [ {node: "1:2", props: {Size: "Small", State: "Default"}}, {node: "1:3", props: {Size: "Small", State: "Hover"}} ]}) // Компоненты уже названы "Axis=Value" — отображение не нужно: combine_components({nodes: ["1:2",…

Параметры

  • nodesstring[]обязательный

    Component node IDs to combine (≥2 required)

  • namestring

    Component set name

  • variantsobject[]

    Per-component variant axis assignments. The handler renames each listed component to Figma's "Axis=Value, ..." form before combining, so the set gets typed axes (Size, State, …). All entries should share the same axis keys. Omit to derive axes from existing component names.

create_collection

Создаёт VariableCollection с именованными режимами — идемпотентно (найти или создать). Возвращает существующую коллекцию, если коллекция с таким же именем и идентичным списком режимов (в том же порядке) уже существует, в противном случае создаёт новую. Безопасно для повторных вызовов. Спецификация §3.1. Первый режим в массиве становится режимом по умолчанию. Порядок режимов — часть идентичности: ["Light","Dark"] ≠ ["Dark","Light"] (Figma разрешает первый указанный режим на корневом уровне). Опустите idempotency_key — обработчик вычисляет его канонически из (name, modes). Передавайте его только если требуется строгая проверка конкурентной безопасности (LLM не должны пытаться вычислить SHA-256 в строке; строки-заглушки отвергаются). Возвращает {data: {collection_id, modes: [{modeId, name}], reused?: true}} — используйте эти modeId с set_variable_value и set_variable_mode. Примеры: create_collection({name: "Theme", modes: ["Light", "Dark"]}) create_collection({name: "Device", modes: ["Desktop", "Tablet", "Mobile"]})

Создаёт VariableCollection с именованными режимами — идемпотентно (найти или создать). Возвращает существующую коллекцию, если коллекция с таким же именем и идентичным списком режимов (в том же порядке) уже существует, в противном случае создаёт новую. Безопасно для повторных вызовов. Спецификация §3.1. Первый режим в массиве становится режимом по умолчанию. Порядок режимов — часть идентичности: ["Light","Dark"] ≠ ["Dark","Light"] (Figma разрешает первый указанный режим на корневом уровне). Опустите idempotency_key — обработчик вычисляет его канонически из (name, modes). Передавайте его только если требуется строгая проверка конкурентной безопасности (LLM не должны пытаться вычислить SHA-256 в строке; строки-заглушки отвергаются). Возвращает {data: {collection_id, modes: [{modeId, name}], reused?: true}} — используйте эти modeId с set_variable_value и set_variable_mode. Примеры: create_collection({name: "Theme", modes: ["Light", "Dark"]}) create_collection({name: "Device", modes: ["Desktop", "Tablet", "Mobile"]})

Параметры

  • namestringобязательный

    Collection name

  • modesstring[]обязательный

    Mode names (first becomes default)

  • idempotency_keystring

    Optional concurrency-safety key — handler computes canonically if omitted

create_component

Преобразует FRAME или GROUP в повторно используемый COMPONENT на месте. Новый компонент наследует дочерние элементы, авто-раскладку, заливки, обводки и эффекты оригинала. Исходный фрейм удаляется; используйте возвращаемый nodeId для последующих ссылок. Используйте когда: - Готовый фрейм будет повторно использоваться (кнопка, карточка, элемент списка) и требуется мастер экземпляров - Перед create_instance — экземплярам требуется COMPONENT, а не FRAME - Превращаете одноразовый макет в повторно используемый строительный блок Возвращает: { data: { message: "Converted ...", nodeId: "1:5" } } Идемпотентно: если узел уже является COMPONENT, возвращает успех с существующим nodeId — без ошибки, без дублирования. Пропустите когда: - Исходный объект — TEXT, VECTOR или INSTANCE — преобразуются только FRAME/GROUP; при необходимости клонируйте сначала - Строите с нуля — используйте jsx() с компонентом как единицей, если повторное использование известно заранее - Нужна мультивариантность — преобразуйте каждый вариант отдельно, затем combine_components Примеры: create_component({node: "1:2"})

Преобразует FRAME или GROUP в повторно используемый COMPONENT на месте. Новый компонент наследует дочерние элементы, авто-раскладку, заливки, обводки и эффекты оригинала. Исходный фрейм удаляется; используйте возвращаемый nodeId для последующих ссылок. Используйте когда: - Готовый фрейм будет повторно использоваться (кнопка, карточка, элемент списка) и требуется мастер экземпляров - Перед create_instance — экземплярам требуется COMPONENT, а не FRAME - Превращаете одноразовый макет в повторно используемый строительный блок Возвращает: { data: { message: "Converted ...", nodeId: "1:5" } } Идемпотентно: если узел уже является COMPONENT, возвращает успех с существующим nodeId — без ошибки, без дублирования. Пропустите когда: - Исходный объект — TEXT, VECTOR или INSTANCE — преобразуются только FRAME/GROUP; при необходимости клонируйте сначала - Строите с нуля — используйте jsx() с компонентом как единицей, если повторное использование известно заранее - Нужна мультивариантность — преобразуйте каждый вариант отдельно, затем combine_components Примеры: create_component({node: "1:2"})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

create_instance

Создаёт экземпляр существующего компонента. Изменяет холст — добавляет новый InstanceNode как последний дочерний элемент `parent` (или корень активной страницы, если параметр опущен). Экземпляр СВЯЗАН с мастер-компонентом, поэтому будущие правки компонента распространяются на него. Возвращает nodeId нового экземпляра. Используйте когда: - Нужно создать копии мастер-компонента во время выполнения (кнопки, элементы списков, карточки) - Повторно использовать компонент дизайн-системы в новом макете - Выполнить программную вставку вне сборки дерева через jsx() Возвращает: { data: { message, nodeId: "5:42", componentId: "1:2" } } Параметры помимо схемы: - `node` должен быть COMPONENT или COMPONENT_SET. Для COMPONENT_SET создаётся вариант по умолчанию, если не передан `variant`. Узнавайте ID с помощью find_nodes({ type: "COMPONENT" }). - `parent` опционально. Если родитель — авто-макет, экземпляр встраивается в поток и наследует правила размеров. Если опущен, экземпляр помещается в корень активной страницы с откреплённой позицией — может перекрывать существующий контент; затем задайте явную позицию через edit. - `variant` опционально. Для COMPONENT_SET выберите вариант по значениям осей, например {Size:"Large", State:"Hover"}. Значения должны совпадать с опциями осей набора (см. list_component_props). - `props` опционально. Переопределяет свойства компонента по отображаемому имени (имена из list_component_props, без внутреннего #суффикса), например {Label:"Submit", "Show Icon":"false"}. Булевы свойства принимают "true"/"false". Применяется через setProperties; неизвестное имя или недопустимое значение варианта возвращает ошибку с перечислением доступных вариантов. Пропустите когда: - Нужно дублировать узел, не являющийся компонентом — создание экземпляра завершится ошибкой; используйте clone_node. - Строите поддерево с нуля — используйте jsx с <instance ref="ComponentName"/> для атомарного создания за один вызов. Примеры: create_instance({node: "1:2"}) // по умолчанию, в корне страницы create_instance({node: "1:2", parent: "1:4"}) // внутри фрейма 1:4 create_instance({node: "1:2", variant: {Size:…

Создаёт экземпляр существующего компонента. Изменяет холст — добавляет новый InstanceNode как последний дочерний элемент `parent` (или корень активной страницы, если параметр опущен). Экземпляр СВЯЗАН с мастер-компонентом, поэтому будущие правки компонента распространяются на него. Возвращает nodeId нового экземпляра. Используйте когда: - Нужно создать копии мастер-компонента во время выполнения (кнопки, элементы списков, карточки) - Повторно использовать компонент дизайн-системы в новом макете - Выполнить программную вставку вне сборки дерева через jsx() Возвращает: { data: { message, nodeId: "5:42", componentId: "1:2" } } Параметры помимо схемы: - `node` должен быть COMPONENT или COMPONENT_SET. Для COMPONENT_SET создаётся вариант по умолчанию, если не передан `variant`. Узнавайте ID с помощью find_nodes({ type: "COMPONENT" }). - `parent` опционально. Если родитель — авто-макет, экземпляр встраивается в поток и наследует правила размеров. Если опущен, экземпляр помещается в корень активной страницы с откреплённой позицией — может перекрывать существующий контент; затем задайте явную позицию через edit. - `variant` опционально. Для COMPONENT_SET выберите вариант по значениям осей, например {Size:"Large", State:"Hover"}. Значения должны совпадать с опциями осей набора (см. list_component_props). - `props` опционально. Переопределяет свойства компонента по отображаемому имени (имена из list_component_props, без внутреннего #суффикса), например {Label:"Submit", "Show Icon":"false"}. Булевы свойства принимают "true"/"false". Применяется через setProperties; неизвестное имя или недопустимое значение варианта возвращает ошибку с перечислением доступных вариантов. Пропустите когда: - Нужно дублировать узел, не являющийся компонентом — создание экземпляра завершится ошибкой; используйте clone_node. - Строите поддерево с нуля — используйте jsx с <instance ref="ComponentName"/> для атомарного создания за один вызов. Примеры: create_instance({node: "1:2"}) // по умолчанию, в корне страницы create_instance({node: "1:2", parent: "1:4"}) // внутри фрейма 1:4 create_instance({node: "1:2", variant: {Size:…

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • parentstring

    Parent node ID for placement

  • variantobject

    For a COMPONENT_SET: select the variant by axis values, e.g. {"Size":"Large","State":"Hover"}. Defaults to the set's default variant.

  • propsobject

    Component property overrides by display name, e.g. {"Label":"Submit","Show Icon":"false"}. Applied via setProperties; BOOLEAN accepts "true"/"false".

create_page

Создаёт новую страницу верхнего уровня в файле. Страницы — это независимые холсты: полезны для изоляции исследовательской работы, черновиков или отдельных функциональных областей, не засоряя текущую страницу. По умолчанию новая страница создаётся, но НЕ активируется. Передайте `switchTo:true`, чтобы сделать её текущей страницей (иначе последующие операции по-прежнему работают с предыдущей страницей). Возвращает: `{id, name}` созданной страницы. Примеры: `create_page({name: "Scratch"})` — создание, остаёмся на текущей странице `create_page({name: "MCP Tests", switchTo: true})` — создание И переключение

Создаёт новую страницу верхнего уровня в файле. Страницы — это независимые холсты: полезны для изоляции исследовательской работы, черновиков или отдельных функциональных областей, не засоряя текущую страницу. По умолчанию новая страница создаётся, но НЕ активируется. Передайте `switchTo:true`, чтобы сделать её текущей страницей (иначе последующие операции по-прежнему работают с предыдущей страницей). Возвращает: `{id, name}` созданной страницы. Примеры: `create_page({name: "Scratch"})` — создание, остаёмся на текущей странице `create_page({name: "MCP Tests", switchTo: true})` — создание И переключение

Параметры

  • namestringобязательный

    Page name

  • switchToboolean

    Make the new page current after creating

create_variable

Создаёт переменную в коллекции — идемпотентная (найди-или-создай) с возможностью задания значения. Повторный вызов с теми же аргументами возвращает СУЩЕСТВУЮЩУЮ переменную вместо создания дубликата, так что повторять вызов безопасно. Опустите `values_by_mode`, чтобы создать пустую переменную; укажите его, чтобы заполнить все режимы за один вызов. Поведение (спецификация §3.1), сопоставление по (collection, name, type) в целевой коллекции: - Ровно 1 совпадение → идемпотентное повторное использование (возвращает её, `reused: true`). - 0 в целевой, совпадения в ДРУГИХ коллекциях → создаёт новую в целевой + предупреждение NAME_EXISTS_OUTSIDE_TARGET_COLLECTION. - 0 везде → создаёт новую. - 2+ в целевой коллекции (Figma допускает дубликаты) → ошибка SAME_COLLECTION_NAME_DUPLICATE. Ключи values_by_mode могут быть как именами режимов (например, "Light"), так и modeId (например, "1:0"). Каждое значение должно соответствовать типу переменной (hex/RGBA для COLOR, число для FLOAT, строка для STRING, булево для BOOLEAN). Опустите idempotency_key — обработчик вычисляет его канонически из (collection, name, type, values_by_mode). Передавайте только если нужна строгая проверка конкурентной безопасности (LLM не должны пытаться вычислять SHA-256 на месте; заполнители отвергаются). Политика покрытия режимов (спецификация §6.2): - mode_coverage_required: 'all' (по умолчанию) — каждый режим в коллекции должен иметь явное значение. set_fill / bind_variable ОТКЛОНЯТ привязки, которые попадают на отсутствующий режим (MISSING_MODE_VALUES). - mode_coverage_required: 'opt-in-fallback' — резервное копирование на режим по умолчанию предполагается. Привязки выдают предупреждение FALLBACK_BINDING вместо ошибки. Вызывающий ОБЯЗАН указать fallback_reason, содержащий структурированную фразу "fallback to <mode_name>" (машиночитаемую). Возвращает {data: {variable_id, name, type, collection_id, mode_coverage[], mode_coverage_required, reused?: true}, warnings?: [...]}. Примеры: create_variable({collection: "VariableCollectionId:1:2", name: "Theme/bg", type: "COLOR"}) // пустая create_variable({collection: "VariableCollectionId:1:2", name: …

Создаёт переменную в коллекции — идемпотентная (найди-или-создай) с возможностью задания значения. Повторный вызов с теми же аргументами возвращает СУЩЕСТВУЮЩУЮ переменную вместо создания дубликата, так что повторять вызов безопасно. Опустите `values_by_mode`, чтобы создать пустую переменную; укажите его, чтобы заполнить все режимы за один вызов. Поведение (спецификация §3.1), сопоставление по (collection, name, type) в целевой коллекции: - Ровно 1 совпадение → идемпотентное повторное использование (возвращает её, `reused: true`). - 0 в целевой, совпадения в ДРУГИХ коллекциях → создаёт новую в целевой + предупреждение NAME_EXISTS_OUTSIDE_TARGET_COLLECTION. - 0 везде → создаёт новую. - 2+ в целевой коллекции (Figma допускает дубликаты) → ошибка SAME_COLLECTION_NAME_DUPLICATE. Ключи values_by_mode могут быть как именами режимов (например, "Light"), так и modeId (например, "1:0"). Каждое значение должно соответствовать типу переменной (hex/RGBA для COLOR, число для FLOAT, строка для STRING, булево для BOOLEAN). Опустите idempotency_key — обработчик вычисляет его канонически из (collection, name, type, values_by_mode). Передавайте только если нужна строгая проверка конкурентной безопасности (LLM не должны пытаться вычислять SHA-256 на месте; заполнители отвергаются). Политика покрытия режимов (спецификация §6.2): - mode_coverage_required: 'all' (по умолчанию) — каждый режим в коллекции должен иметь явное значение. set_fill / bind_variable ОТКЛОНЯТ привязки, которые попадают на отсутствующий режим (MISSING_MODE_VALUES). - mode_coverage_required: 'opt-in-fallback' — резервное копирование на режим по умолчанию предполагается. Привязки выдают предупреждение FALLBACK_BINDING вместо ошибки. Вызывающий ОБЯЗАН указать fallback_reason, содержащий структурированную фразу "fallback to <mode_name>" (машиночитаемую). Возвращает {data: {variable_id, name, type, collection_id, mode_coverage[], mode_coverage_required, reused?: true}, warnings?: [...]}. Примеры: create_variable({collection: "VariableCollectionId:1:2", name: "Theme/bg", type: "COLOR"}) // пустая create_variable({collection: "VariableCollectionId:1:2", name: …

Параметры

  • collectionstringобязательный

    VariableCollectionId like "VariableCollectionId:1:2"

  • namestringобязательный

    Variable name (slashes denote hierarchy)

  • typeenumобязательный

    Variable type

    COLORFLOATBOOLEANSTRING
  • values_by_modeobject

    Optional map of mode name OR modeId → value (hex allowed for COLOR). Omit to create an empty variable; provide to populate all modes idempotently in one call.

  • idempotency_keystring

    Optional concurrency-safety key — handler computes canonically if omitted

  • mode_coverage_requiredenum

    Mode coverage policy — "all" (default) or "opt-in-fallback"

    allopt-in-fallback
  • fallback_reasonstring

    REQUIRED iff mode_coverage_required="opt-in-fallback". Must contain "fallback to <mode_name>"

create_vector

Создаёт векторный узел из данных SVG-пути или списка точек. Используется для линий графиков, собственных иконок, произвольных кривых и любых фигур, которым нужны данные пути. Примеры: // Ломаная линия (тренд графика) create_vector({ parent: "1:23", name: "TrendLine", x: 40, y: 20, width: 550, height: 240, points: [[0,144],[90,96],[180,120],[270,64],[360,80],[450,40],[540,72]], stroke: "#6366F1", strokeWeight: 2 }) // Сырой SVG-путь (произвольная форма) create_vector({ parent: "1:23", name: "Wave", width: 200, height: 60, data: "M 0 30 Q 50 0 100 30 T 200 30", stroke: "linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)", strokeWeight: 1.5 }) Входные данные пути — укажите ОДНО из: points: [[x,y], ...] компилируется в "M x0 y0 L x1 y1 ..." (сокращение для ломаной) data: "M ... L ..." сырой SVG-путь (естественно для LLM; поддерживает M, L, C, Q, A, Z) Обводка / заливка (те же форматы, что у set_stroke / set_fill): hex "#6366F1" gradient "linear-gradient(angle, #color stop%, ...)" variable уточнённое голое имя "$Brand/Primary" Заливка по умолчанию — "transparent", поэтому вектор показывает только обводку. Передайте явную заливку, если она нужна. Когда НЕ использовать: - Стандартные прямоугольники / эллипсы / линии — используйте JSX-элементы <Rect/>, <Ellipse/>, <Line/> (проще, удобнее для пакетной обработки) - Редактирование существующих векторов — используйте edit / set_stroke

Создаёт векторный узел из данных SVG-пути или списка точек. Используется для линий графиков, собственных иконок, произвольных кривых и любых фигур, которым нужны данные пути. Примеры: // Ломаная линия (тренд графика) create_vector({ parent: "1:23", name: "TrendLine", x: 40, y: 20, width: 550, height: 240, points: [[0,144],[90,96],[180,120],[270,64],[360,80],[450,40],[540,72]], stroke: "#6366F1", strokeWeight: 2 }) // Сырой SVG-путь (произвольная форма) create_vector({ parent: "1:23", name: "Wave", width: 200, height: 60, data: "M 0 30 Q 50 0 100 30 T 200 30", stroke: "linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)", strokeWeight: 1.5 }) Входные данные пути — укажите ОДНО из: points: [[x,y], ...] компилируется в "M x0 y0 L x1 y1 ..." (сокращение для ломаной) data: "M ... L ..." сырой SVG-путь (естественно для LLM; поддерживает M, L, C, Q, A, Z) Обводка / заливка (те же форматы, что у set_stroke / set_fill): hex "#6366F1" gradient "linear-gradient(angle, #color stop%, ...)" variable уточнённое голое имя "$Brand/Primary" Заливка по умолчанию — "transparent", поэтому вектор показывает только обводку. Передайте явную заливку, если она нужна. Когда НЕ использовать: - Стандартные прямоугольники / эллипсы / линии — используйте JSX-элементы <Rect/>, <Ellipse/>, <Line/> (проще, удобнее для пакетной обработки) - Редактирование существующих векторов — используйте edit / set_stroke

Параметры

  • parentstring

    Parent node ID

  • namestring

    Node name

  • xnumber

    X position relative to parent

  • ynumber

    Y position relative to parent

  • widthnumberобязательный

    Vector bounds width in px

  • heightnumberобязательный

    Vector bounds height in px

  • datastring

    Raw SVG path string

  • pointsarray[]

    Polyline points [[x,y], ...] — at least 2 points to make a path

  • windingRuleenum
    NONZEROEVENODD
  • strokestring

    Stroke color — hex / gradient / variable token

  • strokeWeightnumber

    Stroke weight in px

  • strokeAlignenum

    Stroke alignment relative to the frame edge

    insideoutsidecenter
  • fillstring

    Fill — hex / gradient / variable / "transparent"

delete_collection

Удаляет VariableCollection. Каскадно - все переменные в коллекции также удаляются, а любые привязки узлов к этим переменным становятся непривязанными (узел сохраняет своё конкретное значение на момент удаления). Возвращает: {ok: true, removedVariables: <count>}. Примеры: delete_collection({collection: "VariableCollectionId:1:2"})

Удаляет VariableCollection. Каскадно - все переменные в коллекции также удаляются, а любые привязки узлов к этим переменным становятся непривязанными (узел сохраняет своё конкретное значение на момент удаления). Возвращает: {ok: true, removedVariables: <count>}. Примеры: delete_collection({collection: "VariableCollectionId:1:2"})

Параметры

  • collectionstringобязательный

    VariableCollectionId like "VariableCollectionId:1:2"

delete_component_prop

Удаляет свойство компонента из COMPONENT или COMPONENT_SET. Поддерживает BOOLEAN, TEXT, INSTANCE_SWAP и SLOT — НЕ VARIANT (ограничение Figma; ось варианта удаляется путём рекомбинации набора без неё). `name` — отображаемое имя свойства из list_component_props (без внутреннего суффикса #). Используйте, когда: - Удаление свойства, которое больше не нужно (очистка, редизайн) - Отмена ошибки add_component_prop Возвращает: { data: { message, nodeId } } Пропустите, когда: - Удаление оси VARIANT — вместо этого рекомбинируйте варианты компонентов без этой оси - Требуется только переименовать или изменить значение по умолчанию — используйте edit_component_prop Примеры: delete_component_prop({node: "1:2", name: "Show Icon"}) delete_component_prop({node: "1:2", name: "Footer"})

Удаляет свойство компонента из COMPONENT или COMPONENT_SET. Поддерживает BOOLEAN, TEXT, INSTANCE_SWAP и SLOT — НЕ VARIANT (ограничение Figma; ось варианта удаляется путём рекомбинации набора без неё). `name` — отображаемое имя свойства из list_component_props (без внутреннего суффикса #). Используйте, когда: - Удаление свойства, которое больше не нужно (очистка, редизайн) - Отмена ошибки add_component_prop Возвращает: { data: { message, nodeId } } Пропустите, когда: - Удаление оси VARIANT — вместо этого рекомбинируйте варианты компонентов без этой оси - Требуется только переименовать или изменить значение по умолчанию — используйте edit_component_prop Примеры: delete_component_prop({node: "1:2", name: "Show Icon"}) delete_component_prop({node: "1:2", name: "Footer"})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • namestringобязательный

    Property display name to delete (no #suffix)

delete_node

Удаляет узел и все его дочерние элементы. Идентификатор узла становится недействительным после удаления: удалите все кешированные ссылки. Используй, когда: - Удаляешь узлы, созданные ранее в этом сеансе (очистка, повторная попытка после неправильного размещения) - Пользователь явно просит убрать, удалить или «избавиться» от элемента Возвращает: { data: { id, name, changed: true } } Если удалённый узел НЕ был создан в текущем сеансе, ответ содержит дополнительное поле `warning`. Удаление всё равно происходит: это сигнал, что ты удалил существующую работу пользователя; сообщи об этом пользователю, если он не просил об удалении. Пропусти, когда: - Цель — корень страницы («/») — используй delete_page для удаления целой страницы - Ты хочешь переместить, а не удалить — используй move_node - Узел в данный момент выбран пользователем, и удаление не было явно запрошено — сначала подтверди через ask_user Примеры: delete_node({node: "1:2"})

Удаляет узел и все его дочерние элементы. Идентификатор узла становится недействительным после удаления: удалите все кешированные ссылки. Используй, когда: - Удаляешь узлы, созданные ранее в этом сеансе (очистка, повторная попытка после неправильного размещения) - Пользователь явно просит убрать, удалить или «избавиться» от элемента Возвращает: { data: { id, name, changed: true } } Если удалённый узел НЕ был создан в текущем сеансе, ответ содержит дополнительное поле `warning`. Удаление всё равно происходит: это сигнал, что ты удалил существующую работу пользователя; сообщи об этом пользователю, если он не просил об удалении. Пропусти, когда: - Цель — корень страницы («/») — используй delete_page для удаления целой страницы - Ты хочешь переместить, а не удалить — используй move_node - Узел в данный момент выбран пользователем, и удаление не было явно запрошено — сначала подтверди через ask_user Примеры: delete_node({node: "1:2"})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

delete_page

Удаляет страницу по ID. Все узлы на странице удаляются. Figma требует как минимум одну страницу. Попытка удалить единственную страницу приводит к ошибке. Если целевая страница в данный момент активна, Figma автоматически переключается сначала на другую страницу; ответ включает id/name новой текущей страницы, чтобы вызывающие стороны могли обновить свой курсор. Возвращает: {id, name, newCurrentPageId?, newCurrentPageName?}. Примеры: delete_page({pageId: "1:23"}) Сначала используйте switch_page({}), чтобы узнать ID.

Удаляет страницу по ID. Все узлы на странице удаляются. Figma требует как минимум одну страницу. Попытка удалить единственную страницу приводит к ошибке. Если целевая страница в данный момент активна, Figma автоматически переключается сначала на другую страницу; ответ включает id/name новой текущей страницы, чтобы вызывающие стороны могли обновить свой курсор. Возвращает: {id, name, newCurrentPageId?, newCurrentPageName?}. Примеры: delete_page({pageId: "1:23"}) Сначала используйте switch_page({}), чтобы узнать ID.

Параметры

  • pageIdstringобязательный

    Page ID to delete

delete_variable

Удаляет одну переменную. Все привязки узлов к ней становятся непривязанными (узел сохраняет своё конкретное значение на момент удаления). Родительская коллекция VariableCollection переживает удаление, даже если эта переменная была последней. Используйте delete_collection отдельно, чтобы удалить коллекцию. Возвращает: {ok: true}. Примеры: delete_variable({variable: "VariableID:1:5"})

Удаляет одну переменную. Все привязки узлов к ней становятся непривязанными (узел сохраняет своё конкретное значение на момент удаления). Родительская коллекция VariableCollection переживает удаление, даже если эта переменная была последней. Используйте delete_collection отдельно, чтобы удалить коллекцию. Возвращает: {ok: true}. Примеры: delete_variable({variable: "VariableID:1:5"})

Параметры

  • variablestringобязательный

    VariableID like "VariableID:1:5"

discover_props

Обнаруживает уникальные значения, используемые для заданных свойств в поддереве. Подходит для аудита дизайн-системы или выявления несоответствий. Используйте, когда: - Проверяете покрытие токенов — «какие цвета реально встречаются на этой странице?» - Выявляете выбросы — «есть ли нестандартные значения fontSize, не входящие в типографическую сетку?» - Перед массовым replace_props — чтобы узнать, какие исходные значения будут заменены Возвращает: { data: { <propName>: [<уникальные значения, дедуплицированные>...] } } Каждое запрошенное имя свойства становится ключом, а его значение — списком уникальных значений, найденных в любом узле поддерева. Доступные для поиска свойства: fillColor, textColor, strokeColor, strokeWeight, opacity, cornerRadius, gap, fontSize, fontFamily, fontWeight. Пропускайте, когда: - Нужны свойства конкретного узла — используйте inspect с facets - Нужно найти узлы ПО значению (а не значения по имени свойства) — используйте find_nodes или replace_props - Интересующее свойство отсутствует в списке доступных — discover_props не сможет его найти Примеры: discover_props({node: "1:2", props: ["fillColor", "fontSize"]}) discover_props({node: "/", props: ["cornerRadius", "opacity"]}) // вся страница

Обнаруживает уникальные значения, используемые для заданных свойств в поддереве. Подходит для аудита дизайн-системы или выявления несоответствий. Используйте, когда: - Проверяете покрытие токенов — «какие цвета реально встречаются на этой странице?» - Выявляете выбросы — «есть ли нестандартные значения fontSize, не входящие в типографическую сетку?» - Перед массовым replace_props — чтобы узнать, какие исходные значения будут заменены Возвращает: { data: { <propName>: [<уникальные значения, дедуплицированные>...] } } Каждое запрошенное имя свойства становится ключом, а его значение — списком уникальных значений, найденных в любом узле поддерева. Доступные для поиска свойства: fillColor, textColor, strokeColor, strokeWeight, opacity, cornerRadius, gap, fontSize, fontFamily, fontWeight. Пропускайте, когда: - Нужны свойства конкретного узла — используйте inspect с facets - Нужно найти узлы ПО значению (а не значения по имени свойства) — используйте find_nodes или replace_props - Интересующее свойство отсутствует в списке доступных — discover_props не сможет его найти Примеры: discover_props({node: "1:2", props: ["fillColor", "fontSize"]}) discover_props({node: "/", props: ["cornerRadius", "opacity"]}) // вся страница

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • propsstring[]обязательный

    Properties to discover (≥1)

edit

Обновляет свойства узлов пакетно. Универсальный инструмент записи — используйте для размеров, радиуса, прозрачности, эффектов, переопределения свойств экземпляров компонентов или любых других свойств, не охваченных специализированными установщиками. Для изменения одного свойства отдавайте предпочтение специализированным установщикам (они проверяют ввод более строго): set_text — текстовое содержимое set_fill — заливка / цвет фона set_stroke — граница set_layout — авто-раскладка (отступ, поля, направление) Используйте, когда: - Пакетные исправления — несколько узлов, смешанные свойства в одном вызове - Свойства, не охваченные установщиками: w/h, corner, opacity, blur, shadow, INSTANCE TEXT/BOOLEAN/INSTANCE_SWAP переопределения - Нужно смешивать свойства Figma и переопределения свойств компонента в одной записи узла Возвращает (на узел): `applied: [keys]` (записано), `noop: [keys]` (уже такое значение), `rejected: [{key, reason}]`. Пустые массивы опускаются. - Одиночный: { data: { id, name, type, applied?, noop?, rejected? } } - Пакетный: { data: { count, results: [...], errors?, partial? } } `rejected` — это ТЕРМИНАЛЬНАЯ ошибка: свойство недопустимо для этого типа узла (например, `corner`/cornerRadius на узле TEXT, `layoutMode` на векторном узле) или только для чтения — оно НИКОГДА не применится. НЕ повторяйте попытку с отклонённым свойством; выберите другое, допустимое для этого типа узла, или другой узел. Если ВСЕ запрошенные свойства отклонены, вызов возвращает `{ error }` — не вызывайте его повторно. `partial: true` (пакетный) означает, что часть записей успешно обработана, а часть нет — проверьте `errors[]`, чтобы узнать, какие записи повторить. Не используйте, когда: - Одно свойство на одном узле — используйте специализированный установщик для более понятных ошибок - Цвет через токен переменной — используйте set_fill/set_stroke (здесь edit молча отбрасывает токены без полного пути) - Нужно применить авто-раскладку — используйте set_layout Переопределения свойств компонентов: Для экземпляров используйте ОТОБРАЖАЕМЫЕ имена свойств (например, "Label") — edit автоматически сопоставляет их с внутренними ключами Figma. Свойства компонентов смешиваются со свойствами Figma в одном вызове. Примеры: edit({node: "1:2", props: {corner: 16, opacity: 0.8}}) edit({nodes: [ {node: "1:1", props: {w: "fill",…}}

Обновляет свойства узлов пакетно. Универсальный инструмент записи — используйте для размеров, радиуса, прозрачности, эффектов, переопределения свойств экземпляров компонентов или любых других свойств, не охваченных специализированными установщиками. Для изменения одного свойства отдавайте предпочтение специализированным установщикам (они проверяют ввод более строго): set_text — текстовое содержимое set_fill — заливка / цвет фона set_stroke — граница set_layout — авто-раскладка (отступ, поля, направление) Используйте, когда: - Пакетные исправления — несколько узлов, смешанные свойства в одном вызове - Свойства, не охваченные установщиками: w/h, corner, opacity, blur, shadow, INSTANCE TEXT/BOOLEAN/INSTANCE_SWAP переопределения - Нужно смешивать свойства Figma и переопределения свойств компонента в одной записи узла Возвращает (на узел): `applied: [keys]` (записано), `noop: [keys]` (уже такое значение), `rejected: [{key, reason}]`. Пустые массивы опускаются. - Одиночный: { data: { id, name, type, applied?, noop?, rejected? } } - Пакетный: { data: { count, results: [...], errors?, partial? } } `rejected` — это ТЕРМИНАЛЬНАЯ ошибка: свойство недопустимо для этого типа узла (например, `corner`/cornerRadius на узле TEXT, `layoutMode` на векторном узле) или только для чтения — оно НИКОГДА не применится. НЕ повторяйте попытку с отклонённым свойством; выберите другое, допустимое для этого типа узла, или другой узел. Если ВСЕ запрошенные свойства отклонены, вызов возвращает `{ error }` — не вызывайте его повторно. `partial: true` (пакетный) означает, что часть записей успешно обработана, а часть нет — проверьте `errors[]`, чтобы узнать, какие записи повторить. Не используйте, когда: - Одно свойство на одном узле — используйте специализированный установщик для более понятных ошибок - Цвет через токен переменной — используйте set_fill/set_stroke (здесь edit молча отбрасывает токены без полного пути) - Нужно применить авто-раскладку — используйте set_layout Переопределения свойств компонентов: Для экземпляров используйте ОТОБРАЖАЕМЫЕ имена свойств (например, "Label") — edit автоматически сопоставляет их с внутренними ключами Figma. Свойства компонентов смешиваются со свойствами Figma в одном вызове. Примеры: edit({node: "1:2", props: {corner: 16, opacity: 0.8}}) edit({nodes: [ {node: "1:1", props: {w: "fill",…}}

Параметры

  • nodestring

    Node ID like "1:2"

  • propsobject

    Properties to update — pass at least one REAL key, never {}. Common keys shown below; also accepts any other registry prop or instance component-override (by display name, e.g. "Label"). For text content use `content`; for fill/stroke/layout prefer the focused setters.

  • contentstring

    New text content

  • nodesobject[]

    Batch: [{node, props?, content?}]

edit_component_prop

Редактирует существующее свойство компонента у COMPONENT или COMPONENT_SET: переименовывает его, меняет значение по умолчанию или обновляет preferred values / description. Нельзя изменить TYPE свойства (удалите и добавьте заново, чтобы сменить тип). Согласно Figma API: - newName — поддерживается для всех типов (TEXT/BOOLEAN/INSTANCE_SWAP/VARIANT/SLOT) - default — только для BOOLEAN/TEXT/INSTANCE_SWAP (не для VARIANT или SLOT) - preferredValues — только для INSTANCE_SWAP/SLOT; {type, key}[] с ключами опубликованных компонентов - description — только для SLOT `name` — это текущее отображаемое имя из list_component_props (без внутреннего #суффикса). Укажите хотя бы один из параметров: newName/default/preferredValues/description. Используйте, когда: - Переименовываете свойство постфактум (например, "Icon" → "Leading Icon") - Меняете значение по умолчанию (другую метку/состояние/цель замены) - Корректируете предпочтительные кандидаты INSTANCE_SWAP/SLOT Возвращает: { data: { message, nodeId, property: <новое отображаемое имя> } } Пропустите, когда: - Хотите изменить тип свойства — удалите через delete_component_prop и добавьте через add_component_prop - Переименовываете значение оси VARIANT — оно задаётся именами variant-компонентов (recombine) Примеры: edit_component_prop({node: "1:2", name: "Icon", newName: "Leading Icon"}) edit_component_prop({node: "1:2", name: "Label", default: "Submit"}) edit_component_prop({node: "1:2", name: "Icon", preferredValues: [{type: "COMPONENT", key: "abc123"}]})

Редактирует существующее свойство компонента у COMPONENT или COMPONENT_SET: переименовывает его, меняет значение по умолчанию или обновляет preferred values / description. Нельзя изменить TYPE свойства (удалите и добавьте заново, чтобы сменить тип). Согласно Figma API: - newName — поддерживается для всех типов (TEXT/BOOLEAN/INSTANCE_SWAP/VARIANT/SLOT) - default — только для BOOLEAN/TEXT/INSTANCE_SWAP (не для VARIANT или SLOT) - preferredValues — только для INSTANCE_SWAP/SLOT; {type, key}[] с ключами опубликованных компонентов - description — только для SLOT `name` — это текущее отображаемое имя из list_component_props (без внутреннего #суффикса). Укажите хотя бы один из параметров: newName/default/preferredValues/description. Используйте, когда: - Переименовываете свойство постфактум (например, "Icon" → "Leading Icon") - Меняете значение по умолчанию (другую метку/состояние/цель замены) - Корректируете предпочтительные кандидаты INSTANCE_SWAP/SLOT Возвращает: { data: { message, nodeId, property: <новое отображаемое имя> } } Пропустите, когда: - Хотите изменить тип свойства — удалите через delete_component_prop и добавьте через add_component_prop - Переименовываете значение оси VARIANT — оно задаётся именами variant-компонентов (recombine) Примеры: edit_component_prop({node: "1:2", name: "Icon", newName: "Leading Icon"}) edit_component_prop({node: "1:2", name: "Label", default: "Submit"}) edit_component_prop({node: "1:2", name: "Icon", preferredValues: [{type: "COMPONENT", key: "abc123"}]})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • namestringобязательный

    Current property display name (from list_component_props, no #suffix)

  • newNamestring

    Rename the property

  • defaultstring

    New default value. BOOLEAN/TEXT/INSTANCE_SWAP only — not VARIANT/SLOT.

  • preferredValuesobject[]

    New preferred values (INSTANCE_SWAP/SLOT only), {type, key} published keys

  • descriptionstring

    New description (SLOT only)

edit_jsx

Обновляет существующие узлы, редактируя канонический JSX-текст поддерева. Работает по тому же принципу, что и инструмент Edit в Claude Code: передайте подстроку `old` (из вывода `read_jsx`) и подстроку `new`; система находит совпадение, разбирает новый JSX и применяет изменения свойств ко всем узлам, чей `id` сохраняется при переходе old → new. Сначала прочитайте, потом редактируйте. `old` должна быть взята из вывода `read_jsx` для той же области видимости. Уникальность обязательна, если только `replace_all` не равен `true`. Цепочка правок — НЕ перечитывайте между правками. При успехе ответ возвращает сериализованную область видимости как `data.jsx` (тот же формат с номерами строк, что и `read_jsx`, отражающий ваше изменение). Следующую `old` берите ИЗ ЭТОГО вывода, а не из устаревшего предыдущего. Вызывайте `read_jsx` снова, только если установлен `data.jsxTruncated` (область слишком велика для эха). Допустимые формы `new`: - Самозакрывающийся: `<frame id="1:5" bg="#0066FF" rounded={8} />` — только правка свойств, дочерние элементы не трогаются - Только открывающий тег: `<frame id="1:5" bg="#0066FF" rounded={8}>` — автоматически преобразуется в самозакрывающийся (та же семантика, что выше) - Полный элемент с закрывающим: `<frame id="1:5" ...>...children...</frame>` — затрагивает и вложенные id Что делает (объём MVP): - Для каждого `<tag id="X:Y" ...>...</tag>` в `new` устанавливает свойства этого узла в соответствии с указанными (несколько узлов, несколько свойств за один вызов). - Для текстовых узлов содержимое дочернего текста трактуется как новые `characters`. - Значения по умолчанию отбрасываются, словарь использует сокращённые имена из DSL (w/h/p/gap/bg/rounded/layout/justify/items/content). Чего НЕ делает: - Создания новых дочерних элементов (используйте инструмент `jsx` — описание расскажет, что поддерживается). - Удаления дочерних элементов, исчезнувших из `new` (используйте `delete_node`). - Смены родителя / перемещения (используйте `move_node`). Пример: изменить стиль кнопки: // 1. Сначала читаем read_jsx({ node: "1:1" }) // 2. Редактируем edit_jsx({ scope: "1:1", old: '<frame id="1:5" w="fill" h={44} rounded={8} bg="#000">', new: '<frame id="1:5" w="fill" h={44} rounded={12} bg="#0066FF">', }) // → обновляет узел 1:5, меняет rounded + bg Пример: …

Обновляет существующие узлы, редактируя канонический JSX-текст поддерева. Работает по тому же принципу, что и инструмент Edit в Claude Code: передайте подстроку `old` (из вывода `read_jsx`) и подстроку `new`; система находит совпадение, разбирает новый JSX и применяет изменения свойств ко всем узлам, чей `id` сохраняется при переходе old → new. Сначала прочитайте, потом редактируйте. `old` должна быть взята из вывода `read_jsx` для той же области видимости. Уникальность обязательна, если только `replace_all` не равен `true`. Цепочка правок — НЕ перечитывайте между правками. При успехе ответ возвращает сериализованную область видимости как `data.jsx` (тот же формат с номерами строк, что и `read_jsx`, отражающий ваше изменение). Следующую `old` берите ИЗ ЭТОГО вывода, а не из устаревшего предыдущего. Вызывайте `read_jsx` снова, только если установлен `data.jsxTruncated` (область слишком велика для эха). Допустимые формы `new`: - Самозакрывающийся: `<frame id="1:5" bg="#0066FF" rounded={8} />` — только правка свойств, дочерние элементы не трогаются - Только открывающий тег: `<frame id="1:5" bg="#0066FF" rounded={8}>` — автоматически преобразуется в самозакрывающийся (та же семантика, что выше) - Полный элемент с закрывающим: `<frame id="1:5" ...>...children...</frame>` — затрагивает и вложенные id Что делает (объём MVP): - Для каждого `<tag id="X:Y" ...>...</tag>` в `new` устанавливает свойства этого узла в соответствии с указанными (несколько узлов, несколько свойств за один вызов). - Для текстовых узлов содержимое дочернего текста трактуется как новые `characters`. - Значения по умолчанию отбрасываются, словарь использует сокращённые имена из DSL (w/h/p/gap/bg/rounded/layout/justify/items/content). Чего НЕ делает: - Создания новых дочерних элементов (используйте инструмент `jsx` — описание расскажет, что поддерживается). - Удаления дочерних элементов, исчезнувших из `new` (используйте `delete_node`). - Смены родителя / перемещения (используйте `move_node`). Пример: изменить стиль кнопки: // 1. Сначала читаем read_jsx({ node: "1:1" }) // 2. Редактируем edit_jsx({ scope: "1:1", old: '<frame id="1:5" w="fill" h={44} rounded={8} bg="#000">', new: '<frame id="1:5" w="fill" h={44} rounded={12} bg="#0066FF">', }) // → обновляет узел 1:5, меняет rounded + bg Пример: …

Параметры

  • scopestringобязательный

    Node ID defining the search/edit window (the "file")

  • oldstringобязательный

    JSX text to replace — must appear in the scope's read_jsx output

  • newstringобязательный

    Replacement JSX text — same dialect as read_jsx output

  • replace_allboolean

    Replace every occurrence of `old`. Default: false (uniqueness required)

expose_nested_instances

Открывает доступ к основным вложенным экземплярам внутри COMPONENT или COMPONENT_SET, чтобы их собственные свойства компонента отображались на родителе - экземпляры родителя затем могут напрямую настраивать свойства вложенного экземпляра (например, Card открывает доступ к Label/State своей вложенной Button). Проходит по прямым основным экземплярам компонента и устанавливает для каждого isExposedInstance=true. Только ОСНОВНЫЕ экземпляры (непосредственно внутри компонента, а не вложенные в другой экземпляр) могут быть открыты - остальные пропускаются. Используйте когда: - Компонент содержит повторно используемые экземпляры подкомпонентов, свойства которых должны настраиваться с родителя (Card -> вложенная Button, List -> вложенная Row) Возвращает: { data: { message, nodeId, exposed: [names] } } Пропускайте когда: - У компонента нет вложенных дочерних экземпляров INSTANCE - Вам нужны только переопределения для каждого экземпляра (устанавливайте их на каждом экземпляре через параметры create_instance) Примеры: expose_nested_instances({node: "1:2"})

Открывает доступ к основным вложенным экземплярам внутри COMPONENT или COMPONENT_SET, чтобы их собственные свойства компонента отображались на родителе - экземпляры родителя затем могут напрямую настраивать свойства вложенного экземпляра (например, Card открывает доступ к Label/State своей вложенной Button). Проходит по прямым основным экземплярам компонента и устанавливает для каждого isExposedInstance=true. Только ОСНОВНЫЕ экземпляры (непосредственно внутри компонента, а не вложенные в другой экземпляр) могут быть открыты - остальные пропускаются. Используйте когда: - Компонент содержит повторно используемые экземпляры подкомпонентов, свойства которых должны настраиваться с родителя (Card -> вложенная Button, List -> вложенная Row) Возвращает: { data: { message, nodeId, exposed: [names] } } Пропускайте когда: - У компонента нет вложенных дочерних экземпляров INSTANCE - Вам нужны только переопределения для каждого экземпляра (устанавливайте их на каждом экземпляре через параметры create_instance) Примеры: expose_nested_instances({node: "1:2"})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

find_nodes

Ищет узлы на текущей странице по подстроке имени или типу. Регистронезависимо. Ограничено текущей страницей — сначала вызовите switch_page, если ваша цель находится на другой странице. Логика совпадения: узел совпадает, если его NAME содержит запрос (подстроку) ИЛИ его TYPE равен запросу (точно, в нижнем регистре). Поэтому запрос "frame" находит и узлы с именем "Frame 12", и все узлы типа FRAME. Используйте, когда: - Пользователь ссылается на узел по имени без ID ("кнопка Hero", "подвал") - Нужно найти все узлы определённого типа (COMPONENT, TEXT, FRAME, INSTANCE) перед массовыми операциями - Ищете существующие узлы перед вызовом jsx(), чтобы подключить их как <instance>/<component> Возвращает: { data: { results: [{id, name, type, x, y, width, height}], total, truncated: boolean } } Не более 20 результатов — задайте явную область поиска, если результаты усечены. Пропустите, если: - У вас уже есть ID узла — сразу вызовите inspect - Вам нужно текущее выделение пользователя — используйте get_selection - Цель находится на другой странице — сначала вызовите switch_page Примеры: find_nodes({query: "Button"}) // по подстроке имени find_nodes({query: "frame"}) // по типу (FRAME) find_nodes({query: "Card", scope: "1:2"}) // в поддереве

Ищет узлы на текущей странице по подстроке имени или типу. Регистронезависимо. Ограничено текущей страницей — сначала вызовите switch_page, если ваша цель находится на другой странице. Логика совпадения: узел совпадает, если его NAME содержит запрос (подстроку) ИЛИ его TYPE равен запросу (точно, в нижнем регистре). Поэтому запрос "frame" находит и узлы с именем "Frame 12", и все узлы типа FRAME. Используйте, когда: - Пользователь ссылается на узел по имени без ID ("кнопка Hero", "подвал") - Нужно найти все узлы определённого типа (COMPONENT, TEXT, FRAME, INSTANCE) перед массовыми операциями - Ищете существующие узлы перед вызовом jsx(), чтобы подключить их как <instance>/<component> Возвращает: { data: { results: [{id, name, type, x, y, width, height}], total, truncated: boolean } } Не более 20 результатов — задайте явную область поиска, если результаты усечены. Пропустите, если: - У вас уже есть ID узла — сразу вызовите inspect - Вам нужно текущее выделение пользователя — используйте get_selection - Цель находится на другой странице — сначала вызовите switch_page Примеры: find_nodes({query: "Button"}) // по подстроке имени find_nodes({query: "frame"}) // по типу (FRAME) find_nodes({query: "Card", scope: "1:2"}) // в поддереве

Параметры

  • querystringобязательный

    Search query — matches node name or type

  • scopestring

    Limit search to subtree. Default: entire page.

get_screenshot

Захватывает PNG-скриншот узла. Используйте после изменений стиля, чтобы визуально проверить результат вместо чтения свойств. Возвращает base64 PNG данные, встроенные в ответ. Параметры: node: ID узла из результатов jsx/inspect (например "100:5"). Корень страницы ("/") не поддерживается. scale: Масштаб экспорта 0.5–2 (по умолчанию 1). Выше = больше файл. padding: Зарезервировано для будущего использования — в настоящее время игнорируется. Примеры: get_screenshot({node: "100:5"}) → PNG с масштабом 1x get_screenshot({node: "100:5", scale: 2}) → PNG с масштабом 2x (чётче)

Захватывает PNG-скриншот узла. Используйте после изменений стиля, чтобы визуально проверить результат вместо чтения свойств. Возвращает base64 PNG данные, встроенные в ответ. Параметры: node: ID узла из результатов jsx/inspect (например "100:5"). Корень страницы ("/") не поддерживается. scale: Масштаб экспорта 0.5–2 (по умолчанию 1). Выше = больше файл. padding: Зарезервировано для будущего использования — в настоящее время игнорируется. Примеры: get_screenshot({node: "100:5"}) → PNG с масштабом 1x get_screenshot({node: "100:5", scale: 2}) → PNG с масштабом 2x (чётче)

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • scalenumber

    Export scale 0.5–2 (default 1)

  • paddingnumber

    Reserved for future use

get_selection

Получает выбранные в данный момент узлы пользователя в Figma. Возвращает имена, типы и ID узлов выбранных элементов. Вызывайте этот инструмент, когда намерение пользователя связано с изменением существующих элементов: - «изменить эту кнопку», «обновить карточку», «исправить отступы» - Ссылки на «этот», «выбранный», «это» Пропускайте для новых запросов на дизайн («разработать страницу входа», «создать дашборд»): на новом холсте нет выделения для чтения, поэтому вызов ничего не возвращает и тратит итерацию впустую. Примеры: get_selection()

Получает выбранные в данный момент узлы пользователя в Figma. Возвращает имена, типы и ID узлов выбранных элементов. Вызывайте этот инструмент, когда намерение пользователя связано с изменением существующих элементов: - «изменить эту кнопку», «обновить карточку», «исправить отступы» - Ссылки на «этот», «выбранный», «это» Пропускайте для новых запросов на дизайн («разработать страницу входа», «создать дашборд»): на новом холсте нет выделения для чтения, поэтому вызов ничего не возвращает и тратит итерацию впустую. Примеры: get_selection()

Параметры

Без параметров.

inspect

Читает ноды дизайна — выбирает, что показать, с помощью `facets`. По умолчанию (без facets) возвращает скелет: id, name, type, role, children. Для всего остального перечислите нужные facets — ничего лишнего не включается. Facets: structure name, type, size, layout shorthand — дешёвый обзор layout layoutMode/gap/padding/align/sizing (row/column, fill/hug, и т.д.) paint|fill fills + Paint.boundVariables.color (см. bound tokens) stroke strokes, strokeWeight, strokeAlign, dashPattern effects shadows, blurs typography|text fontFamily, fontSize, fontWeight, lineHeight, letterSpacing appearance opacity, visible, blendMode, cornerRadius, clipsContent variables node-level boundVariables + explicitVariableModes (привязки токенов) lint вид проверки — сводка по роли ноды + визуальный/компоновочный обзор + проблемы (серьёзность error/warning/info). Только для конкретной ноды, глубина по умолчанию 3; исключительный (игнорирует другие facets). all всё Параметры: node "/" для корня страницы, либо ID ноды из результатов jsx/inspect (например, "100:5"). facets массив названий facets из списка выше. depth максимальная глубина дерева (по умолчанию: 5, макс.: 10). Выбор: когда в запросе пользователя есть блок `<selected_nodes>[{id,name,type}…]</selected_nodes>», эти ID авторитетны (ссылка, а не снимок) — инспектируйте их напрямую, не вызывайте `get_selection`. Начинайте с малой глубины (1–2); углубляйтесь только если задача требует доступа к листьям — полный дамп большого дерева сжигает тысячи токенов. Примеры: inspect({node: "/"}) → скелет страницы inspect({node: "100:5"}) → скелет одной ноды inspect({node: "100:5", facets: ["variables"]}) → только привязки токенов inspect({node: "100:5", facets: ["layout", "paint"]}) → компоновка + заливки inspect({node: "100:5", facets: ["all"]}) → все свойства inspect({node: "100:5", facets: ["lint"]}) → проверка поддерева (роли + проблемы) Используйте `get_screenshot` для…

Читает ноды дизайна — выбирает, что показать, с помощью `facets`. По умолчанию (без facets) возвращает скелет: id, name, type, role, children. Для всего остального перечислите нужные facets — ничего лишнего не включается. Facets: structure name, type, size, layout shorthand — дешёвый обзор layout layoutMode/gap/padding/align/sizing (row/column, fill/hug, и т.д.) paint|fill fills + Paint.boundVariables.color (см. bound tokens) stroke strokes, strokeWeight, strokeAlign, dashPattern effects shadows, blurs typography|text fontFamily, fontSize, fontWeight, lineHeight, letterSpacing appearance opacity, visible, blendMode, cornerRadius, clipsContent variables node-level boundVariables + explicitVariableModes (привязки токенов) lint вид проверки — сводка по роли ноды + визуальный/компоновочный обзор + проблемы (серьёзность error/warning/info). Только для конкретной ноды, глубина по умолчанию 3; исключительный (игнорирует другие facets). all всё Параметры: node "/" для корня страницы, либо ID ноды из результатов jsx/inspect (например, "100:5"). facets массив названий facets из списка выше. depth максимальная глубина дерева (по умолчанию: 5, макс.: 10). Выбор: когда в запросе пользователя есть блок `<selected_nodes>[{id,name,type}…]</selected_nodes>», эти ID авторитетны (ссылка, а не снимок) — инспектируйте их напрямую, не вызывайте `get_selection`. Начинайте с малой глубины (1–2); углубляйтесь только если задача требует доступа к листьям — полный дамп большого дерева сжигает тысячи токенов. Примеры: inspect({node: "/"}) → скелет страницы inspect({node: "100:5"}) → скелет одной ноды inspect({node: "100:5", facets: ["variables"]}) → только привязки токенов inspect({node: "100:5", facets: ["layout", "paint"]}) → компоновка + заливки inspect({node: "100:5", facets: ["all"]}) → все свойства inspect({node: "100:5", facets: ["lint"]}) → проверка поддерева (роли + проблемы) Используйте `get_screenshot` для…

Параметры

  • nodestringобязательный

    "/" for page root, or node ID

  • facetsstring[]

    Property buckets to surface

  • depthinteger

    Max depth (default 5, max 10)

jsx

Создаёт деревья дизайна с вложенной JSX-разметкой. Один вызов `jsx` атомарно собирает целое поддерево — вложенность задаёт иерархию. Держите одну логическую единицу внутри одного вызова; дочерние элементы возвращаемого корня уже построены, а не заглушки для последующего заполнения. Примеры: ``` jsx({markup: "<frame name='Card' layout='column' padding={16} fill='#FFFFFF' w='fill' />"}) jsx({markup: "<frame name='Row' layout='row' gap={8} padding={12} w='fill'><icon name='lucide:settings' size={20} /><text name='Label' w='fill'>Account</text><icon name='lucide:chevron-right' size={16} /></frame>"}) ``` Элементы: frame, text, rect, ellipse, line, icon, image, instance, component, group, section, vector Атрибуты (frame): layout, justify, items, wrap, w, h, minW, maxW, p, gap, bg, fill, rounded, stroke, shadow, blur, bgblur, opacity, layoutPositioning Атрибуты (сетка-контейнер): cols, rows, gap, rowGap, colGap, colSizes, rowSizes, autoFlow, autoRows — см. «Сеточный layout» ниже Атрибуты (дочерний элемент сетки): colSpan, rowSpan, alignX, alignY, rowStart, colStart Атрибуты (text): size, weight, lineHeight, font, fill, w (w=«fill» для переноса), maxLines, textTruncation, paragraphSpacing Многоабзацный текст: ставьте ПУСТУЮ СТРОКУ между абзацами внутри <text> — она станет настоящим разрывом абзаца. Одиночный перевод строки схлопывается в пробел (прозаический перенос); для жёсткого переноса на одну строку пишите {'\n'}. Парный многоабзацевый основной текст с paragraphSpacing={N} даёт отступ между абзацами. Обрезка: maxLines={N} обрезает переносимый текст до N строк с многоточием (требует ограниченной ширины, например w=«fill» или w={240}). Продвинутый текст — встроенные акценты (**жирный** *курсив* ~~зачёркнутый~~ в содержимом), цветные/размерные отрезки, вертикальная обрезка, висячий отступ/пунктуация, межсписочные интервалы → читайте skill:typography (не встраивайте их сюда). Эффекты: shadow=«0,8,32,0,#0006» или shadow={shadow(0,8,32,0,'#0006')}; blur={10} для размытия слоя; bgblur={20} для фонового размытия матового стекла/стекломорфизма. Несколько эффектов объединяются автоматически. Оформление в…

Создаёт деревья дизайна с вложенной JSX-разметкой. Один вызов `jsx` атомарно собирает целое поддерево — вложенность задаёт иерархию. Держите одну логическую единицу внутри одного вызова; дочерние элементы возвращаемого корня уже построены, а не заглушки для последующего заполнения. Примеры: ``` jsx({markup: "<frame name='Card' layout='column' padding={16} fill='#FFFFFF' w='fill' />"}) jsx({markup: "<frame name='Row' layout='row' gap={8} padding={12} w='fill'><icon name='lucide:settings' size={20} /><text name='Label' w='fill'>Account</text><icon name='lucide:chevron-right' size={16} /></frame>"}) ``` Элементы: frame, text, rect, ellipse, line, icon, image, instance, component, group, section, vector Атрибуты (frame): layout, justify, items, wrap, w, h, minW, maxW, p, gap, bg, fill, rounded, stroke, shadow, blur, bgblur, opacity, layoutPositioning Атрибуты (сетка-контейнер): cols, rows, gap, rowGap, colGap, colSizes, rowSizes, autoFlow, autoRows — см. «Сеточный layout» ниже Атрибуты (дочерний элемент сетки): colSpan, rowSpan, alignX, alignY, rowStart, colStart Атрибуты (text): size, weight, lineHeight, font, fill, w (w=«fill» для переноса), maxLines, textTruncation, paragraphSpacing Многоабзацный текст: ставьте ПУСТУЮ СТРОКУ между абзацами внутри <text> — она станет настоящим разрывом абзаца. Одиночный перевод строки схлопывается в пробел (прозаический перенос); для жёсткого переноса на одну строку пишите {'\n'}. Парный многоабзацевый основной текст с paragraphSpacing={N} даёт отступ между абзацами. Обрезка: maxLines={N} обрезает переносимый текст до N строк с многоточием (требует ограниченной ширины, например w=«fill» или w={240}). Продвинутый текст — встроенные акценты (**жирный** *курсив* ~~зачёркнутый~~ в содержимом), цветные/размерные отрезки, вертикальная обрезка, висячий отступ/пунктуация, межсписочные интервалы → читайте skill:typography (не встраивайте их сюда). Эффекты: shadow=«0,8,32,0,#0006» или shadow={shadow(0,8,32,0,'#0006')}; blur={10} для размытия слоя; bgblur={20} для фонового размытия матового стекла/стекломорфизма. Несколько эффектов объединяются автоматически. Оформление в…

Параметры

  • markupstringобязательный

    JSX-like nested markup string

  • parentstring

    Target parent node ID

  • replaceIdstring

    Replace this existing node in-place

  • insertIndexinteger

    Position among parent siblings (0 = first)

list_component_props

Перечисляет свойства (и варианты, где применимо) для COMPONENT, COMPONENT_SET или INSTANCE. Используйте, когда: - Нужно узнать, какие свойства предоставляет существующий компонент перед вызовом edit() или add_component_prop - Нужно проверить, какие варианты существуют в COMPONENT_SET перед созданием нового экземпляра - Нужно проверить текущие переопределения свойств экземпляра INSTANCE Возвращает: { data: { listing: <многострочная форматированная строка> } } Этот listing — человекочитаемый текстовый блок (не структурированный JSON). Форма зависит от типа узла: - COMPONENT_SET: имя, количество вариантов, имена вариантов, таблица свойств (тип / имя / значение по умолчанию) - COMPONENT: имя, id, таблица свойств, имя родительского набора (если входит в состав) - INSTANCE: имя основного компонента + текущие переопределения свойств Пропускайте, когда: - Цель не является компонентом или экземпляром — используйте inspect() для произвольных узлов - Вы уже перечислили свойства этого компонента в этом ходе — сохраните результат, повторное перечисление тратит итерацию - Вам нужна полная структура поддерева — используйте inspect() с facets Примеры: list_component_props({node: "1:2"})

Перечисляет свойства (и варианты, где применимо) для COMPONENT, COMPONENT_SET или INSTANCE. Используйте, когда: - Нужно узнать, какие свойства предоставляет существующий компонент перед вызовом edit() или add_component_prop - Нужно проверить, какие варианты существуют в COMPONENT_SET перед созданием нового экземпляра - Нужно проверить текущие переопределения свойств экземпляра INSTANCE Возвращает: { data: { listing: <многострочная форматированная строка> } } Этот listing — человекочитаемый текстовый блок (не структурированный JSON). Форма зависит от типа узла: - COMPONENT_SET: имя, количество вариантов, имена вариантов, таблица свойств (тип / имя / значение по умолчанию) - COMPONENT: имя, id, таблица свойств, имя родительского набора (если входит в состав) - INSTANCE: имя основного компонента + текущие переопределения свойств Пропускайте, когда: - Цель не является компонентом или экземпляром — используйте inspect() для произвольных узлов - Вы уже перечислили свойства этого компонента в этом ходе — сохраните результат, повторное перечисление тратит итерацию - Вам нужна полная структура поддерева — используйте inspect() с facets Примеры: list_component_props({node: "1:2"})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

list_variables

Перечисляет переменные в виде плоского массива с используемыми коллекциями. Возвращает {data: {variables[], collections[], nextCursor?}}. Каждая переменная содержит полную структуру Figma: id, name, variableCollectionId, resolvedType, valuesByMode. collections[] включает только коллекции, на которые ссылаются возвращённые переменные (используйте для разрешения имён режимов). Параметры: collection — VariableCollectionId для фильтрации filter — подстрока для поиска по имени переменной (без учёта регистра) cursor — непрозрачный курсор пагинации из предыдущего вызова limit — максимальное количество переменных на странице (по умолчанию 100) Примеры: list_variables() list_variables({collection: "VariableCollectionId:1:2"}) list_variables({filter: "bg"}) list_variables({cursor: "100"})

Перечисляет переменные в виде плоского массива с используемыми коллекциями. Возвращает {data: {variables[], collections[], nextCursor?}}. Каждая переменная содержит полную структуру Figma: id, name, variableCollectionId, resolvedType, valuesByMode. collections[] включает только коллекции, на которые ссылаются возвращённые переменные (используйте для разрешения имён режимов). Параметры: collection — VariableCollectionId для фильтрации filter — подстрока для поиска по имени переменной (без учёта регистра) cursor — непрозрачный курсор пагинации из предыдущего вызова limit — максимальное количество переменных на странице (по умолчанию 100) Примеры: list_variables() list_variables({collection: "VariableCollectionId:1:2"}) list_variables({filter: "bg"}) list_variables({cursor: "100"})

Параметры

  • collectionstring

    VariableCollectionId like "VariableCollectionId:1:2"

  • filterstring

    Substring match on variable name (case-insensitive)

  • cursorstring

    Opaque pagination cursor

  • limitnumber

    Max variables per page (default 100)

move_node

Перемещает узел без его пересоздания. Сохраняет ID, связанные переменные и экземпляры компонентов при перемещении, поэтому вызывающий код, отслеживающий узел по ID, никогда не должен заново его находить. Используется для: (a) изменения порядка дочерних элементов внутри контейнера, (b) перемещения поддерева в другой родительский элемент, (c) исправления ошибки размещения после jsx. Примеры: move_node({node: "1:3", name: "NewTitle"}) — переименование на месте move_node({node: "1:3", parent: "1:4"}) — перемещение в родитель 1:4 move_node({node: "1:5", index: 0}) — переупорядочение внутри текущего родителя

Перемещает узел без его пересоздания. Сохраняет ID, связанные переменные и экземпляры компонентов при перемещении, поэтому вызывающий код, отслеживающий узел по ID, никогда не должен заново его находить. Используется для: (a) изменения порядка дочерних элементов внутри контейнера, (b) перемещения поддерева в другой родительский элемент, (c) исправления ошибки размещения после jsx. Примеры: move_node({node: "1:3", name: "NewTitle"}) — переименование на месте move_node({node: "1:3", parent: "1:4"}) — перемещение в родитель 1:4 move_node({node: "1:5", index: 0}) — переупорядочение внутри текущего родителя

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • parentstring

    Target parent node ID

  • namestring

    New name (rename without changing parent)

  • indexinteger

    Reorder position among siblings. 0 = first, -1 = last.

read_jsx

Читает поддерево Figma как канонический JSX-текст: тот же диалект, который инструмент `jsx` принимает на вход. Вывод нумеруется строками и стабилен по байтам: вырезав фрагмент и передав его как `old_string` для `edit_jsx`, вы гарантированно получите совпадение. Каждый существующий узел содержит `id="X:Y"` в качестве первого атрибута, чтобы edit_jsx мог обновить его на месте. Значения по умолчанию опускаются, словарь использует короткие DSL-имена (w/h/p/gap/bg/rounded/layout/justify/items/content). Когда использовать: - Перед `edit_jsx`: сначала прочитайте поддерево, чтобы получить точный текст для замены. - Чтобы просмотреть поддерево как код, а не как JSON (inspect facets). - Чтобы подготовить подстроку для поиска через `search_jsx`. Пропустите, когда: - Вам нужно только одно значение свойства — используйте inspect с facets. - Нужны привязки переменных или ссылки на стили — используйте facet variables/styles у inspect. Пример: read_jsx({ node: "1:1" }) → 0001 <frame id="1:1" name="Login" w={320} h={480} layout="column" gap={12} p={24} bg="#fff"> 0002 <text id="1:2" size={24} weight="Bold">Welcome back</text> 0003 <frame id="1:3" w="fill" h={44} rounded={8} layout="row" justify="center" items="center" bg="#000"> 0004 <text id="1:4" size={14} fill="#fff">Sign In</text> 0005 </frame> 0006 </frame> Вывод обёрнут в {data:{jsx:"..."}} — передайте jsx (с номерами строк или без) в edit_jsx.

Читает поддерево Figma как канонический JSX-текст: тот же диалект, который инструмент `jsx` принимает на вход. Вывод нумеруется строками и стабилен по байтам: вырезав фрагмент и передав его как `old_string` для `edit_jsx`, вы гарантированно получите совпадение. Каждый существующий узел содержит `id="X:Y"` в качестве первого атрибута, чтобы edit_jsx мог обновить его на месте. Значения по умолчанию опускаются, словарь использует короткие DSL-имена (w/h/p/gap/bg/rounded/layout/justify/items/content). Когда использовать: - Перед `edit_jsx`: сначала прочитайте поддерево, чтобы получить точный текст для замены. - Чтобы просмотреть поддерево как код, а не как JSON (inspect facets). - Чтобы подготовить подстроку для поиска через `search_jsx`. Пропустите, когда: - Вам нужно только одно значение свойства — используйте inspect с facets. - Нужны привязки переменных или ссылки на стили — используйте facet variables/styles у inspect. Пример: read_jsx({ node: "1:1" }) → 0001 <frame id="1:1" name="Login" w={320} h={480} layout="column" gap={12} p={24} bg="#fff"> 0002 <text id="1:2" size={24} weight="Bold">Welcome back</text> 0003 <frame id="1:3" w="fill" h={44} rounded={8} layout="row" justify="center" items="center" bg="#000"> 0004 <text id="1:4" size={14} fill="#fff">Sign In</text> 0005 </frame> 0006 </frame> Вывод обёрнут в {data:{jsx:"..."}} — передайте jsx (с номерами строк или без) в edit_jsx.

Параметры

  • nodestringобязательный

    Node ID (e.g. "1:2") or "/" for current page root

  • depthinteger

    Max recursion depth (default 5, capped at 12)

  • offsetinteger

    Line offset to start reading from (default 0)

  • limitinteger

    Max number of lines to return (default 1500)

reconcile_apply

Применяет декларативное изменение к существующему поддереву, СОХРАНЯЯ идентификатор каждого узла, который остаётся (так что привязки переменных, переопределения экземпляров и связи прототипов сохраняются) — альтернатива delete+rebuild с сохранением id. Рабочий процесс: read_jsx({node}) → редактирование этого JSX (на сохраняемых узлах оставляйте id=, на новых удаляйте id=, свободно меняйте вложенность) → reconcile_apply({scope: same id, markup: edited JSX}). Сопоставление выполняется только по явному id: узел с id= обновляется или перемещается на месте (смена родителя = перемещение, id сохраняется); узел без id создаётся. Свойства — это PATCH: записываются только свойства, указанные в разметке; отсутствующие свойства остаются без изменений (никогда не очищаются). Существующие узлы, отсутствующие в разметке, СОХРАНЯЮТСЯ, если только allowDelete: true. Сначала выполните просмотр через reconcile_preview, чтобы увидеть план.

Применяет декларативное изменение к существующему поддереву, СОХРАНЯЯ идентификатор каждого узла, который остаётся (так что привязки переменных, переопределения экземпляров и связи прототипов сохраняются) — альтернатива delete+rebuild с сохранением id. Рабочий процесс: read_jsx({node}) → редактирование этого JSX (на сохраняемых узлах оставляйте id=, на новых удаляйте id=, свободно меняйте вложенность) → reconcile_apply({scope: same id, markup: edited JSX}). Сопоставление выполняется только по явному id: узел с id= обновляется или перемещается на месте (смена родителя = перемещение, id сохраняется); узел без id создаётся. Свойства — это PATCH: записываются только свойства, указанные в разметке; отсутствующие свойства остаются без изменений (никогда не очищаются). Существующие узлы, отсутствующие в разметке, СОХРАНЯЮТСЯ, если только allowDelete: true. Сначала выполните просмотр через reconcile_preview, чтобы увидеть план.

Параметры

  • scopestringобязательный

    Node id of the existing subtree to reconcile (maps to the markup root)

  • markupstringобязательный

    Target JSX for the desired subtree — same dialect as read_jsx output; keep id= on every node you want to KEEP

  • allowDeleteboolean

    When true, remove existing nodes absent from the markup. Default false — unmatched nodes are kept (safe patch).

reconcile_preview

Пробный прогон согласования ТОЛЬКО ДЛЯ ЧТЕНИЯ. На основе существующего поддерева (scope) и целевого JSX (markup) вычисляет минимальный план create/update/delete/move, который превратит живое поддерево в целевое, сохраняя id каждого сопоставленного узла, и ПЕЧАТАЕТ его, не затрагивая холст. Используйте его для предварительного просмотра того, как будет выполнено согласование декларативного изменения. Рабочий процесс: read_jsx({node}) для получения текущего поддерева → отредактируйте этот JSX → reconcile_preview({scope: тот же id, markup: ваш отредактированный JSX}). Ничего не применяется.

Пробный прогон согласования ТОЛЬКО ДЛЯ ЧТЕНИЯ. На основе существующего поддерева (scope) и целевого JSX (markup) вычисляет минимальный план create/update/delete/move, который превратит живое поддерево в целевое, сохраняя id каждого сопоставленного узла, и ПЕЧАТАЕТ его, не затрагивая холст. Используйте его для предварительного просмотра того, как будет выполнено согласование декларативного изменения. Рабочий процесс: read_jsx({node}) для получения текущего поддерева → отредактируйте этот JSX → reconcile_preview({scope: тот же id, markup: ваш отредактированный JSX}). Ничего не применяется.

Параметры

  • scopestringобязательный

    Node id of the existing subtree to reconcile (the "file")

  • markupstringобязательный

    Target JSX describing the desired subtree — same dialect as read_jsx output

replace_props

Массовая замена значений свойств в поддереве (целевой узел + все потомки). Разрушающая пакетная мутация — без предпросмотра, без отмены для многих узлов. Возвращает количество совпадений по каждому правилу. Используй, когда: - Темизация: заменить все заливки #FFF на #000 во всём экране. - Миграция токенов: поднять каждый fontSize с 14 на 16. - Нормализация значений, оставшихся несогласованными после предыдущих проходов. - Альтернатива — N точечных вызовов к одному узлу (set_text / set_fill / edit). Возвращает: { data: { replacements: [{ rule: 0, matched: 12 }, { rule: 1, matched: 0 }] } } Параметры вне схемы: - `node` — корень поддерева; поиск рекурсивно обходит всех потомков (в глубину). - Значение `from` каждого правила — строка ТОЧНОГО совпадения (не подстрока, не регулярка). Для типизированных свойств (fontSize, opacity) передавай значения как строки — исполнитель приводит тип. - Ноль совпадений НЕ вызывает ошибку — возвращается matched: 0. Проверь себя через discover_props, если не уверен, что значения существуют. Пропусти, когда: - Обновляешь один известный узел — используй set_text / set_fill / set_stroke / set_layout для осмысленных типизированных правок одной цели, или edit для общих. - Значения привязаны к переменным (токенам) — replace_props обходит привязки; используй bind_variable для замены токена. - Нужно частичное / нечёткое совпадение — replace_props работает только по точному совпадению; понадобится find_nodes + цикл. Примеры: // одно правило, белый -> чёрный replace_props({node: "1:2", rules: [{prop: "fillColor", from: "#FFF", to: "#000"}]}) // пакетное обновление темы — оба правила применяются за один проход replace_props({node: "1:2", rules: [ {prop: "fillColor", from: "#FFF", to: "#000"}, {prop: "fontSize", from: "14", to: "16"} ]})

Массовая замена значений свойств в поддереве (целевой узел + все потомки). Разрушающая пакетная мутация — без предпросмотра, без отмены для многих узлов. Возвращает количество совпадений по каждому правилу. Используй, когда: - Темизация: заменить все заливки #FFF на #000 во всём экране. - Миграция токенов: поднять каждый fontSize с 14 на 16. - Нормализация значений, оставшихся несогласованными после предыдущих проходов. - Альтернатива — N точечных вызовов к одному узлу (set_text / set_fill / edit). Возвращает: { data: { replacements: [{ rule: 0, matched: 12 }, { rule: 1, matched: 0 }] } } Параметры вне схемы: - `node` — корень поддерева; поиск рекурсивно обходит всех потомков (в глубину). - Значение `from` каждого правила — строка ТОЧНОГО совпадения (не подстрока, не регулярка). Для типизированных свойств (fontSize, opacity) передавай значения как строки — исполнитель приводит тип. - Ноль совпадений НЕ вызывает ошибку — возвращается matched: 0. Проверь себя через discover_props, если не уверен, что значения существуют. Пропусти, когда: - Обновляешь один известный узел — используй set_text / set_fill / set_stroke / set_layout для осмысленных типизированных правок одной цели, или edit для общих. - Значения привязаны к переменным (токенам) — replace_props обходит привязки; используй bind_variable для замены токена. - Нужно частичное / нечёткое совпадение — replace_props работает только по точному совпадению; понадобится find_nodes + цикл. Примеры: // одно правило, белый -> чёрный replace_props({node: "1:2", rules: [{prop: "fillColor", from: "#FFF", to: "#000"}]}) // пакетное обновление темы — оба правила применяются за один проход replace_props({node: "1:2", rules: [ {prop: "fillColor", from: "#FFF", to: "#000"}, {prop: "fontSize", from: "14", to: "16"} ]})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • rulesobject[]обязательный

    Replacement rules

set_fill

Задает цвет заливки или фона на узле. `fill` — цвет текста или заливка фигуры. `bg` — фон фрейма. Для цвета обводки используйте `set_stroke`. Каждый вызов (отдельный элемент или элемент пакета) требует `node` и хотя бы один из параметров `fill`/`bg`. Пакетная отправка: `nodes: [{node, fill?, bg?}, ...]`. Допустимые форматы цвета (для fill или bg): hex "#FFF", "#F5F5F5" gradient string упрощённый CSS-подобный синтаксис (не полный CSS): "linear-gradient(<угол>deg, <#hex> <позиция>%, ...)" "linear-gradient(to <направление>, ...)" направления: top/right/bottom/left + углы "radial-gradient(<стопы>)" по центру, без модификаторов позиции/формы "radial-gradient(circle, <стопы>)" только круг "conic-gradient(from <угол>deg, ...)" ОТВЕРГАЮТСЯ: "circle at X% Y%", "ellipse at ...", именованные цвета, hsl(). variable token простое имя с квалификатором "$Surface/Card" transparent "transparent" (только для bg)

Задает цвет заливки или фона на узле. `fill` — цвет текста или заливка фигуры. `bg` — фон фрейма. Для цвета обводки используйте `set_stroke`. Каждый вызов (отдельный элемент или элемент пакета) требует `node` и хотя бы один из параметров `fill`/`bg`. Пакетная отправка: `nodes: [{node, fill?, bg?}, ...]`. Допустимые форматы цвета (для fill или bg): hex "#FFF", "#F5F5F5" gradient string упрощённый CSS-подобный синтаксис (не полный CSS): "linear-gradient(<угол>deg, <#hex> <позиция>%, ...)" "linear-gradient(to <направление>, ...)" направления: top/right/bottom/left + углы "radial-gradient(<стопы>)" по центру, без модификаторов позиции/формы "radial-gradient(circle, <стопы>)" только круг "conic-gradient(from <угол>deg, ...)" ОТВЕРГАЮТСЯ: "circle at X% Y%", "ellipse at ...", именованные цвета, hsl(). variable token простое имя с квалификатором "$Surface/Card" transparent "transparent" (только для bg)

Параметры

  • nodestring

    Node ID like "1:2"

  • fillstring

    Text color or shape fill — hex, gradient string, or qualified bare-name token

  • bgstring

    Background — hex, gradient string, "transparent", or qualified bare-name token

  • nodesobject[]

    Batch: [{node, fill?, bg?}]

set_layout

Устанавливает авто-раскладку (flex или grid) на контейнере. Управляет направлением, отступами, внутренним отступом и выравниванием дочерних элементов контейнера. Режимы: row / column — flex-раскладка; используйте justify / align для выравнивания по оси. grid — сеточная раскладка; cols/rows + gap (или rowGap/colGap). Размеры треков: colSizes/rowSizes ("240px 1fr 1fr" — Npx = фиксированный, Nfr = гибкая доля, hug = fit-content; выводит cols/rows). autoFlow=true упаковывает дочерние элементы по строкам; autoRows=true автоматически управляет количеством строк. Размещение дочерних элементов (colSpan/rowSpan/alignX/alignY/rowStart/colStart) задаётся через edit(), а не здесь. Используйте, когда: - Настраиваете авто-раскладку на существующем фрейме (gap, padding, direction, alignment) - Переключаете контейнер между row/column/grid - Массово настраиваете раскладку на нескольких контейнерах за один вызов Возвращает: { data: { id, name, type, applied?, noop?, rejected? } } (Пакет: { data: { count, results, errors?, partial? } }). `applied`/`noop` перечисляют ключи свойств; `rejected: [{key, reason}]` — КРИТИЧЕСКАЯ ошибка (свойство недопустимо для этого типа узла / только для чтения) — не повторяйте попытку. Если единственное запрошенное свойство отвергнуто, возвращает `{ error }`. Пропустите, когда: - Контейнер не является FRAME или COMPONENT — только фреймоподобные контейнеры поддерживают авто-раскладку - Нужно изменить размер только ОДНОГО дочернего элемента — используйте edit({node, props: {w, h, ...}}) - Вы создаёте контейнер с нуля — передавайте атрибуты раскладки прямо в jsx() вместо последующего вызова Примеры: set_layout({node: "1:2", gap: 16, p: 24}) set_layout({node: "1:2", layout: "row", justify: "space-between"}) set_layout({node: "1:2", layout: "column", gap: 8, p: "16 24", align: "center"}) set_layout({node: "1:2", layout: "grid", cols: 3, rows: 2, gap: 16}) set_layout({node: "1:2", layout: "grid", colSizes: "240px 1fr", gap: 24}) // фиксированная боковая панель + гибкое содержимое set_layout({node: "1:2", layout: "grid", cols: 4, autoFlow: true, gap: 12}) // автоматическая галерея set_layout({nodes: [{node: "1:2", gap: 16, p: 24},…

Устанавливает авто-раскладку (flex или grid) на контейнере. Управляет направлением, отступами, внутренним отступом и выравниванием дочерних элементов контейнера. Режимы: row / column — flex-раскладка; используйте justify / align для выравнивания по оси. grid — сеточная раскладка; cols/rows + gap (или rowGap/colGap). Размеры треков: colSizes/rowSizes ("240px 1fr 1fr" — Npx = фиксированный, Nfr = гибкая доля, hug = fit-content; выводит cols/rows). autoFlow=true упаковывает дочерние элементы по строкам; autoRows=true автоматически управляет количеством строк. Размещение дочерних элементов (colSpan/rowSpan/alignX/alignY/rowStart/colStart) задаётся через edit(), а не здесь. Используйте, когда: - Настраиваете авто-раскладку на существующем фрейме (gap, padding, direction, alignment) - Переключаете контейнер между row/column/grid - Массово настраиваете раскладку на нескольких контейнерах за один вызов Возвращает: { data: { id, name, type, applied?, noop?, rejected? } } (Пакет: { data: { count, results, errors?, partial? } }). `applied`/`noop` перечисляют ключи свойств; `rejected: [{key, reason}]` — КРИТИЧЕСКАЯ ошибка (свойство недопустимо для этого типа узла / только для чтения) — не повторяйте попытку. Если единственное запрошенное свойство отвергнуто, возвращает `{ error }`. Пропустите, когда: - Контейнер не является FRAME или COMPONENT — только фреймоподобные контейнеры поддерживают авто-раскладку - Нужно изменить размер только ОДНОГО дочернего элемента — используйте edit({node, props: {w, h, ...}}) - Вы создаёте контейнер с нуля — передавайте атрибуты раскладки прямо в jsx() вместо последующего вызова Примеры: set_layout({node: "1:2", gap: 16, p: 24}) set_layout({node: "1:2", layout: "row", justify: "space-between"}) set_layout({node: "1:2", layout: "column", gap: 8, p: "16 24", align: "center"}) set_layout({node: "1:2", layout: "grid", cols: 3, rows: 2, gap: 16}) set_layout({node: "1:2", layout: "grid", colSizes: "240px 1fr", gap: 24}) // фиксированная боковая панель + гибкое содержимое set_layout({node: "1:2", layout: "grid", cols: 4, autoFlow: true, gap: 12}) // автоматическая галерея set_layout({nodes: [{node: "1:2", gap: 16, p: 24},…

Параметры

  • nodestring

    Node ID like "1:2"

  • layoutenum

    Auto-layout mode

    rowcolumngrid
  • gapnumber

    Spacing between children (px). On grid sets both row+column gap.

  • rowGapnumber

    Grid row gap (px, grid only)

  • colGapnumber

    Grid column gap (px, grid only)

  • colsnumber

    Grid column count (required when layout="grid")

  • rowsnumber

    Grid row count; omit for auto-rows that grow to fit children

  • colSizesany

    Per-track sizes, e.g. "240px 1fr 1fr" or [240,"1fr","1fr"]. Tokens: Npx/N=FIXED, Nfr/flex=FLEX, hug/auto=fit-content.

  • rowSizesany

    Per-track sizes, e.g. "240px 1fr 1fr" or [240,"1fr","1fr"]. Tokens: Npx/N=FIXED, Nfr/flex=FLEX, hug/auto=fit-content.

  • autoFlowboolean

    Grid only: children auto-flow row-major into the next free cell (CSS grid-auto-flow:row)

  • autoRowsboolean

    Grid only: row count grows/shrinks automatically to fit children (omit explicit rows)

  • pany

    Padding: number (all sides), "v h" (vertical horizontal), or "t r b l"

  • justifyenum

    Main axis alignment (flex only)

    centerspace-betweenstartend
  • alignenum

    Cross axis alignment (flex only)

    centerstartendbaseline
  • wrapenum

    Wrap behaviour (flex only)

    wrapnowrap
  • nodesobject[]

    Batch: [{node, layout?, gap?, p?, ...}]

set_stroke

Устанавливает обводку (границу) на узле. set_stroke({node: "1:2", stroke: "1 #E0E0E0"}) set_stroke({node: "1:2", stroke: "2 #333 inside"}) set_stroke({node: "1:2", color: "#E0E0E0", weight: 1, align: "inside"}) set_stroke({node: "1:2", color: "linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)", weight: 1.5, align: "inside"}) // Пакетное обновление — массовое изменение обводки за один вызов: set_stroke({nodes: [{node: "1:2", color: "#E0E0E0", weight: 1}, {node: "1:3", color: "#333", weight: 2}]}) Сокращённая запись: "weight color align" (например, "1 #E0E0E0 inside"). В сокращённой записи поддерживаются только hex-цвета. Допустимые форматы цвета (для явного поля `color`, не для сокращённой записи): hex "#E0E0E0" gradient string CSS-подобное подмножество (полную грамматику см. в описании set_fill — те же правила). Часто: "linear-gradient(<angle>deg, <#hex> <pos>%, ...)", "radial-gradient(<stops>)". Не поддерживается: "circle at X% Y%", именованные цвета, hsl(). variable token полное имя переменной "$Border/Default" Чтобы привязать переменную к цвету обводки, используйте явное поле `color` — парсер сокращённой записи молча отбрасывает одиночные токены-имена.

Устанавливает обводку (границу) на узле. set_stroke({node: "1:2", stroke: "1 #E0E0E0"}) set_stroke({node: "1:2", stroke: "2 #333 inside"}) set_stroke({node: "1:2", color: "#E0E0E0", weight: 1, align: "inside"}) set_stroke({node: "1:2", color: "linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)", weight: 1.5, align: "inside"}) // Пакетное обновление — массовое изменение обводки за один вызов: set_stroke({nodes: [{node: "1:2", color: "#E0E0E0", weight: 1}, {node: "1:3", color: "#333", weight: 2}]}) Сокращённая запись: "weight color align" (например, "1 #E0E0E0 inside"). В сокращённой записи поддерживаются только hex-цвета. Допустимые форматы цвета (для явного поля `color`, не для сокращённой записи): hex "#E0E0E0" gradient string CSS-подобное подмножество (полную грамматику см. в описании set_fill — те же правила). Часто: "linear-gradient(<angle>deg, <#hex> <pos>%, ...)", "radial-gradient(<stops>)". Не поддерживается: "circle at X% Y%", именованные цвета, hsl(). variable token полное имя переменной "$Border/Default" Чтобы привязать переменную к цвету обводки, используйте явное поле `color` — парсер сокращённой записи молча отбрасывает одиночные токены-имена.

Параметры

  • nodestring

    Node ID like "1:2"

  • strokestring

    Shorthand "weight color align" — hex only.

  • colorstring

    Stroke color — hex, gradient string, or qualified bare-name token

  • weightnumber

    Stroke weight in px

  • alignenum

    Stroke alignment relative to the frame edge

    insideoutsidecenter
  • nodesobject[]

    Batch: [{node, color?, weight?, align?, stroke?}]

set_text

Устанавливает текстовое содержимое на одном или нескольких узлах TEXT. Для стилизации текста (шрифт, размер, насыщенность, цвет) используйте edit. Используйте, когда: - Нужно изменить то, что написано в узле TEXT — подписи, заголовки, текст кнопок, основной текст - Массово обновить несколько текстовых узлов за один вызов Возвращает: { data: { id, name, type, applied?, noop?, rejected? } } (Batch: { data: { count, results, errors?, partial? } }). `applied`/`noop` перечисляют ключи свойств; `rejected: [{key, reason}]` является КОНЕЧНЫМ (свойство недопустимо для данного типа узла или только для чтения) — не повторяйте его. Если единственное запрошенное свойство было отклонено, возвращает `{ error }`. `partial: true` означает, что часть записей выполнена успешно, а часть нет — проверьте `errors[]`, чтобы узнать, какие записи повторить. Пропустите, когда: - Нужно изменить шрифт/размер/насыщенность — используйте edit({node, props: {fontFamily, fontSize, ...}}) - Нужно привязать текст к переменной типа STRING — используйте bind_variable Примеры: set_text({node: "1:2", text: "Sign in"}) set_text({nodes: [{node: "1:2", text: "A"}, {node: "1:3", text: "B"}]})

Устанавливает текстовое содержимое на одном или нескольких узлах TEXT. Для стилизации текста (шрифт, размер, насыщенность, цвет) используйте edit. Используйте, когда: - Нужно изменить то, что написано в узле TEXT — подписи, заголовки, текст кнопок, основной текст - Массово обновить несколько текстовых узлов за один вызов Возвращает: { data: { id, name, type, applied?, noop?, rejected? } } (Batch: { data: { count, results, errors?, partial? } }). `applied`/`noop` перечисляют ключи свойств; `rejected: [{key, reason}]` является КОНЕЧНЫМ (свойство недопустимо для данного типа узла или только для чтения) — не повторяйте его. Если единственное запрошенное свойство было отклонено, возвращает `{ error }`. `partial: true` означает, что часть записей выполнена успешно, а часть нет — проверьте `errors[]`, чтобы узнать, какие записи повторить. Пропустите, когда: - Нужно изменить шрифт/размер/насыщенность — используйте edit({node, props: {fontFamily, fontSize, ...}}) - Нужно привязать текст к переменной типа STRING — используйте bind_variable Примеры: set_text({node: "1:2", text: "Sign in"}) set_text({nodes: [{node: "1:2", text: "A"}, {node: "1:3", text: "B"}]})

Параметры

  • nodestring

    Node ID like "1:2"

  • textstring

    New text content

  • nodesobject[]

    Batch: [{node, text}]

set_variable_mode

Задаёт узлу, какой режим коллекции переменных использовать. Это управляет тем, какие значения переменных отображает узел. Например, укажите фрейму использовать режим "Dark" из коллекции "Theme", чтобы все связанные переменные показывали тёмные значения. Примеры: set_variable_mode({node: "1:2", collection: "VariableCollectionId:1:2", mode: "1:1"}) set_variable_mode({node: "1:5", collection: "VariableCollectionId:1:3", mode: "1:2"})

Задаёт узлу, какой режим коллекции переменных использовать. Это управляет тем, какие значения переменных отображает узел. Например, укажите фрейму использовать режим "Dark" из коллекции "Theme", чтобы все связанные переменные показывали тёмные значения. Примеры: set_variable_mode({node: "1:2", collection: "VariableCollectionId:1:2", mode: "1:1"}) set_variable_mode({node: "1:5", collection: "VariableCollectionId:1:3", mode: "1:2"})

Параметры

  • nodestringобязательный

    Node ID like "1:2"

  • collectionstringобязательный

    VariableCollectionId like "VariableCollectionId:1:2"

  • modestringобязательный

    Mode id from a VariableCollection, e.g. "1:0"

set_variable_value

Устанавливает значение переменной для конкретного режима. Тонкая обёртка над Figma's variable.setValueForMode(modeId, value) — вызывайте один раз для каждого режима. Используйте, когда: - Заполнение значений режимов после create_variable - Обновление одного значения в одном режиме без изменения остальных - Установка псевдонима с одной переменной на другую Возвращает: { data: { ok: true } } Принимаемые формы значений: COLOR — шестнадцатеричная строка "#RRGGBB" ИЛИ {r, g, b, a?} в диапазоне 0-1 FLOAT — число (числовая строка также принимается) STRING — строка BOOLEAN — true / false alias — {type: "VARIABLE_ALIAS", id: "VariableID:x:y"} (работает для любого типа, ссылается на другую переменную) Пропускайте, когда: - Создаёте переменную со значениями для всех режимов с нуля — используйте create_variable с values_by_mode (один вызов вместо N) - Вы знаете только ИМЯ режима, а не modeId — list_variables / create_collection возвращают modeIds; либо используйте create_variable, который принимает имена режимов - Одинаковое значение для всех режимов — всё равно вызывайте один раз для каждого режима; этот инструмент не распространяет значение на все режимы Примеры: set_variable_value({variable: "VariableID:1:5", mode: "1:0", value: "#FFFFFF"}) // COLOR (шестнадцатеричный) set_variable_value({variable: "VariableID:1:5", mode: "1:1", value: {r: 0.1, g: 0.1, b: 0.1, a: 1}}) // COLOR (объект) set_variable_value({variable: "VariableID:1:6", mode: "1:0", value: 16}) // FLOAT set_variable_value({variable: "VariableID:1:7", mode: "1:0", value: {type: "VARIABLE_ALIAS", id: "VariableID:1:9"}}) // alias

Устанавливает значение переменной для конкретного режима. Тонкая обёртка над Figma's variable.setValueForMode(modeId, value) — вызывайте один раз для каждого режима. Используйте, когда: - Заполнение значений режимов после create_variable - Обновление одного значения в одном режиме без изменения остальных - Установка псевдонима с одной переменной на другую Возвращает: { data: { ok: true } } Принимаемые формы значений: COLOR — шестнадцатеричная строка "#RRGGBB" ИЛИ {r, g, b, a?} в диапазоне 0-1 FLOAT — число (числовая строка также принимается) STRING — строка BOOLEAN — true / false alias — {type: "VARIABLE_ALIAS", id: "VariableID:x:y"} (работает для любого типа, ссылается на другую переменную) Пропускайте, когда: - Создаёте переменную со значениями для всех режимов с нуля — используйте create_variable с values_by_mode (один вызов вместо N) - Вы знаете только ИМЯ режима, а не modeId — list_variables / create_collection возвращают modeIds; либо используйте create_variable, который принимает имена режимов - Одинаковое значение для всех режимов — всё равно вызывайте один раз для каждого режима; этот инструмент не распространяет значение на все режимы Примеры: set_variable_value({variable: "VariableID:1:5", mode: "1:0", value: "#FFFFFF"}) // COLOR (шестнадцатеричный) set_variable_value({variable: "VariableID:1:5", mode: "1:1", value: {r: 0.1, g: 0.1, b: 0.1, a: 1}}) // COLOR (объект) set_variable_value({variable: "VariableID:1:6", mode: "1:0", value: 16}) // FLOAT set_variable_value({variable: "VariableID:1:7", mode: "1:0", value: {type: "VARIABLE_ALIAS", id: "VariableID:1:9"}}) // alias

Параметры

  • variablestringобязательный

    VariableID like "VariableID:1:5"

  • modestringобязательный

    Mode id from a VariableCollection, e.g. "1:0"

  • valueanyобязательный

    Raw value (number for FLOAT, string for STRING/hex-COLOR, boolean for BOOLEAN, {r,g,b,a} for COLOR object form, {type:"VARIABLE_ALIAS",id} for alias)

switch_page

Перемещается между страницами в файле Figma. Управляется по ID — имена неадресуемы (могут конфликтовать и меняться). Два режима: - switch_page({}) → возвращает только список страниц, без переключения (используйте для получения ID при первом вызове) - switch_page({pageId: "1:23"}) → переключает и возвращает обновлённое состояние + список Страницы — это контейнеры верхнего уровня в корне файла. Большинство операций чтения/записи по умолчанию работают с figma.currentPage. Вызывайте эту функцию, когда нужно работать с узлами на другой странице, отличной от текущей. Возвращает: - currentPageId, currentPageName — текущая страница (всегда присутствует) - pages — полный список [{id, name}] всех страниц в файле (всегда присутствует) - previousPageId, previousPageName — страница, с которой произошло переключение (только если переключение состоялось) - unchanged — true, если целевая страница уже была текущей Типичный сценарий: 1. switch_page({}) // получить ID 2. switch_page({pageId: "<выбранный id>"}) // переключиться Когда вызывать: - Пользователь упоминает контент на странице, отличной от текущей - Предыдущий инструмент сообщил, что ID узла находится на не текущей странице - Нужно просмотреть или изменить узлы за пределами активной страницы Не вызывать: - Для узлов, которые уже находятся на текущей странице — figma.currentPage и так является областью по умолчанию, это будет лишней тратой итерации - Многократно для «исследования» — каждый вызов возвращает полный список страниц, закешируйте его

Перемещается между страницами в файле Figma. Управляется по ID — имена неадресуемы (могут конфликтовать и меняться). Два режима: - switch_page({}) → возвращает только список страниц, без переключения (используйте для получения ID при первом вызове) - switch_page({pageId: "1:23"}) → переключает и возвращает обновлённое состояние + список Страницы — это контейнеры верхнего уровня в корне файла. Большинство операций чтения/записи по умолчанию работают с figma.currentPage. Вызывайте эту функцию, когда нужно работать с узлами на другой странице, отличной от текущей. Возвращает: - currentPageId, currentPageName — текущая страница (всегда присутствует) - pages — полный список [{id, name}] всех страниц в файле (всегда присутствует) - previousPageId, previousPageName — страница, с которой произошло переключение (только если переключение состоялось) - unchanged — true, если целевая страница уже была текущей Типичный сценарий: 1. switch_page({}) // получить ID 2. switch_page({pageId: "<выбранный id>"}) // переключиться Когда вызывать: - Пользователь упоминает контент на странице, отличной от текущей - Предыдущий инструмент сообщил, что ID узла находится на не текущей странице - Нужно просмотреть или изменить узлы за пределами активной страницы Не вызывать: - Для узлов, которые уже находятся на текущей странице — figma.currentPage и так является областью по умолчанию, это будет лишней тратой итерации - Многократно для «исследования» — каждый вызов возвращает полный список страниц, закешируйте его

Параметры

  • pageIdstring

    Target page ID. Omit to just fetch the roster.

Другие проверенные MCP-сервера

QGIS MCP

QGIS MCP

QGISMCP - MCP-сервер, соединяющий QGIS с Claude AI. Позволяет AI-ассистенту управлять проектами, слоями, выполнять алгоритмы обработки и произвольный PyQGIS-код. Идеально для автоматизации ГИС без ...

Python1029
TencentEdgeOne/edgeone-pages-mcp

TencentEdgeOne/edgeone-pages-mcp

официальный

MCP сервер для деплоя full-stack проектов на EdgeOne Makers и получения публичных URL. Полезен разработчикам, которым нужно быстро опубликовать приложение или одиночную HTML страницу для предпросмотра. Поддерживает Node.js 18+.

TypeScript427
higress-group/higress-ops-mcp-server

higress-group/higress-ops-mcp-server

официальный

Higress OPS MCP сервер управляет конфигурацией и мониторингом API-шлюза Higress через агентный поток на LangGraph. Помогает DevOps-инженерам автоматизировать работу с Higress Console API.

Python23
Google MCP

Google MCP

официальный

Сборник MCP серверов от Google для интеграции сервисов Google Cloud (BigQuery, Cloud SQL и др.) с AI-агентами. Включает удаленные и open-source серверы для развертывания. Полезен разработчикам агентных систем.

4407
21st-dev/Magic-MCP

21st-dev/Magic-MCP

MCP сервер 21st.dev Magic AI Agent помогает разработчикам создавать UI-компоненты через описание на естественном языке. Интегрируется с Cursor, Windsurf и VS Code, генерируя готовые компоненты.

TypeScript5468
makenotion/notion-mcp-server

makenotion/notion-mcp-server

официальный

Notion MCP сервер даёт AI-агентам прямой доступ к Notion через API: читайте и редактируйте страницы в Markdown, делайте запросы к данным. Разработчики используют этот MCP инструмент для интеграции помощников с заметками и проектами, экономя токены.

TypeScript4540
© Каталог MCP, 2026. Все права защищены.
Проект не аффилирован с Anthropic и любыми упомянутыми продуктами.
Все названия и торговые марки принадлежат их владельцам.
Контакты для связи: hi@mcp-katalog.ru

Лука Никитин