MCPをDockerで実行するとやばいぐらい簡単（クリスマスイブでも通常運転🎄🎄🎄）

今日見つけたブログです。

The Model Context Protocol: Simplifying Building AI apps with Anthropic Claude Desktop and Docker

https://www.docker.com/ja-jp/blog/the-model-context-protocol-simplifying-building-ai-apps-with-anthropic-claude-desktop-and-docker/

MCPはAnthropicがOSSで公開した生成AIツールの仕様（？）で、Claude.aiのデスクトップアプリから利用可能です。

リファレンス実装も公開されているのですが、MacやLinuxを前提としているのか、Windowsでは動かない部分がありました。

:::note
こちらの手順に従えば動きます

https://note.com/doerstokyo_kb/n/nd1c8f888038a
:::

ここで冒頭のブログにつながるのですが、Dockerさえあれば、OSが違っても同じように動きます。（Windows以外やってないけど）

Dockerそのままでやってもいいのですが、前々から気になっていた[Finch](https://github.com/runfinch/finch)を使ってみました。

## Finchとは？

FinchはAWSが開発しているオープンソースのコンテナ開発環境です。

![github.com_runfinch_finch_blob_main_README.md.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/3b5c55b3-7397-2c3b-32c8-cfb87a7aaf7a.png)

可愛いアイコンが素敵です。

基本的にはDockerと同じように使える感じです。

## Finchのインストール

インストーラーをダウンロードしてウィザードに従うだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f76bb3e3-2b99-7918-1f16-74e1e943360d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a24efbfc-6bdf-844b-ab29-7980ec911bc0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/395d77fc-45f3-4b0f-71f4-b364b8d1520f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/bcd5aa8b-02e9-46f6-3fae-9417332d66b8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a2fbeb62-13dd-f332-fbf1-2b22feb9f723.png)

## Finchの初期設定

FinchにはGUIは用意されていないので、コマンドで実行します。
VMを準備します。

```cmd
finch vm init
```

```
time="2024-12-24T20:43:54+09:00" level=info msg="attaching disk at path: C:\\Users\\******\\AppData\\Local\\.finch\\.disks\\6b456cb759bdbc3f.vhdx"
time="2024-12-24T20:43:56+09:00" level=info msg="Initializing and starting Finch virtual machine..."
time="2024-12-24T20:45:21+09:00" level=warning msg="Finch on Windows uses WSL, which mounts the C Drive in read-write mode by default. To run finch with more restricted access, follow https://runfinch.com/docs/managing-finch/windows/wsl-configuration/"
time="2024-12-24T20:45:21+09:00" level=info msg="Finch virtual machine started successfully"
```

Finch virtual machineが起動しました。WSLのディストリビューションとして`lima-finch`が追加されます。

```cmd
wsl --list
```

```
Ubuntu-20.04 (既定)
Ubuntu-22.04
lima-finch
```

:::note
PC再起動後などは、以下のコマンドでFinchのVMを起動する必要があります。

```shell
finch vm start
```

:::

これで初期設定は完了です。コンテナを一つ起動してみましょう。

```cmd
finch run --rm public.ecr.aws/finch/hello-finch
```
```

                            @@@@@@@@@@@@@@@@@@@
                        @@@@@@@@@@@@    @@@@@@@@@@@
                      @@@@@@@                  @@@@@@@
                    @@@@@@                        @@@@@@
                  @@@@@@                            @@@@@
                 @@@@@                      @@@#     @@@@@@@@@
                @@@@@                     @@   @@@       @@@@@@@@@@
                @@@@%                     @     @@            @@@@@@@@@@@
                @@@@                                               @@@@@@@@
                @@@@                                         @@@@@@@@@@@&
                @@@@@                                  &@@@@@@@@@@@
                 @@@@@                               @@@@@@@@
                  @@@@@                            @@@@@(
                   @@@@@@                        @@@@@@
                     @@@@@@@                  @@@@@@@
                        @@@@@@@@@@@@@@@@@@@@@@@@@@
                            @@@@@@@@@@@@@@@@@@


Hello from Finch!

Visit us @ github.com/runfinch
```

**なんか出た！！**

## Docker Hubで公開されているMCPのコンテナイメージ

Docker HubにMCPネームスペースが登場しています。

https://hub.docker.com/u/mcp

2024/12/24時点で以下のイメージが登録されています。

* mcp/aws-kb-retrieval-server
* mcp/brave-search
* mcp/everart
* mcp/everything
* mcp/fetch
* mcp/filesystem
* mcp/git
* mcp/github
* mcp/gitlab
* mcp/gdrive
* mcp/google-maps
* mcp/memory
* mcp/postgres
* mcp/puppeteer
* mcp/sentry
* mcp/sequentialthinking
* mcp/slack
* mcp/sqlite
* mcp/time

:::note
[Model Context Protocol serversのGitHubリポジトリ](https://github.com/docker/mcp-servers)にあるReference Serversがすべて登録されています。
:::

## Claude.aiデスクトップアプリにMCPの設定を行う

1. Claude.aiのデスクトップアプリを起動します

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0d6574a5-0ddb-8896-c23b-8351ad7eabbb.png)

1. 「File」メニューの「Settings」を選択します

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5c0f7a84-458a-cb1c-0027-097f7fc2d3e3.png)

1. 「Edit Config」をクリックします

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/763c4268-d57c-b6a4-4378-9d3e75a60e95.png)

1. エクスプローラーが起動し、`claude_desktop_config.json`が選択された状態になると思いますので、`claude_desktop_config.json`を開きます
    
    ```json:claude_desktop_config.json（編集前）
    {
      "globalShortcut": "Alt+Ctrl+Space"
    }
    ```

1. [こちら](https://github.com/docker/mcp-servers/tree/main/src/brave-search)を参考にBrave Searchの設定を追加します
    * `command`が「finch」になってます
    * 「YOUR_API_KEY_HERE」は実際のAPIキーに変更します

    ```diff_json
      {
        "globalShortcut": "Alt+Ctrl+Space",
    +   "mcpServers": {
    +     "brave-search": {
    +       "command": "finch",
    +       "args": [
    +         "run",
    +         "-i",
    +         "--rm",
    +         "-e",
    +         "BRAVE_API_KEY",
    +         "mcp/brave-search"
    +       ],
    +       "env": {
    +         "BRAVE_API_KEY": "YOUR_API_KEY_HERE"
    +       }
    +     }
    +   }
      }
    ```

1. 設定完了後、一度Claude.aiのデスクトップアプリを終了します
    （タスクバーに常駐しているアイコンから一旦終了します）

1. 再度アプリを起動すると、カナヅチ（？）アイコンが表示されます

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/004c77c4-7e4b-1fbb-ccab-00e11da9f8d1.png)

    クリックすると、MCPツールとして追加した「brave_local_search」と「brave_web_search」が表示されます
    
    ※brave-searchのMCPサーバーにはツールが２つ含まれています

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/79b2871e-3d49-6320-122e-cb3452a4e6bc.png)

## Brave検索を使ってみよう

「Amazon Novaについて検索して、Anthropicのモデルとの違いを教えて」と入力してみます。
MCPツールを使用する際に同意を求めるダイアログが表示されます。

:::note
このあたり、セキュリティを意識してる感じがして好感が持てますね
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/d2ad2b52-b148-8485-2f38-19c5b4fe8db8.png)

検索して回答を生成してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/ac3d7254-34d9-55be-043d-b6bace197726.png)

:::note
検索に使ったクエリーも確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/7d64bc46-6e72-9988-a0cd-2383be659654.png)
:::

おーすごい！！！

---

なんですが、意外と使いづらいですww

先程の質問ですが、わざと **「検索して」** と入れて実行してまして、この文言を除くとMCPツールは使わずに生成AIの知ってることだけで回答しようとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f512d025-f39a-391c-7ad4-798e3f884f98.png)

ザ・ハルシネーション

まだまだプロンプト力が求められますね。

1. *****を検索して
1. xxxxxを検索して
1. 検索した結果からzzzzzについて教えて

みたいに指示する必要がありそうです。