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-эхо-сервером.