MCP Server (FreeCAD)¶
MCP Server — лёгкий TCP-сервер, который принимает stubs.json
(список примитивов) и размещает примитивы (радиаторы) в активном документе FreeCAD.
Проект ориентирован на локальную работу: MCP запускается внутри FreeCAD (GUI) или через системный Python при наличии доступа к библиотекам FreeCAD (переменная окружения FREECAD_PATH
).
Важно: модули
FreeCAD
/Part
доступны только в окружении FreeCAD или если вы указали корректную папку с бинарными модулями черезFREECAD_PATH
. MCP не запускается в CI (GitHub Actions) по умолчанию — FreeCAD там нет.
📂 Структура
mcp_server/
├── mcp_serverV3.py # основной код сервера (безопасен при импорте без FreeCAD)
├── run_cli.py # CLI-wrapper для запуска из системного Python
└── README.md # документация модуля
Требования
- Python
>= 3.11
(для запуска wrapper и клиентских утилит). - Для фактического размещения примитивов — локально установленный FreeCAD (GUI или FreeCAD Python).
- При запуске через системный
python
укажитеFREECAD_PATH
, указывающую на папку сFreeCAD.pyd
/бинарными модулями (пример:C:\Program Files\FreeCAD 0.21\bin
).
⚙️ Установка
- Клонируйте репозиторий и перейдите в корень проекта.
- (Опционально) Создайте виртуальное окружение для утилит/скриптов
scripts/
:
python -m venv .venv
.\.venv\Scripts\Activate.ps1 # PowerShell
pip install --upgrade pip
# затем установка зависимостей для nlp/bim при необходимости
MCP сам по себе не имеет внешних pip-зависимостей кроме стандартных библиотек, но для запуска pipeline нужны зависимости NLP/BIM.
Сценарии запуска
1) Быстрый запуск внутри FreeCAD (рекомендуется для локального теста)
Откройте FreeCAD GUI → Python Console и выполните:
exec(open(r"C:\path\to\draftai\mcp_server\mcp_serverV3.py", encoding="utf-8").read())
При выполнении как __main__
модуль попытается:
- при необходимости создать новый документ (если ActiveDocument == None);
- запустить сервер в фоновом потоке (run_in_background()
), чтобы GUI остался интерактивным.
Если автозапуск прошёл успешно — в Python Console/Report View появятся сообщения о старте сервера.
Опции run_cli.py
:
- --host
(по умолчанию 127.0.0.1
) — хост для привязки.
- --port
(по умолчанию 9090
) — TCP-порт.
- --background
/ -b
— запуск в фоне (daemon thread).
- --freecad-path
— путь к папке FreeCAD bin (опционально).
- --verbose
/ -v
— подробные логи.
Отправка примитивов stubs.json
(клиент)
После того как BIM сформировал stubs.json
(в bim_core/runs/.../stubs.json
), отправьте его на MCP:
python .\scripts\send_stubs_cli.py --stubs bim_core/runs/stubs.json -v
Клиент подключится к MCP и отправит JSON (одна строка + \n
). В активном документе FreeCAD должны появиться объекты.
Поведение кода и безопасность запуска в CI
mcp_serverV3.py
написан так, чтобы безопасно импортироваться без FreeCAD: при отсутствии FreeCAD модуль не падает, а логирует подсказки. Это позволяет запускать CI (линеры, тесты NLP/BIM) без ошибок.- Автозапуск при
__main__
(вызовexec(...)
в FreeCAD) — удобная интерактивная фича; при импорте в wrapper (run_cli.py
) автозапуск не происходит (чтобы CI/импорт не стартовал сервер). - В CI не запускаются шаги, требующие FreeCAD. Для покрытий, зависящих от MCP, используйте моки
FreeCAD
/Part
в тестах.
Логи и видимость в FreeCAD
- Для удобства логирование в
mcp_serverV3.py
направлено в стандартныйlogging
. Мы также добавилиFreeCAD
-лог-хендлер, который при наличииFreeCAD
перенаправляетlogging
в Report View / Python Console (FreeCAD.Console.PrintMessage
/PrintError
). - Если вы не видите сообщений в Report View, убедитесь, что вы:
- выполнили
exec(...)
внутри FreeCAD (или подключилиrun_cli.py
с--freecad-path
), - Report View открыт (View → Panels → Report view).
Troubleshooting (частые ошибки)
-
ModuleNotFoundError: No module named 'FreeCAD'
— Запустите скрипт внутри FreeCAD (exec) или укажитеFREECAD_PATH
перед запускомrun_cli.py
. -
ConnectionRefusedError
при отправке stubs
— MCP не слушает порт. Проверьте, запущен ли MCP (FreeCAD console / run_cli logs), и совпадают ли host/port у клиента и сервера. -
Логи не отображаются в Report View
— Убедитесь, чтоattach_freecad_logging()
вызван (вmcp_serverV3.py
он вызывается после успешного импортаFreeCAD
) и Report View открыт.
Интеграция с Pipeline
- В
scripts/run_pipeline_local.*
логика pipeline формируетstubs.json
(NLP → BIM), затем предлагает/ждёт запуска MCP в FreeCAD, и отправляетstubs.json
черезsend_stubs_cli.py
. Это комбинация автоматизации и ручного шага, необходимого из-за GUI-зависимости FreeCAD.
Тестирование
- Локально: откройте FreeCAD, выполните
exec(...)
или используйтеrun_cli.py
, затем запуститеsend_stubs_cli.py
и проверьте объекты в документе. - В CI: тесты, которые требуют работы с
FreeCAD
необходимо запускать с моками; сетевой клиент/сервер можно протестировать локально с простым TCP-эхо-сервером.