2026: несовпадение среды Node для MCP OpenClaw — почему nvm в Терминале работает, а подпроцессы MCP падают с ENOENT на арендованном Mac mini ProxyMac
Команды, которые крутят OpenClaw с кастомными MCP-серверами на арендованных Mac mini M4 в Гонконге, Японии, Корее, Сингапуре и США, часто вставляют в тикет stderr с /usr/bin/env: node: No such file or directory, тогда как Node v22 в Terminal.app печатается без ошибок. Дело не в том, что «сломали OpenClaw», а в том, что несколько установок Node перекрывают друг друга, и launchd-шлюзы наследуют не ту. Здесь разберём (1) как upstream всё чаще предполагает современный Node для транспортов MCP, (2) таблицу симптомов errno → действия, (3) почему хуки nvm не выполняются в LaunchAgents, (4) лестницу аудита из девяти шагов вместе с PATH и Homebrew, переменными окружения и откатом апгрейдов, плюс (5) краевые случаи Corepack, когда MCP вызывает pnpm dlx. В цифрах: ориентир на Node 22, штормы рестартов 120 с и ноль толерантности к скрытой зависимости от dotfile в регулируемых парках.
Разрыв среды: интерактивные оболочки и «планета» LaunchAgent
Интерактивный zsh спокойно источит nvm.sh, добавит префиксы Homebrew Apple Silicon и отдаст shim Corepack. launchd стартует OpenClaw с урезанным окружением — часто только /usr/bin:/bin:/usr/sbin:/sbin — пока plist явно не перечислит дополнения. MCP-серверы наследуют то же, что родительский шлюз; поэтому shebang #!/usr/bin/env node взрывается, когда env не находит node на этом куске PATH.
- Наблюдаемая метрика: снимите
node -p process.execPathиз Терминала и из крошечного LaunchAgent echo-job — расхождение больше одного компонента пути = срочные правки plist. - Срывы ABI: смесь arm64 бинарников с оболочками Rosetta проявляется загадочными падениями V8, а не чистым ENOENT — всё равно несовпадение рантайма.
- Параллельные инсталляции:
/opt/homebrew/bin/nodeHomebrew, pkg с сайта и сборки nvm могут соседствовать; JSON, скопированный из CI и ссылающийся на одну копию, ломается в другом месте.
/etc/proxymac-node.channel с semver и checksum — операторы закрывают двусмысленные тикеты примерно на 35% быстрее.
Таблица симптомов: errno для операторов MCP
| Отпечаток в логе | Вероятная причина | Первый шаг исправления |
|---|---|---|
env: node: No such file | PATH без префикса brew/nvm | Абсолютный блок PATH или симлинк в /usr/local/bin |
Error: Cannot find module 'node:fs' | Слишком старый Node и современные import maps | Обновить до канала ≥22 LTS по гайду платформы |
MODULE_NOT_FOUND в воркере MCP | У демона пустой NODE_PATH | Явный workingDirectory или бандл зависимостей |
spawn EBADF после апгрейда | Смешанные частичные инсталляции | Откат по сценарию rollback |
Почему source nvm.sh — неверный прод-контракт
nvm прячет загрузки Node за shell-функции — удобно людям, хрупко для полуночной автоматизации. Вместо этого поставьте один благословлённый путь к интерпретатору в JSON MCP или оборачивайте /bin/bash -lc только после threat model на инъекции. Сочетайте с гигиеной секретов из гайда по Keychain, чтобы обёртки не сливали токены через set -x.
Лестница аудита среды из девяти шагов
- Заморозьте выкладки: остановите merge в CI, пока диагностика не завершена — не дёргайте
launchctl kickstartпонапрасну. - Снимите эффективный PATH: временно залогируйте отсортированный env из LaunchAgent (в защищённый файл).
- Сравните сборки Node:
node -p "[process.version, process.arch]"в обоих контекстах. - Нормализуйте JSON MCP: замените относительные подсказки интерпретатора на абсолютные exec.
- Выровняйте Corepack: включите один раз глобально с закреплёнными менеджерами пакетов — версии задокументируйте.
- Сверьте апгрейды OpenClaw: следуйте матрице апгрейдов.
- Хвост JSONL: коррелируйте stderr по гайду по логам.
- Проверьте ulimit: огромные монорепы иногда выедают fd — см. ulimit.
- Опубликуйте RCA: регионы (HK / JP / KR / SG / US), semver конечных точек.
.zshrc в ProgramArguments plist — ревьюерам невозможно внятно диффить регрессии безопасности.
Corepack, pnpm и точки входа MCP, которые дергают менеджеры пакетов
Когда в определениях MCP вызывают pnpm dlx или yarn node, Corepack должен быть включён одинаково — интерактивные оболочки часто проходят интерактивные шаги настройки, которые launchd не видит. Пропишите неинтерактивные флаги и зеркала кэша в каталогах, которыми владеет сервис, чтобы реплики HK и US вели себя одинаково.
FAQ
Снимет ли Docker боль? Контейнеры закрепляют образ ОС, но тег базового Node вы всё равно выбираете сами — та же semver-дисциплина.
Важен ли Apple Silicon? Да — fat-сборки с Intel-ноутбуков промахиваются по arm64 mini.
Куда вписывается SSH? Ручной SSH наследует login shell; процессы шлюза — нет; трактуйте SSH-тесты как подсказку, не как контракт.
Почему Mac mini ProxyMac подходит под дисциплину закрепления Node
Арендованные Mac mini M4 в HK / JP / KR / SG / US дают предсказуемую среду Apple Silicon без закупочных задержек — удобно, когда шлюзам MCP приходится успевать за ежемесячным ритмом обновлений Node upstream. Сочетайте железо со страницей тарифов и операционными документами справочного центра; используйте VNC, когда GUI-инсталлятору нужно вручную пройти приглашения Gatekeeper.
Катите MCP с одним благословлённым бинарником Node
OpenClaw · MCP · HK / JP / KR / SG / US