MCPサーバーを安全に動かすための工夫

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

https://code.visualstudio.com/docs/copilot/chat/mcp-servers

​しかしこの実行方式は開発者には悪名高いソフトウェアのインストール手順「curlしてbash(URLでダウンロードしてきたシェルスクリプトをパイプしてノールック実行)」を思い出させる。「curlしてbash」なら単一の信頼した配布元を基準に判断できるがnpxやuvx方式は依存するライブラリも芋づる式に参照してくる。つまり任意のコードをどこかの経路(MCPサーバー本体でなくその内部の別の依存ライブラリかもしれない)を通じて実行される可能性は残る。

curl | bash a victimless crime?
It’s a common sight for systems administrators and developers these days:

これに対して、Claude Desktopが「今から実行するサーバー起動コマンドについて安全かどうか」を事前に確認してくれるわけでもない。MCPセキュリティの話題は“面白”優先でプロンプトインジェクション方面(ツール定義を操作してLLMを罠に落とすような手法)に偏りがちだが、それ以前にこの実行方式にも問題がある。

Model Context Protocol has prompt injection security problems
As more people start hacking around with implementations of MCP (the Model Context Protocol, a new standard for making tools available to LLM-powered systems) the security implications of tools built …

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

MCP Servers: The New Security Nightmare
Exploring the rise of command injection vulnerabilities in Model Context Protocol (MCP) servers in 2025. This security analysis reveals how modern AI integration technologies are reintroducing dangerous RCE vulnerabilities. Includes vulnerability breakdown, vendor response analysis, and practical mitigation strategies.

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

https://modelcontextprotocol.io/clients

現時点のより安全な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対応のエージェントに設定して利用できる。

ここに例を書いた

SETUP: docker build -t mcp-server-fetch:latest .
SETUP: docker build -t mcp-server-fetch:latest . GitHub Gist: instantly share code, notes, and snippets.

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

https://code.visualstudio.com/docs/copilot/chat/mcp-servers

ローカルリソース依存のMCPサーバーの課題

しかしトレードオフもあって、実行環境(ローカル)のリソースを使うようなMCPサーバーは、そのままではコンテナ化すると動かなくなる。日やタイムラインに登場する元気にバズって、派手なデモを持つMCPサーバーたちは、大抵そのような要件になっていることが多い。大いなる力には大いなる責任が伴う、ってやつよ。

例えばObsidian MCPサーバーのようにローカルのファイルを読み込むものは、別途コンテナにパスをマウントしてサーバーから読み込めるように必要がある。この程度なら特に手間ってほどではない(Dockerユーザーには)。

他にはデスクトップアプリケーションやデバイスを制御するMCPサーバーは、ユーザーのマシンでネイティブにプログラムを実行したいはずであり、コンテナ経由で動かすのは無理がある。unity-mcpはユーザーのデスクトップで動作するUnityエディタにソケット接続し、スクリプトを操作する。

GitHub - justinpbarnett/unity-mcp: A Unity MCP server that allows MCP clients like Claude Desktop or Cursor to perform Unity Editor actions.
A Unity MCP server that allows MCP clients like Claude Desktop or Cursor to perform Unity Editor actions. - justinpbarnett/unity-mcp

そしてTypeScript以外で書かれた既存のMCPサーバーをそのまま使うこともできない。せめてdocker runでラップすることをお勧めする。

MCPサーバーの未来

ただ全員がStdioServerTransport型のMCPサーバーを動かす時代は、今の過渡期だけだろう。逆に言えば、実装を楽にするために、現在はローカルでユーザーPCを危険に晒す必要のないプログラムまで動いている。

新仕様ではHTTPでリモートかつ複数クライアントをさばく使い方ができ、SDKの開発も進んでいる。Cloudflareはマイグレーション用のプロキシモジュールまで用意している

Transports - Model Context Protocol

モバイルアプリのMCPクライアントやサーバー間呼び出し、Google主導のエージェント間呼び出し仕様のA2Aなどもあり、状況はまだ変わるだろう。

Announcing the Agent2Agent Protocol (A2A)- Google Developers Blog
Explore A2A, Google’s new open protocol empowering developers to build interoperable AI solutions.

Subscribe to laiso

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe