2026 OpenClaw MCP の Node ランタイム不一致:Terminal では nvm が効くのに、レンタル ProxyMac Mac mini 上では MCP サブプロセスが ENOENT で落ちる理由
OpenClaw とカスタム MCP サーバーを香港・日本・韓国・シンガポール・米国にまたがる Mac mini M4 レンタルへ載せるチームは、Terminal.app では Node v22 が問題なく表示される一方で、標準エラーに /usr/bin/env: node: No such file or directory が並ぶログを貼り付けることがよくあります。犯人は「OpenClaw が壊れた」ではなく、複数の Node 実装が互いに影を落としており、launchd 経由のゲートウェイが継承するのはそのうちの一つだけ、という構造です。本稿では(1) MCP トランスポートに対してアップストリームスタックがますます前提とするモダンな Node の意味論、(2) errno 文字列から対処へ結びつける症状ハッシュ表、(3) LaunchAgent 下では nvm フックが実行されない理由、(4) PATH と Homebrew、環境変数、アップグレード/ロールバック と組み合わせる九ステップの監査ラダー、さらに(5) MCP シェルが pnpm dlx を呼ぶときの Corepack の角場合です。定量的な軸は Node 22 の機能ゲート、120 秒の再起動嵐、規制フリートにおけるドットファイル暗黙依存のゼロ許容です。
ランタイム分裂:対話シェルと LaunchAgent の世界
対話型 zsh は nvm.sh を source し、Homebrew Apple Silicon のパスを前置し、Corepack のシムも見せます。launchd は plist が列挙しない限り、しばしば /usr/bin:/bin:/usr/sbin:/sbin だけの乏しい環境で OpenClaw を起動します。MCP サーバーは親ゲートウェイが継承したものをそのまま継ぐため、#!/usr/bin/env node の shebang は、その PATH スライス上で env が node を見つけられないと破裂します。
- 観測指標:Terminal と小さな LaunchAgent の echo ジョブの両方から
node -p process.execPathを取得し—パス要素が一つでも食い違えば plist の修正が急務です。 - ABI 障害:arm64 バイナリと Rosetta シェルを混ぜると、きれいな ENOENT ではなく謎の V8 クラッシュとして現れますが、依然是ランタイム不一致です。
- 並列インストール:Homebrew の
/opt/homebrew/bin/node、手動 pkg、nvm 管理ビルドが共存できますが、CI がコピーした JSON がどれか一つだけを参照すると他環境で壊れます。
/etc/proxymac-node.channel を刻印してください—そうすると運用者は曖昧なチケットを約 35% 早く解決できます。
症状ハッシュ表:MCP 運用者向け errno 文字列
| ログ指紋 | 想定原因 | 最初の是正策 |
|---|---|---|
env: node: No such file | PATH に brew/nvm プレフィックスが無い | 絶対 PATH の項を追加するか /usr/local/bin 下にシンボリックリンク |
Error: Cannot find module 'node:fs' | モダンな import map を解釈できない極端に古い Node | プラットフォーム指針に沿って ≥22 の LTS チャネルへ更新 |
MCP ワーカー内の MODULE_NOT_FOUND | デーモンに NODE_PATH が無い | 明示的な workingDirectory を使うか依存をバンドル |
アップグレード後の spawn EBADF | 混在した部分インストール | ロールバック手順で戻す |
なぜ nvm.sh を source するのが本番契約として誤りか
nvm はシェル関数の背後に Node のダウンロードを遅延させます—人には便利ですが、深夜の自動化には脆いです。代わりに MCP JSON から直接参照する一つの承認済みインタープリタパスを入れるか、インジェクションリスクを脅威モデル化したうえでのみ /bin/bash -lc でラップしてください。キーチェーンガイドの秘密衛生と組み合わせ、ラッパーが set -x 経由でトークンを漏らさないようにします。
九ステップのランタイム監査ラダー
- デプロイを凍結:診断が終わるまで CI のマージを止め—
launchctl kickstartを振動させない。 - 実効 PATH をダンプ:一時的に LaunchAgent を計装し、ソート済み環境をログへ(保護ファイル)。
- Node ビルドを比較:両コンテキストで
node -p "[process.version, process.arch]"を実行。 - MCP JSON を正規化:相対のインタープリタヒントを絶対 exec パスへ置換。
- Corepack を揃える:ピン留めしたパッケージマネージャでグローバルに一度だけ有効化—バージョンを文書化。
- OpenClaw のアップグレードを突き合わせ:アップグレードマトリックスに従う。
- JSONL を tail:ログガイドで標準エラー行を相関。
- ulimit を検証:巨大モノレポでは fd を使い切ることがある—ulimit を参照。
- RCA を公開:影響リージョン(HK/JP/KR/SG/US)と semver エンドポイントを記録。
ProgramArguments に .zshrc 全文を詰め込むこと—レビュアーがセキュリティ後退を妥当に diff できません。
Corepack、pnpm、パッケージマネージャーを起動する MCP エントリポイント
MCP 定義が pnpm dlx や yarn node を呼ぶとき、Corepack は一貫して有効である必要があります—対話シェルが完了させるセットアッププロンプトは launchd には見えません。非対話フラグを焼き込み、サービス所有ディレクトリにミラーキャッシュを置けば HK と US のレプリカも同じ振る舞いになります。
FAQ
Docker でこの痛みは消えますか?コンテナは OS イメージを固定しますが、Node のベースタグは依然として選ぶ必要があり—semver の規律は同じです。
Apple Silicon は関係ありますか?はい—Intel ノートでビルドした fat バイナリは arm64 mini を誤ったターゲットにします。
SSH セッションはどこに位置づく?手動 SSH はログインシェルを継承しますがゲートウェイプロセスは継承しません—SSH テストはヒントであり契約ではありません。
規律ある Node 固定と相性の良い ProxyMac Mac mini
HK/JP/KR/SG/US にまたがるレンタル Mac mini M4 は、調達待ちなく決定的な Apple Silicon 環境を与え—MCP ゲートウェイがアップストリームの Node ペースを月次で追うには理想的です。ハードのレンタルは 料金ページ、運用ドキュメントは ヘルプセンター、GUI インストーラが Gatekeeper のプロンプトをクリックしなければならないときは VNC を参照してください。