話題のMCPをwatsonx Orchestrateで試してみる

## MCPとは？
MCP(Model Context Protocol)という言葉を目にすることが多くなってきました。MCPは昨年Anthoropicが発表してそのオープンソース化された、生成AIが外部の様々なデータソース、ツールとやりとりするための標準プロトコルです。MCPサーバーのサンプルは[こちら](https://modelcontextprotocol.io/examples)にも公開されており、例えば、FileSystemMCPServerと連携することで、ファイルのリストを取得することが出来たり、TimeMCPServerと連携することで現在時刻を取得出来たりします。

この記事では、実際にこれらのサーバーとwatsonx Orchestrateの連携方法について説明します。
## watsonx OrchestrateのMCP対応状況
watsonx Orchestrateではversion1.2.0よりtoolkitsという形でMCPのサポートが追加されました。コマンドでMCPサーバーを追加することで、nodeベースのMCPサーバーをwatsonx Orchestrate Developer Edition上で動作させ、Toolと連携することが可能です。MCPサーバーの実装は大きく分けてDockerベースのものとnodeベースのものがありますが、現時点ではnodeベースのローカル・サーバーのみサポートします。今後Dockerベースのものや、リモートのMCPサーバーも対応予定の様です。

## MCPサーバーとの連携方法
では初めに、最もシンプルな[Time MCP Server](https://github.com/modelcontextprotocol/servers/tree/main/src/time)を用いてコマンドの使い方と実際の動作を確認してみましょう。以下のコマンドでtimeという名前のToolkitを作成してMCPサーバーと連携することが可能です。なお、MCPサーバーはtoolkitが動作するコンテナ上で稼働するようです。
コマンド詳細については[こちら](https://developer.watson-orchestrate.ibm.com/tools/toolkits)を参照してください。

```
orchestrate toolkits import --kind mcp --name time --description "Time functions"  --command "npx -y time-mcp"  --tools "*"  --package-root time-mcp
```
コマンドが正常に実行されると、AgentBuilder上で以下の様にtimeというprefixが付いた形で利用可能なツールがリストされるので、選択することで利用可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/8c529f91-096a-4bb7-9c5d-9080682bf88c.png)
チャット画面から動作を試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/5c8618be-7a01-4e82-ba97-cb3617f5d481.png)


MCPサーバー経由でToolが呼び出されて返答が来ました。タイムゾーンは正しく"Asisa/Dubai"に設定されていることが分かります。

なお、インポートしたToolkitの削除は以下のコマンドで実行可能です。
```
orchestrate toolkits remove -n toolkit_name
```
## 起動時のenvの割り当て方法
MCPサーバーによっては、起動時に環境変数を割り当ててあげる必要があります。
watsonx OrchestrateではConnectionsという仕組みを使って変数の割り当て、管理が可能です。
例えば、Github MCP Serverでは、実行時にGithubのトークンを以下の様に設定する必要があります。
```
GITHUB_PERSONAL_ACCESS_TOKEN=your_token
```
これをwatsonx Orchestrateで設定するには以下のようなコマンドを用います。
key_value型のConnectionを作成して、-eで変数を指定します。
```
orchestrate connections add --app-id "github"
orchestrate connections configure --app-id github --env draft --kind key_value --type team
orchestrate connections set-credentials --app-id "github" --env draft -e GITHUB_PERSONAL_ACCESS_TOKEN=your_token
orchestrate toolkits import --kind mcp --name githubmcp --description "github tools" --command "npx -y @modelcontextprotocol/server-github" --tools "*" --package-root mcp-github --app-id github
```
実際にチャットからissueを作成することができました。今回は英語で会話しています。Toolに引数が多い場合には会話が長くなりがちなので、プロンプトでデフォルト値を設定する、あるいは、良く使うパラメータのみのToolを公開するといった方法が考えられます。この辺りは汎用的な仕組みを作るのか、特定の作業に特化したものにするのか、Agentの設計に依存する領域と思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/c806a6e3-d5b1-494c-850f-1a0d74675546.png)

## その他のMCPServer
[filesystem MCP Server](https://www.npmjs.com/package/@modelcontextprotocol/server-filesystem)というファイルシステムにアクセスできるMCPサーバーがあったので試してみました。残念ながらwatsonx Orchestrateから使用するとサーバーのコンテナ内のファイルを見る感じになるので実用性はないがデモとしては使えるかもしれません。

以下コマンドで導入可能です。コマンドの第3引数以降は、アクセスを許可するフォルダになります。
```
orchestrate toolkits import --kind mcp --name filesystem --description "Deals with filesystem" --command "npx -y @modelcontextprotocol/server-filesystem /usr/tmp" --tools "*"  --package-root filesystem-mcp
```

## まとめ
この記事ではwatsonx OrchestrateからMCPサーバーに接続する方法について説明しました。これまでは個別にOpenAPI定義を作成したり、読み込んでいたりしましたが、MCPを用いることで、格段に簡単に接続することができるようになりました。今後は様々なパッケージやアプリケーションがMCPに対応し、生成AIとの連携が進むでしょう。
一方で、接続自体は簡単にできても、AIAgentが正しくそのToolを活用できるかは、LLMに対する指示や、Toolやパラメータの説明が利用するユースケースに適したものになっている必要があることを再認識できました。
watsonx Orchestrateでは、ノーコードでビジネス・ユーザーがAgentに対する指示を指定したり、ADKを用いてToolを簡単にカスタマイズできるので、そのあたりはありがたい機能かもしれません。