ИИ-агент, который читает активный проект, добавляет слои, строит полилинии и проверяет TLC-модели прямо в открытом Топоматик Robur, звучит как далёкое будущее. На самом деле мост для этого уже есть: Топоматик выложил проект robur-mcp на GitHub под лицензией MIT, а рядом лежит robur-copilot, готовый профиль агента с официальной документацией по TLC. К каталогу модулей ABR оба отношения не имеют.
Ниже полный путь: что это такое, как поставить, как подключить модель (в том числе DeepSeek по API) и на что напороться по дороге.
Что такое MCP и зачем он проектировщику
Model Context Protocol это открытый протокол, по которому языковая модель получает не текст, а набор инструментов с описанием параметров. Модель сама решает, какой инструмент вызвать, а результат вызова возвращается ей обратно.
Для Robur это переход от «агент подсказывает, как сделать» к «агент делает». Разница видна на типовых задачах:
- прочитать структуру активного проекта и найти в ней нужный элемент;
- прогнать
.tlcскрипт на ошибки построения, не вставляя модель в чертёж; - разложить сотню одинаковых блоков по расчётным координатам;
- собрать сводку по слоям и сущностям чертежа для проверки оформления.
Как устроен мост
Мост состоит из двух частей: Python-сервера, который говорит с внешним миром по HTTP, и C#-модуля, который живёт внутри процесса Robur и имеет доступ к активному проекту.
Схема двухзвенная потому, что Robur не умеет сам поднимать HTTP-сервер, а MCP-клиенты не умеют говорить в именованный канал Windows. Каждый вызов инструмента доезжает до UI-потока Robur через cadView.Invoke и выполняется там же, где выполняются обычные команды.
Короткий путь: как поставил я
Собирать мост самому не нужно. Готовый пакет лежит на сайте Топоматик, в разделе плагинов. В репозитории на GitHub только исходники, релизов там нет, поэтому попытка «скачать с гита» заканчивается сборкой из исходников с плясками вокруг зависимостей. Это лишнее.
Скачать пакет: robur_mcp-0_1.tpm
Дальше по шагам, так ставил я:
- Поставить
robur_mcp.tpmчерез штатный Диспетчер пакетов Robur, так же, как любой другой модуль - Перезапустить Robur, открыть проект, встать на видовой экран
- Установить Hermes, подключить в нём модель по API и добавить профиль
robur-copilotот Топоматик - Выполнить команду
mcp_run: Hermes подключается к мосту сам, никаких дополнительных настроек в Robur не нужно
Подробности по третьему шагу дальше, в разделе «Готовый профиль агента: robur-copilot», а подключение модели вынесено в отдельную инструкцию.
Проверить, что сервер поднялся, можно и без Hermes: curl http://127.0.0.1:8000/health должен вернуть {"ok": true, ...}.
Учебная версия Robur тоже подходит, мост на ней поднимается.
Команды и жизненный цикл сервера
tool_bridge_initподнять канал связиtool_bridge_shutdownостановить каналmcp_server_runзапустить серверmcp_server_shutdownостановить сервер, ждёт до 5 секундmcp_runподнять канал и сервер разом
Отдельно останавливать сервер обычно не требуется: процесс сразу помещается в Windows Job Object с флагом закрытия по завершении задания. Закрыли Robur, Windows убила сервер и всё его дерево процессов, порт освободился.
Подключение клиента
Транспорт stateless streamable HTTP, поэтому подойдёт любой MCP-клиент с поддержкой HTTP. В конфигурации клиента достаточно адреса.
{
"mcpServers": {
"robur": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp/"
}
}
}
После подключения клиент увидит 57 инструментов от восьми провайдеров. Это официальный набор Топоматика, мост расширяемый: как в него добавляются собственные инструменты, дальше в разделе «Свои инструменты». Дальше цикл работы выглядит так.
Готовый профиль агента: robur-copilot
Второй репозиторий Топоматик, robur-copilot, это профиль для Hermes Agent (Nous Research) под ту же лицензию MIT. Ставить его не обязательно, мост работает с любым клиентом, но профиль экономит вечер настройки.
Что внутри:
SOUL.mdроль ассистента, стиль ответов и границы поведения;config.yamlадрес MCP-сервера, включённые веб-поиск и исполнение кода, подтверждение записи (write_approval), компрессия контекста;skills/robur/tlc-assistantскилл для консультаций и написания TLC-скриптов, а внутри него официальная документация по TLC: базовые конструкции,defcomponent, свойства компонентов, виды элементов ИМ, векторные функции и отдельный раздел ограничений.
Последний пункт ценен сам по себе. Это авторская документация Топоматик по языку TLC, выложенная под MIT, около двух сотен файлов. Читать её полезно и без всякого агента.
Порядок установки профиля:
- Поставить
robur-mcp.tpmи убедиться, чтоmcp_runподнимает сервер - Установить Hermes с сайта
hermes-agent.nousresearch.com - В терминале Hermes (кнопка в правом нижнем углу) выполнить
hermes profile install https://github.com/topomatic-code/robur-copilot --aliasи подтвердить установку вводомY - Закрыть и заново открыть Hermes. Без перезапуска кнопка профиля не появится, это место, где застревают чаще всего
- Нажать кнопку
robur_copilotв левом нижнем углу, чтобы профиль стал активным - Запустить Robur, открыть проект, встать на видовой экран, выполнить
mcp_run - Подключить модель по API и выбрать её в Hermes
Терминал Hermes из шага 3 это обычная командная строка внутри окна Hermes, ничего специального. Если кнопки не видно, переключите раскладку окна через Layout editor в верхней панели, там есть режим с терминалом на половину экрана.
Последний шаг и есть ответ на вопрос «а какая модель за всё это отвечает». Профиль не привязан ни к провайдеру, ни к модели: он задаёт роль, скиллы и адрес MCP-сервера, а модель, ключ и параметры доступа берутся из локального окружения. Мост тем более ни к чему не привязан: MCP это протокол, к нему подключается любой клиент с HTTP-транспортом и любая модель, умеющая вызывать инструменты. Hermes и DeepSeek на видео это пример, а не единственно верный путь.
Именно на подключении модели спотыкается большинство, поэтому шаг разобран отдельно, со скриншотами и с разбором того, где взять ключ, если платить зарубежной картой нечем.
→ Как подключить ИИ-модель к Hermes: пошагово
API это не подписка на чат. Оплаченный тариф в приложении DeepSeek не даёт работающего ключа: агент ходит по API, а это отдельный счёт. Пока на балансе API ноль, ключ создаётся, но молча не работает.
Модель обязана уметь вызывать инструменты. Reasoning-режимы у части провайдеров этого не умеют. Агент тогда сваливается в обычный чат и просто рассказывает, что бы он сделал, а в чертеже тишина.
Ещё пара мелочей на будущее: 57 инструментов со схемами параметров это заметный объём контекста в каждом запросе, компрессия в config.yaml включена именно поэтому. Ключ живёт в окружении Hermes, не в репозитории профиля, в .gitignore секреты и локальное состояние исключены.
Что агент получает
Подробнее по группам:
- Проект: дерево активного проекта с типами и адресами элементов, создание папок, удаление элементов
- Чертёж: слои целиком, чтение сущностей, создание и обновление полилиний, таблиц, текста, окружностей, линий и штриховок
- Тела: создание, булевы операции, сечение плоскостью, вытягивание 2D-профиля вдоль 3D-кривой, трансформация
- Блоки: создание, вставка, взрыв, удаление, список
- TLC: выполнение скрипта на проверку ошибок без вставки, схема параметров, создание и обновление вставленной модели, извлечение скрипта из модели
- Видовой экран: запрос точки и полигона у пользователя курсором, зумирование области
- Водопропускные трубы: параметры, объёмы, спецификация
- Озеленение: библиотека растений и вставка точечных насаждений
У каждого инструмента есть хинты ReadOnlyHint и DestructiveHint, по ним клиент понимает, что читает, а что меняет чертёж.
Свои инструменты: мост расширяемый
57 официальных инструментов не потолок. ToolManager.Initialize() внутри моста делает ApplicationHost.Current.Plugins.Broadcast("tool_request", ...) по всем плагинам Robur. Классы ToolProvider (public abstract) и ToolDefAttribute (public sealed) тоже публичные, любой модуль может подписаться на broadcast и добавить свои инструменты в общий список.
Чтобы подключиться, нужно три вещи.
- Ссылка на
Topomatic.ToolBridge.dllв csproj модуля. - Подписка на broadcast в
.plugin:
{ "broadcasts": { "tool_request": "generate_tools" } }
- Метод-хендлер, который добавляет провайдер в общий список:
[cmd("generate_tools")]
private void GenerateTools(object[] args)
{
var providers = args[0] as List<ToolProvider>;
providers.Add(new PavePlanTools());
}
Рефлексия подхватывает метод-инструмент только при точной сигнатуре: один параметр Dictionary<string, object>, возврат object, атрибут [ToolDef] с валидным JSON Schema в InputSchema. Промахнулись сигнатурой, метод молча игнорируется, без ошибки в логе.
Имя generate_tools уже занято ToolBridge. Оно приходит через broadcast, не через глобальный RegisterFunction, и у каждого плагина свой хендлер, но дубль имени команды всё равно роняет Robur, проверять живым тестом перед релизом.
Что добавил я
Поверх официальных 57 у меня подключены ещё 4 провайдера, 19 инструментов, tools/list отдаёт 76.
| Провайдер | Инструменты | Что делают |
|---|---|---|
| QuickCommands | qc_list_profiles, qc_list_commands, qc_run_command, qc_switch_profile | список профилей и команд, запуск команды по имени, переключение профиля |
| RoadStyle | roadstyle_list_styles, roadstyle_apply_style | список сохранённых стилей оформления, применение стиля |
| ModelDesk | modeldesk_list_models, modeldesk_list_sheets, modeldesk_isolate_model, modeldesk_show_all_models, modeldesk_run_sheet | дерево моделей проекта, изоляция/показ моделей, запуск ведомости |
| PavePlan | paving_list_products, paving_list_schemes, paving_get, paving_ping, paving_create, paving_update, paving_paint, paving_report | каталог мощения, раскладка плит по контуру, покраска, отчёт по площади |
Живые тесты вскрыли три нюанса.
qc_run_commandтолько запускает команду по имени и не умеет подавать ей ответы. Команды с запросом точки курсором (пл→ polyline,круг→ circle_2_points) на этом зависают, агенту нечем ответить на приглашение. Годится для нединамических команд: отчёты, переключатели, диалоги без дальнейшего ввода.paving_paintдаёт настоящую шахматную раскраску черезfilter.checkerboard: {parity},rowPatternкрасит только целыми рядами, для чередования по клетке нужен именноcheckerboard.paving_createвозвращаетid, совпадающий с реальным guid сущности в чертеже (проверено сверкой сdwg_get_entities_info). Отдельного инструмента удаления мощения нет и не нужно, удаляется как любая другая сущность черезdwg_remove_active_space_entity.
Ограничения
- Headless-режима нет. Robur должен быть открыт, проект загружен, активен видовой экран. Иначе вызов вернёт требование перейти на нужный видовой экран.
- Всё исполняется в UI-потоке. Долгий инструмент подвешивает интерфейс Robur на время работы.
- Порт 8000 захардкожен в
mcp_server/main.py, как и хост. Это типичный порт локального dev-сервера, конфликт вероятен. - API молодой. Репозитории свежие, имена инструментов ещё будут меняться. Завязывать на них автоматизацию стоит с оглядкой.
Безопасность: читать до запуска
Сервер поднимается на 127.0.0.1:8000 без токена, без сессии и без какой-либо аутентификации. Любой процесс на машине получает те же права, что и ваш агент, включая удаление элементов проекта.
Полный список последствий:
- Любой процесс на этой машине, включая расширение браузера или чужой скрипт, получает те же права, что и ваш агент. Среди инструментов есть удаление элементов проекта, удаление сущностей чертежа и удаление блоков.
- Деструктивные инструменты меняют живой проект без подтверждения на стороне Robur. Подтверждение вызовов держите на стороне клиента (в профиле
robur_copilotдля этого естьwrite_approval) и первое время работайте на копии проекта. - Хост менять не нужно. Привязка к
127.0.0.1и есть единственная защита, вынос сервера на0.0.0.0или проброс порта наружу открывает проект всей сети. - Не держите
mcp_runзапущенным «на всякий случай». Запустили под задачу, закончили, закрыли Robur. - Проверяйте, что на порту 8000 действительно ваш сервер: запрос
/healthвозвращает состояние моста, а не просто «что-то отвечает».
Отдельно стоит помнить, что содержимое чертежа и проекта для агента это входные данные. Текст, попавший в чертёж, может быть прочитан моделью как инструкция, поэтому давать агенту деструктивные права по умолчанию не стоит.
Итог
Мост рабочий и ставится за вечер: готовый пакет, mcp_run, профиль robur_copilot, ключ DeepSeek. Порядок захода от дешёвого к дорогому: сначала только читающие инструменты, потом запись в чертёж, когда стало понятно, где агент ошибается.