#requires -Version 5.1 # Точка входа MCP-сервера КОМПАС-3D. # ИНВАРИАНТ: до запуска сервера в stdout не уходит ни байта — stdout занят JSON-RPC. Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $ProgressPreference = 'SilentlyContinue' $exe = $null try { if (-not [string]::IsNullOrWhiteSpace($env:KOMPAS_MCP_EXE)) { # Режим разработки: сервер собран локально, дерево плагина не трогаем. $exe = $env:KOMPAS_MCP_EXE } else { # Сервер едет в самом плагине (framework-dependent, ~6,6 МБ на диске): скачивать # и сверять контрольные суммы нечего — git уже доставил файл вместе с навыками. $exe = Join-Path (Split-Path -Parent $PSScriptRoot) 'bin\kompas-mcp.exe' } # -PathType Leaf: без него путь к существующему каталогу молча проходит проверку, # а падает уже голый вызов "& $exe" сырым CommandNotFoundException в обход catch ниже. if (-not (Test-Path -LiteralPath $exe -PathType Leaf)) { throw "не найден сервер: $exe" } } catch { [Console]::Error.WriteLine("kompas-mcp launcher: $($_.Exception.Message)") exit 1 } try { # Сплаттинг @args во внешний процесс: пустые строки-аргументы теряются (особенность # PowerShell) — для MCP-клиента безвредно, он серверу аргументов не передаёт. & $exe @args $serverExit = $LASTEXITCODE } catch { # Сбой самого запуска (битый бинарь, недостающая зависимость, отказ в доступе) — # не путать с ненулевым кодом возврата уже запущенного сервера, это не exception. # Самая частая причина здесь — отсутствующий .NET Runtime: сервер поставляется # framework-dependent, и без рантайма apphost падает именно тут. [Console]::Error.WriteLine("kompas-mcp launcher: не удалось запустить сервер: $($_.Exception.Message)") [Console]::Error.WriteLine("kompas-mcp launcher: если .NET Runtime не установлен — https://dotnet.microsoft.com/download/dotnet (нужен .NET 8 или новее, x64)") exit 1 } exit $serverExit