はじめに
最近、Anthropicが発表した MCP (Model Context Protocol) が話題ですね。
Claude DesktopなどのAIクライアントが、ローカルのツールやデータベースに標準的な方法で接続できるプロトコルです。
しかし、MCPサーバー(ツール側)を試そうとすると、こんな悩みに直面しませんか?
- 「Pythonのバージョンが合わない...」
- 「依存ライブラリを入れたらローカル環境が汚れた...」
- 「AIにローカルコマンドを実行させるのがセキュリティ的に怖い...」
そこで登場するのが Docker です。
Docker社もMCPを推進しており、MCPサーバーをコンテナ化して動かすアプローチが推奨され始めています。
本記事では、Dockerを使って、環境を汚さずに安全にMCPサーバーを動かす方法を解説します。
DockerでMCPを動かすメリット
通常、MCPサーバーはローカルのプロセスとして uv run や npm start で起動しますが、Dockerを使うと以下のメリットがあります。
- 環境分離: ローカルにPythonやNode.jsの特定バージョンを入れる必要がない。
- セキュリティ: AIが実行できる範囲をコンテナ内に閉じ込められる(ファイルアクセス制限など)。
-
配布が楽:
docker pullするだけでツールが使える。
前提条件
- Docker Desktopがインストールされていること
- Claude Desktopアプリがインストールされていること
手順:Docker版 MCPサーバーの設定
Claude Desktopは設定ファイル (claude_desktop_config.json) にコマンドを記述することでMCPサーバーと通信します。
ここで docker run コマンドを指定するのがポイントです。
1. 設定ファイルを開く
以下のパスにある設定ファイルをエディタで開きます。
-
Win:
%APPDATA%\Claude\claude_desktop_config.json -
Mac:
~/Library/Application Support/Claude/claude_desktop_config.json
2. Docker経由で実行する設定を記述
例として、SQLiteデータベースを操作するMCPサーバーをDockerで動かす設定です。
{
"mcpServers": {
"sqlite-docker": {
"command": "docker",
"args": [
"run",
"-i", // 重要: 標準入力を対話的にする
"--rm", // 終了時にコンテナを削除
"-v", "c:/workspace/data:/data", // 必要なデータだけマウント
"mcp/sqlite", // Dockerイメージ名(例)
"--db-path", "/data/my-db.sqlite"
]
}
}
}
ポイント:
-
commandをdockerにします。 -
-i(interactive) フラグが必須です。MCPは標準入出力(stdio)を使ってAIと通信するため、これがないと動きません。 -
-v(volume) で、AIに触らせたいディレクトリだけをマウントします。これにより、PC内の他のファイルを勝手に覗かれるリスクを排除できます。
実践:自作MCPサーバーをDocker化する
自分で作ったツール(Node.js/Python)をDocker化する場合も簡単です。
Dockerfileの例 (Node.js)
FROM node:18-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
# MCPはstdioを使うので、余計なログが出ないように注意する
CMD ["node", "index.js"]
Claude側の設定
"my-custom-tool": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"my-mcp-image:latest"
]
}
これだけで、ローカル環境に一切依存せず、自作ツールをClaudeから呼び出せるようになります。
まとめ:DockerこそMCPのベストパートナー
MCPは強力ですが、「AIにローカルマシンの操作権限を与える」ことと同義になりがちです。
Dockerを挟むことで、「サンドボックス化された安全なAIエージェント」 を簡単に構築できます。
Docker Desktopのエラーと戦った後は、ぜひこの「Docker × MCP」の快適さを体験してみてください!