Зафиксирован фундамент проекта MCP-сервера КОМПАС-3D: - docs/: ARCHITECTURE.md, IMPLEMENTATION_PLAN.md, presentation.html - tools/kdoc.py: навигатор по справке SDK - libs/kompas-interop/: вендорские interop-сборки КОМПАС из SDK - src/Kompas.Mcp.ConnectSpike: net8.0-windows консоль, доказывает работу COM-интеропа и attach/launch подключения к КОМПАС (IApplication, версия 24.0) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
9.1 KiB
План реализации MCP-сервера КОМПАС-3D
Документ описывает, как строить сервер. Что строим и почему — в
ARCHITECTURE.md. Прогресс отражается вpresentation.html(TODO).
Принцип
«Ходячий скелет» + спайки на риски. Сначала сквозной тонкий срез
(подключение → снимок), который проходит через все слои и доказывает, что связка
COM ↔ STA ↔ MCP работает. Затем наращиваем инструменты, и каждый шаг построения сразу
проверяем визуально (model_snapshot) — это и есть целевой UX «строю под контролем».
Окружение (проверено 2026-05-25)
| Факт | Следствие для плана | |
|---|---|---|
| .NET SDK | 10.0.108 (отдельного .NET 8 SDK нет; рантайм 8 есть) | таргет net8.0-windows (LTS), собирается SDK 10 |
| ProgID КОМПАС | KOMPAS.Application.7 и KOMPAS.Application.5 зарегистрированы; KOMPASLT.* отсутствует |
подключаться напрямую к API7 через KOMPAS.Application.7; LT — только запасной |
| Процесс | КОМПАС не запущен | спайк подключения должен уметь launch, не только attach |
| SDK | C:\Program Files\ASCON\KOMPAS-3D v24 Home\SDK (lib\*.tlb) |
источник interop |
Прерэквизит разработчика: установленный КОМПАС v24 + возможность его запускать.
Спайки (делать первыми — снимают главные неизвестные)
| # | Риск / вопрос | Критерий успеха |
|---|---|---|
| S1 | Генерация COM-interop из .tlb в SDK-проекте |
net8.0-windows проект с <COMReference> на kAPI7.tlb, kAPI5.tlb, ksConstants.tlb, ksConstants3D.tlb собирается; типы IApplication, KompasObject доступны. Запасной путь — tlbimp/ручные interop-сборки |
| S2 | Подключение по ProgID | консольная проба: attach (Marshal.GetActiveObject) → при отказе launch (Activator.CreateInstance(Type.GetTypeFromProgID("KOMPAS.Application.7"))); получить IApplication, Visible=true, прочитать версию |
| S3 | STA-поток + насос сообщений + async MCP | выделенный STA-поток выполняет COM-вызовы из пула задач без RPC_E_WRONGTHREAD; насос сообщений не вешает процесс |
| S4 | Рендер модели в растр на v24 Home | ksDocument3D.RasterFormatParam() → resultArrayBytes отдаёт корректные PNG-байты открытого 3D-документа |
Спайки — выбрасываемый код в spikes/; выводы переносятся в Core.
Фазы
Фаза 0 — Каркас репозитория
git init,.gitignore(.NET +bin/,obj/; не игнорироватьdocs/).KompasMcp.sln; проектыKompas.Mcp.Host,Kompas.Mcp.Core,Kompas.Mcp.Interop,Kompas.Mcp.Tools(в v1 допустимо начать одним проектом, разнося по папкам).Directory.Build.props:TargetFramework=net8.0-windows,Platforms=x64,Nullable=enable,LangVersion=latest.- Пакеты:
ModelContextProtocol,Microsoft.Extensions.Hosting. - Готово:
dotnet build -c Releaseпроходит; пустой stdio-хост стартует.
Фаза 1 — Interop + маппинг констант
<COMReference>на типобиблиотеки (итог S1). Зафиксировать стратегию (embed vs сборки).Kompas.Mcp.Interop: хелперы «строка ↔ enum» —DocumentTypeEnum(part=4, assembly=5, drawing=1, fragment=2),Obj3dType,ksEndTypeEnum,ksDirectionTypeEnum, базовые плоскости (o3d_planeXOY/XOZ/YOZ).- Готово: unit-тесты маппинга (без COM) зелёные.
Фаза 2 — STA-диспетчер
KompasThread: выделенный STA-поток, очередь задач (Channel/BlockingCollection),Task<T> InvokeAsync(Func<T>), насос сообщений + периодическийPumpWaitingMessages(итог S3).- Готово: интеграционный тест — параллельные
InvokeAsyncисполняются строго на одном STA-потоке.
Фаза 3 — Connection + вертикальный срез (MCP)
KompasSession: resolve ProgID (KOMPAS.Application.7→.5+ksGetApplication7()→KOMPASLT.*), attach/launch,Visible, версия/редакция, освобождение COM,Quitтолько если запускали мы.- Хост: stdio-сервер, логи в stderr, регистрация инструментов через DI.
- Инструменты
System:kompas_connect,kompas_status,kompas_set_visible. - Готово (веха «скелет»): из MCP Inspector вызвать
kompas_connect→ КОМПАС стартует и виден;kompas_statusотвечает.
Фаза 4 — Documents
document_create(part/assembly/drawing/fragment),document_open,document_save,document_close,document_active.- Готово: создать деталь, сохранить
.m3d, закрыть, открыть заново.
Фаза 5 — Vision (раннее — делает всё дальнейшее проверяемым)
set_view(ориентация iso/front/top/right, zoom-to-fit,ShadedWireframe),model_snapshot(RasterFormatParam.resultArrayBytes→ image-контент MCP) — итог S4.- Готово:
model_snapshotвозвращает PNG открытой детали; агент видит изображение в ответе инструмента.
Фаза 6 — Sketch
sketch_create(плоскость или грань),sketch_add_line|circle|arc|rectangle,sketch_close(NewEntity(o3d_sketch)→SetPlane→BeginEdit/примитивы/EndEdit, гарантированныйEndEditвfinally).- Готово: построить эскиз-окружность на XOY и увидеть его на снимке.
Фаза 7 — Features
extrude_boss/extrude_cut(depth, direction, endType),revolve_boss/revolve_cut,rebuild.- Готово (целевой демо-сценарий): окружность →
extrude_boss(цилиндр) →model_snapshot→ выбрать грань → эскиз →extrude_cut(отверстие) →model_snapshot. Полный цикл со зрением.
Фаза 8 — Query / Selection
select_face_by_point,list_bodies,list_faces_planes,get_part_info(МЦХ/габариты).- Готово: агент может выбрать грань для следующего эскиза по координатам.
Фаза 9 — Качество и поставка
- Unit-тесты (маппинг, валидация, форматирование); интеграционные (
[Trait("Category","Integration")], гейтятся). - Трансляция ошибок COM (
ksGetLastError/IApplication.KompasError) в структурированные MCP-ошибки. - Сборка
kompas-mcp.exe(dotnet publish -c Release -r win-x64), регистрация stdio-сервера в конфиге клиента. - Escape-hatch
run_kompas_command(опц.).
Порядок и зависимости
S1,S2 ─► Фаза 0 ─► Фаза 1 ─► Фаза 2 ─► Фаза 3 (скелет) ─► Фаза 4 ─► Фаза 5 (зрение)
│
Фаза 6 ─► Фаза 7 ─► Фаза 8 ─► Фаза 9
S3 ─► Фаза 2 S4 ─► Фаза 5
Критический риск — S1/S3 (interop + STA). Если <COMReference> не заработает на v24 .tlb —
переход на сгенерированные tlbimp interop-сборки. Все спайки до Фазы 3.
Definition of Done для v1
Агент через MCP: подключается к КОМПАС → создаёт деталь → строит эскиз → выдавливает →
делает снимок → видит результат → выбирает грань → повторяет → сохраняет .m3d.
Сервер собирается в один .exe и регистрируется в клиенте по stdio.