MCPの実行先とVSCode Remote SSH
検証したZedではMCPがMacで起動し、VSCode Remote SSHではcompute側のruntimeを使えました。LLM導入の開発環境に向け、実行先、PATH、Podmanでの起動を整理します。
使用したエディタと実行先
remote の MCP を使う作業は VSCode Remote SSH、編集は拡張と LSP を切った Zed に分けました。エディタは M1 Mac、推論と MCP は EPYC + Blackwell の compute server に置いています。
検証した環境では、Zed は MCP command を Mac で起動し、VSCode Remote SSH は compute 側で起動しました。実行先と PATH の違いを確認した記録です。
配置の計画と変更
当初の計画
当初は compute に VSCode Server / Zed Remote Server を置き、Mac を thin client にする計画でした。
- VSCode Server または Zed Remote Server を compute 側で動かす
- MCP サーバーも compute 側で起動し、ローカルの runtime をそのまま使う
- Mac はターミナルとブラウザの操作端末にする
現実の構成
Mac の資源も使うため、エディタは Mac に置きました。
- Zed: remote 編集用。拡張(ext)と LSP は切って、純粋なエディタとして使う
- VSCode Remote SSH: MCP が必要なときはこちらを使う
- compute server は推論サーバーと MCP サーバーの実行環境として使う
MCP は compute の uvx、python、コンテナ runtime を使う要件です。
必要な条件です。
- remote 側の PATH とバイナリをそのまま参照できること
- セッション終了時にプロセスがきれいに消えること
- 常駐プロセスを増やしすぎないこと
- 必要なら
podman run --rmで都度起動できること
commandが動くホスト
同じ command 指定でも、起動するホストによって PATH と使える runtime が変わります。
vscode-serverのセットアップ.md では1接続構成とし、runtime を self-contained にする方針でした。MCP も remote subprocess として扱います。
Zedのlocal起動
Zed は .zed/settings.json を remote に置いても、remote の uvx / python を使いませんでした。command は Mac 側で解決されます。
remote に入れた runtime を参照できず、PATH の段階で要件と合いませんでした。
今回の Zed MCP は stdio の local 起動でした。mcp-remote proxy も検討しましたが、使用した構成の SSE 非対応で、remote 接続をそのまま扱えませんでした。
Zed で遭遇した具体的な問題
確認した問題です。
- remote 側に入っている
uvxやserenaが参照されない - ローカルの
uvx経由でserenaを起動しても、compute server 側の PATH を使えない - port forward を張っても、MCP の起動主体がローカルのままなので効果が薄い
- remote 側に新しい LISTEN プロセスはなく、MCP の起動を確認できませんでした
設定場所を変えるだけでは、起動するホストは変わりませんでした。
VSCodeのremote起動
VSCode Remote SSH は拡張ホストが remote で動きます。mcp.servers の command と args が compute の PATH と環境を使いました。
Python / uvx は compute の環境を使い、接続を閉じると MCP subprocess も終了しました。
podman run --rm で必要時にコンテナを起動し、終了時に削除する方式にしました。
実際の挙動(ss -ltnp で確認)
ss -ltnp で compute の users:(("python",pid=xxxx)) の LISTEN を確認しました。VSCode 接続を閉じると消え、remote の subprocess として動くことを確認できました。
Zed の試行では、同じ remote LISTEN は現れませんでした。この違いから client を切り替えました。
最終設計の方向性
MCP は /opt/containers/runtime/mcps/run.sh から起動する方針です。内部で podman run --rm を呼び、依存、volume 範囲、後始末を管理します。
VSCode の MCP command がこの wrapper を呼び、remote subprocess として動かします。セッション終了時の停止と、--rm による削除を組み合わせます。
利用頻度が高い MCP は、SSE + quadlet の常駐も今後の候補です。現在は subprocess を使っています。
用途による使い分け
今回の構成では、compute の runtime を使う要件に VSCode Remote SSH が合いました。Zed の remote 編集だけでは MCP の実行先は変わりませんでした。
MCP は VSCode Remote SSH、編集は Zed(ext/LSP 切り) を使います。LLM導入の開発環境では、podman run --rm と /opt/containers/runtime/mcps/run.sh で実行環境を分ける構成です。
エディタを Mac、MCP を compute に置き、両方の資源を使います。
今後の作業
次は run.sh の引数、環境変数、volume 規約と、VSCode の mcp.servers 設定例を固める予定です。
常駐化は起動回数、初期化コスト、共有 cache が必要かを基準に検討します。
