AI/自動化 2026年5月8日

2026 OpenClaw MCP の Node ランタイム不一致:Terminal では nvm が効くのに、レンタル ProxyMac Mac mini 上では MCP サブプロセスが ENOENT で落ちる理由

ProxyMac エンジニアリングチーム 2026年5月8日 約 12 分で読めます

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 スライス上で envnode を見つけられないと破裂します。

  • 観測指標:Terminal と小さな LaunchAgent の echo ジョブの両方から node -p process.execPath を取得し—パス要素が一つでも食い違えば plist の修正が急務です。
  • ABI 障害:arm64 バイナリと Rosetta シェルを混ぜると、きれいな ENOENT ではなく謎の V8 クラッシュとして現れますが、依然是ランタイム不一致です。
  • 並列インストール:Homebrew の /opt/homebrew/bin/node、手動 pkg、nvm 管理ビルドが共存できますが、CI がコピーした JSON がどれか一つだけを参照すると他環境で壊れます。
ヒント:クラウド mini に展開する Node tarball すべてに、semver とチェックサムを書いたテキスト /etc/proxymac-node.channel を刻印してください—そうすると運用者は曖昧なチケットを約 35% 早く解決できます。

症状ハッシュ表:MCP 運用者向け errno 文字列

ログ指紋想定原因最初の是正策
env: node: No such filePATH に 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 経由でトークンを漏らさないようにします。

九ステップのランタイム監査ラダー

  1. デプロイを凍結:診断が終わるまで CI のマージを止め—launchctl kickstart を振動させない。
  2. 実効 PATH をダンプ:一時的に LaunchAgent を計装し、ソート済み環境をログへ(保護ファイル)。
  3. Node ビルドを比較:両コンテキストで node -p "[process.version, process.arch]" を実行。
  4. MCP JSON を正規化:相対のインタープリタヒントを絶対 exec パスへ置換。
  5. Corepack を揃える:ピン留めしたパッケージマネージャでグローバルに一度だけ有効化—バージョンを文書化。
  6. OpenClaw のアップグレードを突き合わせ:アップグレードマトリックスに従う。
  7. JSONL を tail:ログガイドで標準エラー行を相関。
  8. ulimit を検証:巨大モノレポでは fd を使い切ることがある—ulimit を参照。
  9. RCA を公開:影響リージョン(HK/JP/KR/SG/US)と semver エンドポイントを記録。
避ける:plist の ProgramArguments.zshrc 全文を詰め込むこと—レビュアーがセキュリティ後退を妥当に diff できません。

Corepack、pnpm、パッケージマネージャーを起動する MCP エントリポイント

MCP 定義が pnpm dlxyarn node を呼ぶとき、Corepack は一貫して有効である必要があります—対話シェルが完了させるセットアッププロンプトは launchd には見えません。非対話フラグを焼き込み、サービス所有ディレクトリにミラーキャッシュを置けば HKUS のレプリカも同じ振る舞いになります。

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 を参照してください。

一本の Node バイナリで MCP を運用する

OpenClaw · MCP · HK / JP / KR / SG / US