feat(mcp): drawio стадия 3 — высокоуровневые инструменты: drawio_edit_cells, drawio_from_graph, drawio_from_mermaid #425
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ТЗ: семантические инструменты вместо сырого XML
Зависит от #423 (CRUD-конвейер) и #424 (shape-каталог, elkjs, quality-warnings).
Цель
Сырой XML остаётся escape-hatch, но для 90% случаев модель не должна видеть ни координат, ни style-строк — весь класс ошибок лейаута (налезания, edge сквозь фигуры, кривые интервалы) и иконок (пустые квадраты, перепутанные паттерны) исчезает by construction: эти решения принимает сервер, а не LLM.
Инструменты
1.
drawio_edit_cells(pageId, node, operations, baseHash)ID-based точечные правки вместо пересылки полного XML (референс next-ai-draw-io: они мигрировали на это с
{search, replace}— текст-матчинг ломался на порядке атрибутов):.drawio.svg→ перезаписать вложение (конвейер #423).deleteкаскадит на детей контейнера и на edge, у которых ячейка — source/target.baseHashобязателен (как вdrawio_update).2.
drawio_from_graph(pageId, where, graph, direction?, preset?, layout?)— главный инструментМодель описывает диаграмму семантически, без координат и style-строк:
Серверный конвейер:
icon→ точная style-строка через shape-index (#424), с автоматически правильным паттерном (AWS service/resource + категорийный fillColor, Azure image-style — таблицы в приложении #424); неизвестныйicon→ generic-фигура поkindс подписью (пустой квадрат запрещён);kindузла → слот палитры пресета,kindedge → стиль линии (таблицы ниже);Семантическая палитра узлов (базовая, слоты пресета; пары fill/stroke):
service#dae8fc/#6c8ebf(синий)db#d5e8d4/#82b366(зелёный)queue#fff2cc/#d6b656(жёлтый)gateway#ffe6cc/#d79b00(оранжевый)error#f8cecc/#b85450(красный)external#f5f5f5/#666666(серый)security#e1d5e7/#9673a6(фиолетовый)Стили edge по kind:
sync— сплошная;async—dashed=1;error—dashed=1;strokeColor=#DD344C. Группы всегдаfillColor=none;container=1;dropTarget=1.Пресеты:
default/dark/colorblind-safe(палитра Okabe-Ito). JSON-данныеkind → style, отдельно от кода.Контроль координат (когда нужен):
{"layer": 0},{"sameLayerAs": "db2"},{"pinned": {"x": 40, "y": 900}}— маппятся на ELK layer/position constraints и fixed-узлы;layout: "none" | "full" | "incremental"— incremental обязателен для правки существующих диаграмм: существующие координаты фиксируются (ELK interactive mode), размещаются только новые элементы — полный re-layout снёс бы ручную расстановку человека;drawio_edit_cellsс явнымmxGeometry;3.
drawio_from_mermaid(pageId, where, mermaid)— опционально, после from_graphМодель пишет Mermaid (LLM делают это очень надёжно) → сервер конвертит в редактируемый drawio. Ограничение: без Electron/draw.io-CLI, значит конвертация только парсером: mermaid-текст → graph-JSON → конвейер from_graph. Начать с
flowchart(покрывает большинство вики-случаев); sequence/class — по спросу.Если парсерный путь окажется дороже пользы — инструмент дропаем:
from_graphпокрывает те же сценарии, просто чуть многословнее для модели.Состав конвертера (что готовое, что своё)
libavoid-pass.js+ WASM из jgraph/drawio-mcp (mcp-tool-server/vendor/libavoid/)autolayout.pyиз Agents365-ai/drawio-skill (MIT),normalize-diagram-xml.js+shared/mxfile.xsdиз jgraph/drawio-mcpГотового npm «graph-JSON → drawio» не существует (проверено: единственное похожее —
mxgraphdata, мёртвый reader) — но своего кода здесь ~500–700 строк без браузерных/нативных зависимостей.Где в коде
packages/mcp/src/lib/drawio-graph.ts— graph-схема (zod), маппер в ELK, assembler;packages/mcp/src/lib/drawio-presets.ts+packages/mcp/data/drawio-presets.json— палитры;packages/mcp/src/lib/drawio-cell-ops.ts— операции edit_cells с каскадом;packages/mcp/src/tool-specs.ts— три инструмента + роутинг в descriptions:from_mermaid→ стандартные типы;from_graph→ архитектуры/облака/сети; сыройxml→ экзотика/wireframe.Критерии приёмки
drawio_from_graphна графе 15+ узлов с 2 вложенными группами и AWS-иконками выдаёт диаграмму: 0 lint-ошибок, 0 quality-warnings, все иконки резолвятся (нет пустых квадратов), группы прозрачные, направление соблюдено.pinned-узел остаётся на заданных координатах,sameLayerAs-пара — в одном слое.layout:"incremental"при добавлении узла в диаграмму с ручной расстановкой не меняет координаты существующих ячеек.drawio_edit_cells: update меняет одну ячейку не трогая остальные; delete контейнера убирает детей и связанные edge; устаревшийbaseHash→ конфликт.kindпресетов покрыт снапшот-тестом style-строки;colorblind-safeне содержит проблемных пар цветов.Внешние референсы
styles/schema.json): https://github.com/Agents365-ai/drawio-skill (MIT)applyDiagramOperations): https://github.com/DayuanJiang/next-ai-draw-io (Apache-2.0)Вне скоупа