AutoGen で Filesystem MCP Server を使ってローカルのファイルを触ってみた

# はじめに
## この記事に含まれる内容
- AutoGen から MCP Server にアクセスするためのコード例
    - Filesystem MCP を利用
## サンプルコード
以下のリポジトリに、今回作ったサンプルコードを共有しました。

https://github.com/tokawa-ms/autogen-with-MCP-demo

## AutoGen とは？
AutoGen は、Microsoft が OSS で公開している、自律的に動作したり、人間と一緒に作業したりできるマルチエージェント AI アプリケーションを作成するためのフレームワークです。

詳細は以下のドキュメントをご覧ください。

https://microsoft.github.io/autogen/stable//index.html

## MCP とは？
MCP (Model Context Protocol) は Anthropic が提唱した、アプリケーションがLLMにコンテキストを提供する方法を標準化するオープンプロトコルです。

以下のドキュメントからたどれる先が公式かと思いますので、まずはここらへんを読んでみると良いでしょう。

https://docs.anthropic.com/ja/docs/agents-and-tools/mcp

# 手順
## 事前準備
Windows 環境で AutoGen から Filesystem MCP Server を使うには、以下のセットアップが必要です。

- Python 3.x
- Docker Desktop

また、Python のコーディングも行うので、Visual Studio Code もセットアップしましょう。

## Filesystem MCP Server をセットアップ
基本的には以下のドキュメントの通りです。

https://github.com/docker/mcp-servers/tree/main/src/filesystem

今回は、Docker 経由で MCP を使うので、まずは Docker Container のビルドから。

```cmd
docker build -t mcp/filesystem -f src/filesystem/Dockerfile .
```

## Python の仮想環境を作成
venv で仮想環境を作ってアクティベートしましょう。

```cmd
python -m venv .venv
.venv\Scripts\activate
```

## 必要なパッケージのインストール
以下のパッケージを pip でインストールします。

```cmd
pip install -U "autogen-agentchat" "autogen-ext[openai,azure]"
pip install -U "autogen-ext[mcp]"
pip install python-dotenv
pip install pathlib
```

## .venv の準備
以下のテンプレートに従って、`.venv` ファイルを作ります。
それぞれのプレースホルダーにはいい感じに Azure OpenAI の設定を行ってください。

```.env
AZURE_OPENAI_DEPLOYMENT=your_deployment_name  
AZURE_OPENAI_API_KEY=your_api_key  
AZURE_OPENAI_ENDPOINT=your_endpoint_url  
AZURE_OPENAI_API_VERSION=your_api_version  
AZURE_OPENAI_MODEL=your_model_name 
```

## AutoGen から Filesystem MCP を使うサンプルコード
VS Code で任意の Python ファイルを作って、以下のコードをコピーします。

```main.py
import asyncio
import os
from dotenv import load_dotenv
from pathlib import Path
from autogen_ext.models.openai import AzureOpenAIChatCompletionClient
from autogen_ext.tools.mcp import StdioServerParams, mcp_server_tools
from autogen_agentchat.agents import AssistantAgent
from autogen_core import CancellationToken

# read environment variables from .env file
load_dotenv()

model_client = AzureOpenAIChatCompletionClient(
    azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT"),
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    model=os.getenv("AZURE_OPENAI_MODEL"),
)


# main function to run the agent
async def main() -> None:
    # Set up the MCP server parameters
    # mcp/filesystem is a docker image that runs a filesystem server
    # It mounts the D:/mcpdir directory to /projects/mcpdir in the container
    server_params = StdioServerParams(
        command="docker",
        args=[
            "run",
            "-i",
            "--rm",
            "--mount",
            "type=bind,src=D:/mcpdir,dst=/projects/mcpdir",
            "mcp/filesystem",
            "/projects",
        ],
    )

    # Get all available tools from the server
    tools = await mcp_server_tools(server_params)

    # Create an agent that can use all the tools
    agent = AssistantAgent(
        name="file_manager",
        model_client=model_client,
        tools=tools,
    )

    # Output of the agents is printed to the console
    print(
        # The agent can now use any of the filesystem tools
        await agent.run(
            task="Create a file called /projects/mcpdir/test.txt with some content",
            cancellation_token=CancellationToken(),
        )
    )


# must use asyncio.run to run the main function
# because main() is an async function
if __name__ == "__main__":
    asyncio.run(main())
```

## 実行
以下のコマンドを実行すると、Docker で Filesystem MCP が立ち上がり、マウント先のディレクトリ（今回は D:\mcpdir の中）に test.txt というファイルが出来上がるはずです。

```cmd
python main.py
```

# コードの解説
## MCP への接続設定
今回は、MCP への接続を Stdio (Standard IO) transport で行います。この場合、MCP Server はサブプロセス的な形でローカル環境で起動されることになるのですが、まさにこのサブプロセスの起動設定を AutoGen の ``StdioServerParams`` に設定することで、Python のコードから自動的に連携先の MCP Server が立ち上がってくるという寸法です。

コードとしてはこんな感じ。

```Python
server_params = StdioServerParams(
    command="docker",
    args=[
        "run",
        "-i",
        "--rm",
        "--mount",
        "type=bind,src=D:/mcpdir,dst=/projects/mcpdir",
        "mcp/filesystem",
        "/projects",
    ],
)
```

察しの良い方はお気づきのことと思いますが、これ docker のコンテナ起動コマンドそのまんまですね。
なんかうまく動かんな、というときには、ここに設定してあるコマンドと引数を全部くっつけて、手元の docker 環境で起動してみれば、コマンドが間違ってるかどうかくらいは確認できると思います。

### その他コードの Tips
``await agent.run`` の文をまるっと print で囲ってあげれば、エージェントの実行途中のメッセージが標準出力から出てきます。
これもデバッグに役に立つかも？

# まとめ
AutoGen から、結構シンプルに MCP Server を触れることがこれでわかりました。
今回は Filesystem MCP でローカルにファイルを書き込むところをやりましたが、既に沢山の MCP が公開されていますので、今後いろいろと組み合わせて、面白いことをやりたいなーと思ったりしてます。

# 参考文献

https://microsoft.github.io/autogen/stable//index.html

https://docs.anthropic.com/ja/docs/agents-and-tools/mcp

https://modelcontextprotocol.io/docs/concepts/transports

https://microsoft.github.io/autogen/stable/reference/python/autogen_ext.tools.mcp.html#autogen_ext.tools.mcp.StdioMcpToolAdapter

https://github.com/docker/mcp-servers/tree/main/src/filesystem