MCPサーバーを安全に動かすための工夫
現在普及しているStdioServerTransport型MCPサーバーの使用方法は設定ファイルにnpxやuvxコマンドを記述する。これはその場でダウンロードしたスクリプトファイルを実行することを意味する。

しかしこの実行方式は開発者には悪名高いソフトウェアのインストール手順「curlしてbash(URLでダウンロードしてきたシェルスクリプトをパイプしてノールック実行)」を思い出させる。「curlしてbash」なら単一の信頼した配布元を基準に判断できるがnpxやuvx方式は依存するライブラリも芋づる式に参照してくる。つまり任意のコードをどこかの経路(MCPサーバー本体でなくその内部の別の依存ライブラリかもしれない)を通じて実行される可能性は残る。
これに対して、Claude Desktopが「今から実行するサーバー起動コマンドについて安全かどうか」を事前に確認してくれるわけでもない。MCPセキュリティの話題は“面白”優先でプロンプトインジェクション方面(ツール定義を操作してLLMを罠に落とすような手法)に偏りがちだが、それ以前にこの実行方式にも問題がある。

また多くのMCPサーバーの実装にも問題があり、Equixly社のセキュリティ評価によると、テストされたMCPサーバーに、コマンドインジェクション(43%)、パストラバーサル(22%)、SSRF(30%)などの脆弱性が存在した。LLM以外の外部からくる入力値に対しても脆弱なMCPサーバーが散見される。

MCPにはRootsというパスベースでアクセスを管理できる、いかにも安全に配慮した仕様があるが、現実としてはMCPクライアント側が対応していない。Claude Desktopですら未実装だ。

現時点のより安全なMCPサーバー
なので著者としてはより安全なMCPサーバーの実行方法を求めている。MCPサーバーのサンプルには、PythonやTypeScriptだけでなく、Brave Search MCP Serverなど`docker run (Docker Hub)`を経由して実行するものもある。これはコンテナを起動してその中で実行するため、直接プログラムをローカル実行するよりは安全だ。
さらにMCPサーバーの実行にDenoを通すことで、ユーザー側がスクリプトにパーミッションを付与できる。このMCPサーバーがネットワークやディスクにアクセスしないと判断した場合、その権限を削ればよい。ホワイトリストで許可するドメインを指定すれば機密情報の外部送信のシナリオも防ぐことができる。
MCPことはじめ / MCPサーバーのセキュリティリスク では以下のように説明されている。
つまり、第三者が作成したMCPサーバーを利用しようとする際、Denoで実行するようにして、そのMCPサーバーが必要とするであろう最小限の権限のみを与えるようにセットアップすれば、万が一そのサーバーが良からぬ動きをしようとしたとしてもそれを防ぐことができます。
https://findy-code.io/media/articles/modoku20250404-yusuktan
Denoでスクリプトを書き、ユーザーがmcp.configに記述する設定では、以下のようにdocker run以下でJSRなどにデプロイしたDenoスクリプトのURLを指定する。これをMCP対応のエージェントに設定して利用できる。

ここに例を書いた

加えて、VSCodeは、GitHub Actionsのsecretsのようなインターフェイスでクレデンシャルをベタ書きせず、外部に保存する仕組みがあるため、勧めやすい。

ローカルリソース依存のMCPサーバーの課題
しかしトレードオフもあって、実行環境(ローカル)のリソースを使うようなMCPサーバーは、そのままではコンテナ化すると動かなくなる。日やタイムラインに登場する元気にバズって、派手なデモを持つMCPサーバーたちは、大抵そのような要件になっていることが多い。大いなる力には大いなる責任が伴う、ってやつよ。
例えばObsidian MCPサーバーのようにローカルのファイルを読み込むものは、別途コンテナにパスをマウントしてサーバーから読み込めるように必要がある。この程度なら特に手間ってほどではない(Dockerユーザーには)。
他にはデスクトップアプリケーションやデバイスを制御するMCPサーバーは、ユーザーのマシンでネイティブにプログラムを実行したいはずであり、コンテナ経由で動かすのは無理がある。unity-mcpはユーザーのデスクトップで動作するUnityエディタにソケット接続し、スクリプトを操作する。
そしてTypeScript以外で書かれた既存のMCPサーバーをそのまま使うこともできない。せめてdocker runでラップすることをお勧めする。
MCPサーバーの未来
ただ全員がStdioServerTransport型のMCPサーバーを動かす時代は、今の過渡期だけだろう。逆に言えば、実装を楽にするために、現在はローカルでユーザーPCを危険に晒す必要のないプログラムまで動いている。
新仕様ではHTTPでリモートかつ複数クライアントをさばく使い方ができ、SDKの開発も進んでいる。Cloudflareはマイグレーション用のプロキシモジュールまで用意している。
モバイルアプリのMCPクライアントやサーバー間呼び出し、Google主導のエージェント間呼び出し仕様のA2Aなどもあり、状況はまだ変わるだろう。
