musepy/genable

musepy/genable

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

Genable

Use your model. Keep the design.

Turn a detailed brief into native, editable Figma structure you can inspect and refine.

Install on Figma Website npm: genable-mcp Sponsor

Use your model. Keep the design.

A design agent with a canvas to act on

Genable runs an agent loop against Figma's scene graph through typed design operations. It can plan a composition, build native structure, inspect the result, and continue refining it in context.

  • Plan the direction — Make audience, content, hierarchy, brand, mood, typography, density, and rhythm part of the brief.
  • Build native structure — Create and edit frames, Auto Layout, vectors, text, components, variables, and pages instead of returning one flat image.
  • Check the work — Inspect structure, read back writes, and use screenshots for visual verification when useful.
  • Keep refining — Continue the conversation with the current canvas in context; every generated layer remains available to edit in Figma.
Genable plans, builds, and checks

A visual direction, not a preset shell

Generic output often begins with a generic brief. Genable's design guidance pushes the model to treat composition, hierarchy, typography, density, rhythm, surfaces, and data presentation as connected decisions—not as a card grid with a new accent color.

Инструменты были проиндексированы:
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 (см. выше) - Вариация одноразовая — отредактируйте экземпляр напрямую, без шаблона Примеры: …

Параметры
  • bindstring

    Идентификатор текстового дочернего узла для привязки (если не указан, автоматически сопоставляется по имени).

  • defaultstring

    Текстовое значение по умолчанию.

  • descriptionstring

    Подсказка о том, какое содержимое должно находиться в этом слоте.

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

    Отображаемое имя свойства

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

    Node ID, например, «1:2»

  • preferredValuesobject[]

    Предлагаемые цели замены в виде {type, key} (ключи опубликованных компонентов)

  • typeenumобязательный
  • 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,…

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

    Node ID, например, «1:2»

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

    Плоское связываемое поле Figma (fontSize, paddingTop, ...)

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

    VariableID, например, "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"}}) - с переопределениями

Параметры
  • namestring

    Имя для клонированного узла

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

    Node ID, например, «1:2»

  • overridesobject

    Переопределения свойств, применяемые к клону, используют то же пространство ключей реестра, что и у edit.props (w/h/corner/opacity/rotate/blur/shadow/visible, любое свойство реестра или "Child.prop" для переопределения именованного потомка). Используйте name на верхнем уровне для переименования. Передавайте реальные ключи, а не {}.

  • parentstring

    Идентификатор целевого родительского узла или "/" для корня страницы.

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",…

Параметры
  • namestring

    Название набора компонентов

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

    Идентификаторы узлов компонентов для объединения (требуется ≥2)

  • variantsobject[]

    Назначение осей вариантов для каждого компонента. Обработчик переименовывает каждый перечисленный компонент в форму Figma "Axis=Value, ..." перед объединением, поэтому набор получает типизированные оси (Size, State, …). Все записи должны иметь одни и те же ключи осей. Опустите, чтобы оси определялись из существующих имён компонентов.

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"]})

Параметры
  • idempotency_keystring

    Необязательный ключ concurrency-safety: если он опущен, обработчик вычисляет канонически.

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

    Названия режимов (первый становится режимом по умолчанию)

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

    Название коллекции

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"})

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

    Node ID, например, «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:…

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

    Node ID, например, «1:2»

  • parentstring

    Идентификатор родительского узла для размещения.

  • propsobject

    Переопределение свойств компонента по отображаемому имени, например {"Label":"Submit","Show Icon":"false"}. Применяется через setProperties; BOOLEAN принимает "true"/"false".

  • variantobject

    Для COMPONENT_SET: выбирает вариант по значениям осей, например {"Size":"Large","State":"Hover"}. По умолчанию выбирает стандартный вариант набора.

create_page

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

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

    Имя страницы

  • switchToboolean

    Сделать новую страницу текущей после создания

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: …

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

    VariableCollectionId, подобный "VariableCollectionId:1:2"

  • fallback_reasonstring

    ТРЕБУЕТСЯ тогда и только тогда, когда mode_coverage_required="opt-in-fallback". Должен содержать "fallback to <mode_name>".

  • idempotency_keystring

    Необязательный ключ concurrency-safety: если он опущен, обработчик вычисляет канонически.

  • mode_coverage_requiredenum

    Политика покрытия режимов: "all" (по умолчанию) или "opt-in-fallback".

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

    Имя переменной (слэши обозначают иерархию)

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

    Тип переменной

  • values_by_modeobject

    Необязательная карта: имя режима ИЛИ modeId → значение (для COLOR допустим hex). Опустите, чтобы создать пустую переменную; укажите, чтобы заполнить все режимы идемпотентно одним вызовом.

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

Параметры
  • datastring

    Необработанная строка пути SVG.

  • fillstring

    Заливка: hex / градиент / переменная / "transparent"

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

    Высота границ вектора в px

  • namestring

    Имя узла.

  • parentstring

    Идентификатор родительского узла.

  • pointsnumber[][]

    Точки ломаной [[x,y], ...] - минимум 2 точки для создания пути.

  • strokestring

    Цвет обводки - hex / градиент / токен переменной

  • strokeAlignenum

    Выравнивание обводки относительно края рамки

  • strokeWeightnumber

    Толщина обводки в px

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

    Ширина границ вектора в пикселях

  • windingRuleenum
  • xnumber

    Позиция X относительно родителя.

  • ynumber

    Позиция Y относительно родительского элемента.

delete_collection

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

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

    VariableCollectionId, подобный "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"})

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

    Отображаемое имя свойства для удаления (без суффикса #)

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

    Node ID, например, «1:2»

delete_node

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

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

    Node ID, например, «1:2»

delete_page

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

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

    ID страницы для удаления

delete_variable

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

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

    VariableID, например, "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"]}) // вся страница

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

    Node ID, например, «1:2»

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

    Свойства для обнаружения (≥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",…}}

Параметры
  • contentstring

    Новый текстовый контент

  • nodestring

    Node ID, например, «1:2»

  • nodesobject[]

    Пакет: [{узел, свойства?, содержимое?}]

  • propsobject

    Свойства для обновления — передай хотя бы один РЕАЛЬНЫЙ ключ, никогда не передавай {}. Общие ключи показаны ниже; также принимаются любые другие свойства реестра или переопределения компонента экземпляра (по отображаемому имени, например, "Label"). Для текстового содержимого используй content; для fill/stroke/layout предпочтительнее специализированные сеттеры.

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"}]})

Параметры
  • defaultstring

    Новое значение по умолчанию. Только для BOOLEAN/TEXT/INSTANCE_SWAP, не для VARIANT/SLOT.

  • descriptionstring

    Новое описание (только SLOT)

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

    Текущее отображаемое имя свойства (из list_component_props, без суффикса #)

  • newNamestring

    Переименовывает свойство.

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

    Node ID, например, «1:2»

  • preferredValuesobject[]

    Новые предпочтительные значения (только для INSTANCE_SWAP/SLOT), опубликованные ключи {type, key}

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 Пример: …

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

    Заменяющий текст JSX — тот же диалект, что и вывод read_jsx.

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

    Текст JSX для замены - должен встречаться в выводе read_jsx области видимости.

  • replace_allboolean

    Замените каждое вхождение old. По умолчанию: false (требуется уникальность).

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

    ID узла, определяющий окно поиска/редактирования («файл»)

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"})

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

    Node ID, например, «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"}) // в поддереве

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

    Поисковый запрос: соответствует имени узла или типу.

  • scopestring

    Ограничивает поиск поддеревом. По умолчанию: вся страница.

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 (чётче)

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

    Node ID, например, «1:2»

  • paddingnumber

    Зарезервировано для будущего использования

  • scalenumber

    Масштаб экспорта: 0.5–2 (по умолчанию 1)

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` для…

Параметры
  • depthinteger

    Максимальная глубина (по умолчанию 5, максимум 10)

  • facetsenum[]

    Группы свойств для отображения

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

    «/» для корня страницы или идентификатор узла.

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} для фонового размытия матового стекла/стекломорфизма. Несколько эффектов объединяются автоматически. Оформление в…

Параметры
  • insertIndexinteger

    Позиция среди соседних элементов одного родителя (0 = первый)

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

    JSX-подобная строка вложенной разметки

  • parentstring

    Целевой идентификатор родительского узла.

  • replaceIdstring

    Заменяет этот существующий узел на месте.

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"})

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

    Node ID, например, «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"})

Параметры
  • collectionstring

    VariableCollectionId, подобный "VariableCollectionId:1:2"

  • cursorstring

    Непрозрачный курсор пагинации

  • filterstring

    Совпадение подстроки в имени переменной (без учета регистра).

  • limitnumber

    Максимум переменных на странице (по умолчанию 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}) — переупорядочение внутри текущего родителя

Параметры
  • indexinteger

    Переупорядочивает позицию среди соседних элементов. 0 = первый, -1 = последний.

  • namestring

    Новое имя (переименовать без изменения родителя)

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

    Node ID, например, «1:2»

  • parentstring

    Целевой идентификатор родительского узла.

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.

Параметры
  • depthinteger

    Максимальная глубина рекурсии (по умолчанию 5, не более 12)

  • limitinteger

    Максимальное количество возвращаемых строк (по уомолчанию 1500)

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

    Node ID (например, "1:2") или "/" для корня текущей страницы.

  • offsetinteger

    Смещение строки, с которого начинается чтение (по умолчанию 0).

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, чтобы увидеть план.

Параметры
  • allowDeleteboolean

    Когда true, удаляет существующие узлы, отсутствующие в разметке. По умолчанию false: несовпадающие узлы сохраняются (безопасное исправление).

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

    Нацельте JSX на нужное поддерево — в том же диалекте, что и вывод read_jsx; сохраняйте id= на каждом узле, который хотите ОСТАВИТЬ.

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

    Идентификатор узла существующего поддерева для согласования (соответствует корню разметки).

reconcile_preview

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

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

    Целевой JSX, описывающий желаемое поддерево — тот же диалект, что и вывод read_jsx

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

    ID узла существующего поддерева для согласования (файл)

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"} ]})

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

    Node ID, например, «1:2»

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

    Понял. Присылайте текст для перевода, и я переведу его по всем правилам.

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)

Параметры
  • bgstring

    Фон: hex, строка с градиентом, «transparent» или квалифицированный токен с простым именем.

  • fillstring

    Цвет текста или заливка фигуры: hex-код, строка градиента или токен полного либо простого имени.

  • nodestring

    Node ID, например, «1:2»

  • 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},…

Параметры
  • alignenum

    Выравнивание по поперечной оси (только для flex)

  • autoFlowboolean

    Только для Grid: дети автоматически размещаются построчно в следующую свободную ячейку (CSS grid-auto-flow:row)

  • autoRowsboolean

    Только для сетки: количество строк автоматически увеличивается/уменьшается под дочерние элементы (не указывайте явные строки).

  • colGapnumber

    Промежуток между колонками сетки (px, только для сетки)

  • colsnumber

    Количество столбцов сетки (обязательно при layout="grid")

  • colSizesstring | string | number[]

    Размеры треков, например "240px 1fr 1fr" или [240,"1fr","1fr"]. Токены: Npx/N=FIXED, Nfr/flex=FLEX, hug/auto=fit-content.

  • gapnumber

    Отступ между элементами (px). В grid задаёт одновременно и row, и column gap.

  • justifyenum

    Выравнивание по главной оси (только flex)

  • layoutenum

    Режим авто-раскладки

  • nodestring

    Node ID, например, «1:2»

  • nodesobject[]

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

  • pnumber | string

    Padding: number (все стороны), "v h" (вертикаль/горизонталь), или "t r b l"

  • rowGapnumber

    Отступ между рядами (px, только для грида)

  • rowsnumber

    Количество строк сетки; опустите для авто-строк, которые растут, чтобы вместить дочерние элементы

  • rowSizesstring | string | number[]

    Размеры треков, например "240px 1fr 1fr" или [240,"1fr","1fr"]. Токены: Npx/N=FIXED, Nfr/flex=FLEX, hug/auto=fit-content.

  • wrapenum

    Поведение wrap (только для flex)

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 — парсер сокращённой записи молча отбрасывает одиночные токены-имена.

Параметры
  • alignenum

    Выравнивание обводки относительно края рамки

  • colorstring

    Цвет обводки: hex, градиентная строка или квалифицированный токен с простым именем.

  • nodestring

    Node ID, например, «1:2»

  • nodesobject[]

    Пакет: [{node, color?, weight?, align?, stroke?}]

  • strokestring

    Сокращение «weight color align»: только hex.

  • weightnumber

    Толщина обводки в px

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"}]})

Параметры
  • nodestring

    Node ID, например, «1:2»

  • nodesobject[]

    Пакет: [{node, text}]

  • textstring

    Новый текстовый контент

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"})

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

    VariableCollectionId, подобный "VariableCollectionId:1:2"

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

    ID режима из VariableCollection, например "1:0"

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

    Node ID, например, «1:2»

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

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

    ID режима из VariableCollection, например "1:0"

  • valuenumber | string | boolean | objectобязательный

    Необработанное значение (число для FLOAT, строка для STRING/hex-COLOR, логическое значение для BOOLEAN, {r,g,b,a} для объектной формы COLOR, {type:"VARIABLE_ALIAS",id} для псевдонима)

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

    VariableID, например, "VariableID:1:5"

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 и так является областью по умолчанию, это будет лишней тратой итерации - Многократно для «исследования» — каждый вызов возвращает полный список страниц, закешируйте его

Параметры
  • pageIdstring

    Идентификатор целевой страницы. Если не указан, просто получает список.

0.2.1основная
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0

Выберите клиент, чтобы установить musepy/genable:

Любой клиент

Конфиг добавления MCP сервера стандартный, обычно он не меняется вообще, поэтому подходит практически к любому ИИ клиенту, поддерживающему MCP.

{
  "mcpServers": {
    "musepy-genable-d5xp3lkao8": {
      "command": "npx",
      "args": [
        "-y",
        "genable-mcp"
      ]
    }
  }
}
CursorCursor

Перейдите по ссылке и сервер автоматически будет добавлен в Cursor. Либо откройте/создайте файл ~/.cursor/mcp.json(%USERPROFILE%\.cursor\mcp.json на Windows) и добавьте конфиг сервера:

{
  "mcpServers": {
    "musepy-genable-d5xp3lkao8": {
      "command": "npx",
      "args": [
        "-y",
        "genable-mcp"
      ]
    }
  }
}
VS Code

Создайте .vscode/mcp.json в проекте (ключ верхнего уровня — servers):

{
  "servers": {
    "musepy-genable-d5xp3lkao8": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "genable-mcp"
      ]
    }
  }
}

Либо добавьте сервер через терминал:

code --add-mcp "{\"name\":\"musepy-genable-d5xp3lkao8\",\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"-y\",\"genable-mcp\"]}"
ClaudeClaude Desktop

Откройте Settings → Developer → Edit Config — это откроет файл claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Впишите сервер и полностью перезапустите Claude Desktop:

{
  "mcpServers": {
    "musepy-genable-d5xp3lkao8": {
      "command": "npx",
      "args": [
        "-y",
        "genable-mcp"
      ]
    }
  }
}
Claude CodeClaude Code

Добавьте сервер одной командой в терминале:

claude mcp add musepy-genable-d5xp3lkao8 -- npx -y genable-mcp

Либо через JSON-конфиг:

claude mcp add-json musepy-genable-d5xp3lkao8 "{\"command\":\"npx\",\"args\":[\"-y\",\"genable-mcp\"]}"
CodexCodex

Добавьте сервер командой в терминале:

codex mcp add musepy-genable-d5xp3lkao8 -- npx -y genable-mcp

Либо вручную в ~/.codex/config.toml(%USERPROFILE%\.codex\config.toml на Windows):

[mcp_servers.musepy-genable-d5xp3lkao8]
command = "npx"
args = ["-y", "genable-mcp"]
PerplexityPerplexity

MCP доступен подписчикам Perplexity Pro / Max / Enterprise. Локальные серверы — только в приложении для macOS.

  1. Откройте Настройки аккаунта → Connectors.
  2. Установите вспомогательное приложение PerplexityXPC (один раз).
  3. Нажмите Add Connector → вкладка Simple.
  4. В поле Server Name укажите musepy/genable, а в поле команды запуска — строку ниже:
npx -y genable-mcp

Нажмите Save и дождитесь статуса Running.

WindsurfWindsurf

Откройте Windsurf Settings → Cascade → MCP Servers или отредактируйте файл ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "musepy-genable-d5xp3lkao8": {
      "command": "npx",
      "args": [
        "-y",
        "genable-mcp"
      ]
    }
  }
}
ClineCline

В панели Cline нажмите иконку MCP Servers → Configure → Configure MCP Servers (или отредактируйте ~/.cline/mcp.json) и добавьте сервер:

{
  "mcpServers": {
    "musepy-genable-d5xp3lkao8": {
      "command": "npx",
      "args": [
        "-y",
        "genable-mcp"
      ],
      "disabled": false,
      "autoApprove": []
    }
  }
}
Continue

Создайте файл в .continue/mcpServers/ (например musepy-genable-d5xp3lkao8.yaml) или добавьте блок в config.yaml. MCP работает только в режиме agent:

mcpServers:
  - name: musepy-genable-d5xp3lkao8
    command: npx
    args:
      - "-y"
      - "genable-mcp"
Zed

Выполните agent: add context server или откройте настройки (zed: open settings file) и добавьте сервер в объект context_servers:

{
  "context_servers": {
    "musepy-genable-d5xp3lkao8": {
      "command": "npx",
      "args": [
        "-y",
        "genable-mcp"
      ]
    }
  }
}

Похожие MCP-сервера

GLips/Figma-Context-MCP

GLips/Figma-Context-MCP

от glips

Извлекает из макетов Figma стили, шрифты и отступы. Генерирует код под выбранный фреймворк для Cursor, VS Code и других редакторов.

TypeScript⭐ 16017
themesberg/flowbite-mcp

themesberg/flowbite-mcp

от themesberg

MCP сервер для работы с компонентами Flowbite на Tailwind CSS. Даёт доступ к 60+ UI-элементам, умеет генерировать тему по hex-цвету и превращать Figma-макет в код. Помогает разработчикам быстрее создавать интерфейсы.

JavaScript⭐ 42
kenneives/design-token-bridge-mcp

kenneives/design-token-bridge-mcp

от kenneives

MCP сервер для трансляции дизайн-токенов: извлекает из Tailwind, CSS, Figma или W3C DTCG и генерирует темы под Kotlin, SwiftUI, Tailwind и CSS-переменные. Полезен разработчикам и дизайнерам в пайплайне v0 → Figma → Claude Code.

TypeScript⭐ 5
vkhanhqui/figma-mcp-go

vkhanhqui/figma-mcp-go

от vkhanhqui

Открытый Figma MCP-сервер с полным доступом на чтение и запись через плагин. Не требует API и не имеет лимитов — подходит дизайнерам и разработчикам. Работает с AI-инструментами. Управляйте стилями...

Go⭐ 1178
ethbak/icon-composer-mcp

ethbak/icon-composer-mcp

от ethbak

MCP-сервер для быстрой генерации иконок, логотипов и изображений с эффектами Liquid Glass (iOS 26+). Управляет .icon-бандлами, задаёт стеклянные блики, тени, размытие и тёмную тему. Полезен дизайне...

TypeScript⭐ 61
albertnahas/icogenie-mcp

albertnahas/icogenie-mcp

от albertnahas

MCP сервер @icogenie/mcp дает AI-агентам генерировать SVG-иконки по тексту. Помогает разработчикам быстро создавать иконки для интерфейсов в Claude. Поддерживает пакетную работу, библиотеку и ежедневные кредиты.

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

Лука Никитин