見出し画像

[MCP] 公式ServersにDockerfileがフルラインナップされてた

↓のPRですね。12/21にマージされたようです。

お手軽に独立・再現性のある環境でサーバを動かすことができて良きです。早速試してみたので手順を共有したいと思います。



前提

  • Claude Desktop App がインストール済であること

  • Docker, Git がインストール済であること

# 次のコマンドが実行できればインストールできています
$ docker -v
Docker version XX.X.X, build xxxxxxx

$ git -v
git version X.XX.X
  • 私の環境はM1 Macです

  • 今回は例として、GitHubのMCPサーバーをDockerで起動してみます
    (そもそもDocker利用ということもあり、多少触れる方向けの内容かと)

  • なんかAIくさい文章になってしまった


ちなみに、docker hubにもMCPサーバーの各イメージが上がっています。
docker hubのイメージ使うでOK!という方は、手順1, 2はスキップで大丈夫です。Claude Desktop App起動時にdocker hubから拾ってきてくれます。
(docker hubのイメージはpipelineでpublishされているわけじゃなさそうで、個人的にはちょっと気持ち悪い)



手順1. modelcontextprotocol/servers を clone する

任意のディレクトリで以下のコマンドを実行し、clone します。

# 以下はsshですが、cloneできれば何でも良いです。httpsでもZIPダウンロードでも。
$ git clone git@github.com:modelcontextprotocol/servers.git



手順2. docker build でイメージをビルドしておく

まず、先ほど clone したプロジェクトのルートに移動します。

$ cd {先ほどcloneしたディレクトリ}
# (例) cd /Users/xxxxxx/github/modelcontextprotocol/servers


次に、docker buildコマンドを実行してビルドします。

$ docker build -t mcp/github -f src/github/Dockerfile .

私の環境では次のような出力になります。

Dockerfileの書きっぷりに関する警告が出ていますが、今回の手順とは関係ないため無視します


次のコマンドで結果が出力されればイメージのビルドは成功です。

$ docker image ls | grep mcp/github
mcp/github  latest  4a87669c1583   6 minutes ago   172MB


☕ ちょっと脱線: Dockerfileの中身

ちなみに、ビルドしているのはこちらのDockerfileになります。やっていることは次の通りです。

1. `node:22.12-alpine`という「Node.jsが使えるイメージ」をベースにする
2. ビルドに必要なソースコードなどをローカルからコピーする
3. ビルドする
4. Node.jsが使えるイメージをベースに再構築
 (FROM node:22.12-alpine AS release の箇所)
5. 「3」のビルド結果から、動作に必要なものだけを「4」にコピー

6. 動作に必要な依存パッケージのみインストール

https://github.com/modelcontextprotocol/servers/blob/main/src/github/Dockerfile


抑えておきたいのは「4, 5」のプロセスで、マルチステージビルドと呼ばれるTipsです。これには次のようなメリットがあります。

  • 「ビルドに必要だけど、動作に必要ないもの」は最終イメージに入れない

    • イメージサイズが小さくなり、イメージ管理のしやすさ・デプロイの高速化が図れます

    • 「内容物が最低限=攻撃対象が減る」ため、セキュリティ面でもベストプラクティスとされています

      • (ここが一番AIくさい。箇条書き&一般論&ですます調だから?)


試しにマルチステージビルドを使わないようにしてみたもの(上)
マルチステージビルドを使っているもの(下)
右端のイメージサイズが1.5倍弱になっているのが分かります。


では手順に戻ります。


手順3. Claude Desktop Appに設定を足す

Claude Desktop Appを開きます。

Settingsを押す
Edit Config を押す
MacならFinderが開く


`claude_desktop_config.json`をテキストエディタで編集します。

{}

となっているので、次のようにします。READMEの内容そのままです。

{
  "mcpServers": {
    "github": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "GITHUB_PERSONAL_ACCESS_TOKEN",
        "mcp/github"
      ],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>"
      }
    }
  }
}

<YOUR_TOKEN>の箇所はGitHubから取得したアクセストークンを設定します。アクセストークン取得手順の詳細は割愛しますが、"GitHub アクセストークン"などで検索するとたくさん記事が見つかるかと思います。



手順4. Claude Desktop Appを再起動する

先ほど編集した`claude_desktop_config.json`は起動時に読み込まれるため、再起動します。

✗ボタンだとプロセスが残るため、Quit で閉じます


手順5. 動作確認する

GitHub APIを使ってアクセスするよう指示してみます。以下プロンプト例。

GitHub APIの機能を使い、以下のリポジトリ・ファイルを読み込んでください。

リポジトリ: modelcontextprotocol/servers
パス: /src/github/README.md
このようなダイアログが表示されるため、Allow for This Chat を押して許可します
Claude Desktop AppからのGitHubアクセスに成功しました🎉


☕ ちょっと脱線: Claude Desktop App起動時に何が起きているか

起動時に↓のコマンドが実行されているだけです。「env」は環境変数。

`docker run -i --rm -e GITHUB_PERSONAL_ACCESS_TOKEN mcp/github`
ってことですね


試しに「起動中のコンテナ」を探してみると、ちゃんと見つかります。

$ docker ps | grep mcp/github
c91b677455fd   mcp/github   "node dist/index.js"   3 minutes ago   Up 3 minutes   epic_zhukovsky


Claude Desktop App を閉じるとちゃんとコンテナも削除されます。
(※`--rm`オプションで起動されているため)

$ docker ps | grep mcp/github
# 何も出力されない


おわりに

最近ちょくちょく modelcontextprotocol/servers を触っていますが、割と頻繁にバグに遭遇します。

例えば、Google Driveには「Claude Desktop App上で必ずエラーになる」致命的なバグがありました(コードベースでは修正済みですが、npm packageはまだpublishされていないため、npxを使うとハマります@12/28時点)

今朝も Sequential Thinking をDockerで動かそうとしたらREADMEのコマンドが間違っていたのでちょっとした PR を上げました。


ただ、PRもIssueも溜まりまくっているためしばらく塩漬けになりそうな…

「オレの作ったサーバー載せてくれ!オレ!オレ!」のPR多すぎ感


当リポジトリは実働2名での管理体制に見え、どうやら更新も1週間くらい止まっている状況。。。WorldWideな注目を集めている Model Context Protocol ですが、実態はなんだか色々と心配になるコミュニティでした。


以上です。それではまた。



いいなと思ったら応援しよう!