Главная / Блог / Подключение MCP-сервера к Топоматик Robur

Подключение MCP-сервера к Топоматик Robur

ИИ-агент, который читает активный проект, добавляет слои, строит полилинии и проверяет TLC-модели прямо в открытом Топоматик Robur, звучит как далёкое будущее. На самом деле мост для этого уже есть: Топоматик выложил проект robur-mcp на GitHub под лицензией MIT, а рядом лежит robur-copilot, готовый профиль агента с официальной документацией по TLC. К каталогу модулей ABR оба отношения не имеют.

Ниже полный путь: что это такое, как поставить, как подключить модель (в том числе DeepSeek по API) и на что напороться по дороге.

Что такое MCP и зачем он проектировщику

Model Context Protocol это открытый протокол, по которому языковая модель получает не текст, а набор инструментов с описанием параметров. Модель сама решает, какой инструмент вызвать, а результат вызова возвращается ей обратно.

Для Robur это переход от «агент подсказывает, как сделать» к «агент делает». Разница видна на типовых задачах:

  • прочитать структуру активного проекта и найти в ней нужный элемент;
  • прогнать .tlc скрипт на ошибки построения, не вставляя модель в чертёж;
  • разложить сотню одинаковых блоков по расчётным координатам;
  • собрать сводку по слоям и сущностям чертежа для проверки оформления.

Как устроен мост

Мост состоит из двух частей: Python-сервера, который говорит с внешним миром по HTTP, и C#-модуля, который живёт внутри процесса Robur и имеет доступ к активному проекту.

MCP-КЛИЕНТ агент с поддержкой HTTP-транспорта HTTP · 127.0.0.1:8000/mcp/ robur_mcp_server.exe Python-сервер, упакован в один exe NAMED PIPE · JSON Topomatic.ToolBridge.dll модуль внутри процесса Robur cadView.Invoke · UI-поток API ROBUR проект, чертёж, слои, тела, TLC
Два звена: HTTP наружу, именованный канал внутрь процесса Robur

Схема двухзвенная потому, что Robur не умеет сам поднимать HTTP-сервер, а MCP-клиенты не умеют говорить в именованный канал Windows. Каждый вызов инструмента доезжает до UI-потока Robur через cadView.Invoke и выполняется там же, где выполняются обычные команды.

Короткий путь: как поставил я

Собирать мост самому не нужно. Готовый пакет лежит на сайте Топоматик, в разделе плагинов. В репозитории на GitHub только исходники, релизов там нет, поэтому попытка «скачать с гита» заканчивается сборкой из исходников с плясками вокруг зависимостей. Это лишнее.

Скачать пакет: robur_mcp-0_1.tpm

Дальше по шагам, так ставил я:

  1. Поставить robur_mcp.tpm через штатный Диспетчер пакетов Robur, так же, как любой другой модуль
  2. Перезапустить Robur, открыть проект, встать на видовой экран
  3. Установить Hermes, подключить в нём модель по API и добавить профиль robur-copilot от Топоматик
  4. Выполнить команду 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 инструментов от восьми провайдеров. Это официальный набор Топоматика, мост расширяемый: как в него добавляются собственные инструменты, дальше в разделе «Свои инструменты». Дальше цикл работы выглядит так.

1 Промпт «Построй полилинию по этим точкам» 2 tools/list 57 инструментов со схемами параметров 3 call_tool dwg_polyline_create, координаты в JSON 4 Ответ сущность в чертеже, guid и bounds агенту
Модель не пишет за вас скрипт, она вызывает инструмент и читает результат

Готовый профиль агента: 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, около двух сотен файлов. Читать её полезно и без всякого агента.

Порядок установки профиля:

  1. Поставить robur-mcp.tpm и убедиться, что mcp_run поднимает сервер
  2. Установить Hermes с сайта hermes-agent.nousresearch.com
  3. В терминале Hermes (кнопка в правом нижнем углу) выполнить hermes profile install https://github.com/topomatic-code/robur-copilot --alias и подтвердить установку вводом Y
  4. Закрыть и заново открыть Hermes. Без перезапуска кнопка профиля не появится, это место, где застревают чаще всего
  5. Нажать кнопку robur_copilot в левом нижнем углу, чтобы профиль стал активным
  6. Запустить Robur, открыть проект, встать на видовой экран, выполнить mcp_run
  7. Подключить модель по API и выбрать её в Hermes

Терминал Hermes из шага 3 это обычная командная строка внутри окна Hermes, ничего специального. Если кнопки не видно, переключите раскладку окна через Layout editor в верхней панели, там есть режим с терминалом на половину экрана.

Последний шаг и есть ответ на вопрос «а какая модель за всё это отвечает». Профиль не привязан ни к провайдеру, ни к модели: он задаёт роль, скиллы и адрес MCP-сервера, а модель, ключ и параметры доступа берутся из локального окружения. Мост тем более ни к чему не привязан: MCP это протокол, к нему подключается любой клиент с HTTP-транспортом и любая модель, умеющая вызывать инструменты. Hermes и DeepSeek на видео это пример, а не единственно верный путь.

Именно на подключении модели спотыкается большинство, поэтому шаг разобран отдельно, со скриншотами и с разбором того, где взять ключ, если платить зарубежной картой нечем.

Как подключить ИИ-модель к Hermes: пошагово

Два способа потерять вечер

API это не подписка на чат. Оплаченный тариф в приложении DeepSeek не даёт работающего ключа: агент ходит по API, а это отдельный счёт. Пока на балансе API ноль, ключ создаётся, но молча не работает.

Модель обязана уметь вызывать инструменты. Reasoning-режимы у части провайдеров этого не умеют. Агент тогда сваливается в обычный чат и просто рассказывает, что бы он сделал, а в чертеже тишина.

Ещё пара мелочей на будущее: 57 инструментов со схемами параметров это заметный объём контекста в каждом запросе, компрессия в config.yaml включена именно поэтому. Ключ живёт в окружении Hermes, не в репозитории профиля, в .gitignore секреты и локальное состояние исключены.

Что агент получает

Чертёж 25 Тела 10 Блоки 5 Проект 3 TLC 5 Видовой экран 3 Трубы 3 Озеленение 3 ПРЕИМУЩЕСТВЕННО ЗАПИСЬ ПРЕИМУЩЕСТВЕННО ЧТЕНИЕ 57 ИНСТРУМЕНТОВ · 19 ЧТЕНИЕ / 38 ЗАПИСЬ
Точный расклад чтение/запись по каждой группе — в списке ниже

Подробнее по группам:

  • Проект: дерево активного проекта с типами и адресами элементов, создание папок, удаление элементов
  • Чертёж: слои целиком, чтение сущностей, создание и обновление полилиний, таблиц, текста, окружностей, линий и штриховок
  • Тела: создание, булевы операции, сечение плоскостью, вытягивание 2D-профиля вдоль 3D-кривой, трансформация
  • Блоки: создание, вставка, взрыв, удаление, список
  • TLC: выполнение скрипта на проверку ошибок без вставки, схема параметров, создание и обновление вставленной модели, извлечение скрипта из модели
  • Видовой экран: запрос точки и полигона у пользователя курсором, зумирование области
  • Водопропускные трубы: параметры, объёмы, спецификация
  • Озеленение: библиотека растений и вставка точечных насаждений

У каждого инструмента есть хинты ReadOnlyHint и DestructiveHint, по ним клиент понимает, что читает, а что меняет чертёж.

Свои инструменты: мост расширяемый

57 официальных инструментов не потолок. ToolManager.Initialize() внутри моста делает ApplicationHost.Current.Plugins.Broadcast("tool_request", ...) по всем плагинам Robur. Классы ToolProvider (public abstract) и ToolDefAttribute (public sealed) тоже публичные, любой модуль может подписаться на broadcast и добавить свои инструменты в общий список.

Чтобы подключиться, нужно три вещи.

  1. Ссылка на Topomatic.ToolBridge.dll в csproj модуля.
  2. Подписка на broadcast в .plugin:
{ "broadcasts": { "tool_request": "generate_tools" } }
  1. Метод-хендлер, который добавляет провайдер в общий список:
[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.

ПровайдерИнструментыЧто делают
QuickCommandsqc_list_profiles, qc_list_commands, qc_run_command, qc_switch_profileсписок профилей и команд, запуск команды по имени, переключение профиля
RoadStyleroadstyle_list_styles, roadstyle_apply_styleсписок сохранённых стилей оформления, применение стиля
ModelDeskmodeldesk_list_models, modeldesk_list_sheets, modeldesk_isolate_model, modeldesk_show_all_models, modeldesk_run_sheetдерево моделей проекта, изоляция/показ моделей, запуск ведомости
PavePlanpaving_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. Порядок захода от дешёвого к дорогому: сначала только читающие инструменты, потом запись в чертёж, когда стало понятно, где агент ошибается.

ИИ рулит в Топоматик Robur. Что из этого вышло?
ИИ рулит в Топоматик Robur. Что из этого вышло? Видео версия · YouTube
← Все статьи