AWS MCP Servers の実行環境をコンテナ上に作成してみた

## はじめに

先日公開された AWS MCP Servers を早速触ってみました。
PCのグローバル環境を汚したくなかったので、Dockerの勉強も兼ねてコンテナ上にMCPサーバーの実行環境を作成しました。

公開された MCP サーバーは以下の通りですが、機能が多いので今回は AWS Documentation MCP Server に絞って、 Claude Desktop に接続できるようにセットアップしていきます。
- Core MCP Server
- AWS Documentation MCP Server
- AWS CDK MCP Server
- Amazon Nova Canvas MCP Server
- Amazon Bedrock Knowledge Base Retrieval MCP Server
- Cost Analysis MCP Server

https://awslabs.github.io/mcp/



## 前提
**動作環境**
- Windows 11
- Claude Desktop
- Docker version 27.5.1
- Docker Desktop

## 設定方法
### Dockerイメージの作成
dockerコマンドを実行するためにDocker Desktop を起動しておきます。
イメージを作成するために、まずはDockerfileを作成します。

```docker
# ベースイメージとしてPython 3.12の公式軽量イメージを使用
FROM python:3.12-slim

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# 作業ディレクトリを設定
WORKDIR /app

# uvをインストール
RUN curl -LsSf https://astral.sh/uv/install.sh | sh

# PATHを通す
ENV PATH="/root/.cargo/bin:${PATH}"

# コンテナ起動時のコマンド
CMD ["python"]
```
UVX の実行環境があればAWS Documentation MCP Server は動作するので、コンテナイメージは UVX をインストールするだけにし、後ほどクライアント側の設定で、MCPサーバーのインストール・実行を行います。

Dockerfileを任意のディレクトリに用意したら、`docker build` コマンドを実行します

```bash
docker build -t uv-container .
```

ビルドが完了したら `docker images` で確認します。

```bash
$ docker images                                              
REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
uv-container                latest    102d6ec278c1   21 hours ago   250MB
mcp/perplexity-ask          latest    b300cde36ebd   3 weeks ago    233MB
```
先日作成したperplexityのMCPサーバーも表示されています。

ここまで出来たらDocker側の準備は完了です。

### クライアント側の設定
次に、Claude Desktop から `claude_desktop_config.json`を編集してクライアント側の設定を行います。

画面左上のハンバーガーメニューから `ファイル > 設定` を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/c26a2350-c830-46eb-ad3e-76e00ea2ba5e.png)

開発者タブから `構成を編集` を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/b283bd72-6cc3-44e4-b81d-47d0e02cecd5.png)

エクスプローラーが立ち上がるので `claude_desktop_config.json` を選択し、VScode で開いて編集を行います。

```json
{
  "mcpServers": {
    "awslabs.aws-documentation-mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "uv-container",
        "bash",
        "-c",
        "/root/.local/bin/uvx awslabs.aws-documentation-mcp-server@latest"
      ],
      "env": {
        "FASTMCP_LOG_LEVEL": "ERROR"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}
```

ツールを呼び出すと、`docker run`でコンテナが起動し、`uvx awslabs.aws-documentation-mcp-server@latest`が実行されるように設定します。

ちなみに`uvx` コマンドのPATHがクライアント側からの呼び出し時に上手く解決しなかったので、execでコンテナに入って`uvx`のパスを確認し、フルパスでコマンドを実行するようにしました。

`claude_desktop_config.json` の編集が完了したら、Claude Desktopのハンバーガーメニューから `ファイル > 終了` を実行して、再度起動します。
ただウィンドウを閉じただけでは設定が反映されないので注意してください。

設定が反映されると、いつもの画面にトンカチのマークが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/10c290e2-090f-419e-9c5c-ba239dd3ef4b.png)

中を確認すると、3つの機能に分かれていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/28a8488d-7804-4280-a73e-a81779916fb3.png)

ツールの説明文をClaudeに翻訳・要約させました。

---
**read_documentation**
- AWS ドキュメントページを取得してマークダウン形式に変換するツール
- docs.aws.amazon.com ドメインの .html で終わる URL のみ使用可能
- 長文書の場合は start_index を変更して複数回呼び出すことで全体を取得可能
- 出力はマークダウン形式で見出し、コードブロック、リスト、表などが保持される

**recommend**
- AWS ドキュメントページの関連コンテンツを推薦するツール
- 推薦タイプ：高評価、新規、類似、ジャーニー（次によく閲覧されるページ）
- 新機能を見つけるには、サービスのウェルカムページURLを使用し「新規」推薦を確認
- 各推薦には URL、タイトル、コンテキスト（利用可能な場合）が含まれる

**search_documentation**
- AWS 公式ドキュメント検索 API を使用して検索するツール
- 検索のコツ：具体的な専門用語の使用、サービス名の含有、引用符による完全一致検索
- 結果には関連性ランク、URL、タイトル、コンテキストが含まれる
---

ひとつずつ試してみます。

### read_documentation
指定したURLを読み込んでMarkdownに変換してくれました。コンテキストに含ませたいAWSドキュメントをこちらで指定したいときに非常に便利そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/7300ec2b-27ef-4e14-b4b9-9c7efeb25c22.png)

### recommend
使うまでよくわからなかった機能ですが、AWSドキュメントのURLを指定すると関連するドキュメントを推薦してくれる機能のようです。初めて触るサービスで、関連情報を集めたいときに良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/04a043b6-dc8e-4c07-b516-cc27e64c06a2.png)

### search_documentation
AWS関連の情報について調査を依頼すると自動的に使用されます。
`serch_documentation`を使用する場合は`read_documentation`も組み合わせてコンテキストを拡充しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/123065cd-078e-4162-9c25-2e1246607041.png)

公式ドキュメントをこれでもかとコンテキストにふくんでいるので、リッチな仕上がり。指示通りベストプラクティスに則った構成と構築手順を示してくれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3236402/47aee4df-50fa-4474-a214-3328248876d2.png)

## AWS Documentation MCP Serverについての所感
AWS Documentation MCP Server を触ってみましたが、普段使っているClaudeをAWS関連の調査用にチューニングできる良い機能だと思いました。

個人的な要望としては`search_documentation`参照したドキュメントのリンクも一緒に出力してくれると、問いあわせ対応時の技術的な根拠を提示するのが非常に楽になるので、今後のアップデートで欲しい機能です。
そのため、AWSドキュメントの索引的な使い道としてはまだまだAmazon Qを手放せなさそうです。

あとは普通に調査を依頼するとかなり長文で出力されるので、ピンポイントで知りたい部分を出力させるにはプロンプトの工夫が必要そうです。

## まとめ
実際に実装してみることで、MCPについて少しだけ理解できたと思います。
また初めてDockerfileを書いたので、コンテナについても勉強になりました。

今回初めてQiitaにブログを書いてみましたが、生成AI関連はこれからもどんどん話題が出ているので、また自分で何かを試してみたら書いてみようと思います。