ИИ / Автоматизация 8 мая 2026 г.

2026: несовпадение среды Node для MCP OpenClaw — почему nvm в Терминале работает, а подпроцессы MCP падают с ENOENT на арендованном Mac mini ProxyMac

Инженерная команда ProxyMac 8 мая 2026 г. ~12 мин чтения

Команды, которые крутят 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/node Homebrew, pkg с сайта и сборки nvm могут соседствовать; JSON, скопированный из CI и ссылающийся на одну копию, ломается в другом месте.
Совет: штампуйте каждый tarball Node на облачных mini текстовым файлом /etc/proxymac-node.channel с semver и checksum — операторы закрывают двусмысленные тикеты примерно на 35% быстрее.

Таблица симптомов: errno для операторов MCP

Отпечаток в логеВероятная причинаПервый шаг исправления
env: node: No such filePATH без префикса 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.

Лестница аудита среды из девяти шагов

  1. Заморозьте выкладки: остановите merge в CI, пока диагностика не завершена — не дёргайте launchctl kickstart понапрасну.
  2. Снимите эффективный PATH: временно залогируйте отсортированный env из LaunchAgent (в защищённый файл).
  3. Сравните сборки Node: node -p "[process.version, process.arch]" в обоих контекстах.
  4. Нормализуйте JSON MCP: замените относительные подсказки интерпретатора на абсолютные exec.
  5. Выровняйте Corepack: включите один раз глобально с закреплёнными менеджерами пакетов — версии задокументируйте.
  6. Сверьте апгрейды OpenClaw: следуйте матрице апгрейдов.
  7. Хвост JSONL: коррелируйте stderr по гайду по логам.
  8. Проверьте ulimit: огромные монорепы иногда выедают fd — см. ulimit.
  9. Опубликуйте 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