15 既存MCPサーバーとの連携 - HiroyukiMakita/mcp-server-tutorial GitHub Wiki

15. 既存MCPサーバーとの連携

MCPの強力な特徴の一つは、複数のMCPサーバーが連携して、より複雑なタスクを実行できる点です。 例えば、あるMCPサーバーがファイルシステムを操作するツールを提供し、別のMCPサーバーが特定のAPIと通信するツールを提供する場合、これらを組み合わせて利用することができます。

このセクションでは、作成した weather-server が、他の既存MCPサーバー(例えば、ファイルシステムアクセス機能を提供するサーバーや、ユーザー設定を管理するサーバーなど)とどのように連携できるか、その基本的な考え方と理論的な例について説明します。

連携の基本的な考え方

MCPサーバー間の直接的な通信は一般的ではありません。通常、連携はMCPクライアント(RooのようなAIエージェント)を介して行われます。 クライアントは、あるタスクを実行するために、複数の異なるMCPサーバーから提供されるツールを順番に、あるいは条件に応じて呼び出します。

連携のパターン例:

  1. データフロー:
    • クライアントがサーバーAのツールを呼び出し、結果(データ)を取得する。
    • クライアントが、サーバーAから得た結果の一部または全部を、サーバーBのツールの入力として渡して呼び出す。
  2. 条件分岐:
    • クライアントがサーバーAのツールを呼び出し、その結果に基づいて次に呼び出すツール(サーバーBのツールか、サーバーCのツールか)を決定する。
  3. 設定の外部化:
    • サーバーA(例: 設定管理サーバー)が特定の設定情報(APIキー、ユーザーの好みなど)を提供する。
    • サーバーB(例: 今回作成した weather-server)が、起動時やツール実行時に、クライアント経由でサーバーAから設定情報を取得して利用する。

weather-server と他のサーバーとの連携シナリオ例 (理論)

シナリオ1: ファイルシステムサーバーから都市リストを読み込む

  • 登場するサーバー:
    • filesystem-server: ローカルファイルの読み書き機能を提供するMCPサーバー(仮)。
    • weather-server: 今回作成した天気情報サーバー。
  • 連携の流れ:
    1. クライアントが filesystem-serverread_file ツールを呼び出し、特定のファイル(例: favorite_cities.txt)の内容(都市名のリスト)を読み込む。
    2. クライアントが favorite_cities.txt から都市名を一つずつ取り出す。
    3. クライアントが各都市名について weather-serverget_current_weather ツールを呼び出し、天気情報を取得・表示する。

このシナリオでは、weather-server 自体はファイルシステムサーバーの存在を意識する必要はありません。クライアントが両者を仲介します。

シナリオ2: ユーザー設定サーバーからデフォルト都市を取得する

  • 登場するサーバー:

    • user-settings-server: ユーザーの個人設定(デフォルトの都市、好みの単位系など)を管理するMCPサーバー(仮)。
    • weather-server: 天気情報サーバー。
  • 連携の流れ (ツール実行時):

    1. クライアントが weather-serverget_current_weather ツールを呼び出す際、都市名を指定しない(または特別なキーワードを指定する)。
    2. weather-server のツールロジック内で、もし都市名が指定されていなければ、クライアントに対して「デフォルト都市を取得してください」という中間リクエストを(間接的に)行うか、あるいはクライアントが事前に user-settings-server からデフォルト都市を取得しておき、それを get_current_weather の入力として渡す。
    • より直接的な連携 (高度): もしMCPプロトコルやSDKがサーバー間連携をサポートするような高度な機能を将来的に持つ場合、weather-server が直接 user-settings-server のリソースにアクセスすることも考えられますが、現状の基本的なMCPの考え方ではクライアントが仲介役となります。
  • 連携の流れ (サーバー設定時):

    • weather-servermcp_settings.json での起動設定時に、user-settings-server から取得した情報を環境変数として渡すように、クライアントまたはセットアップスクリプトが設定する。

シナリオ3: 天気情報をファイルに保存する

  • 登場するサーバー:
    • weather-server: 天気情報サーバー。
    • filesystem-server: ファイルシステムサーバー。
  • 連携の流れ:
    1. クライアントが weather-serverget_forecast ツールを呼び出し、天気予報データを取得する。
    2. クライアントが取得した予報データ(JSON文字列など)を、filesystem-serverwrite_file ツールの入力として渡し、指定したファイルパスに保存する。

実装上の考慮点

  • ツールの粒度: ツールを設計する際には、他のツールと連携しやすいように、単一責任の原則を意識し、入出力を明確に定義することが重要です。
  • データの形式: サーバー間でデータをやり取りする場合、JSONのような標準的でパースしやすい形式を使用するのが一般的です。
  • クライアントの役割: 上記の例の多くは、クライアントがオーケストレーターとしての役割を担います。AIエージェントは、このような複数のツールを組み合わせる能力を持つことが期待されます。

このチュートリアルで作成する weather-server は単体でも動作しますが、MCPのエコシステム全体で考えると、他のサーバーと連携することでさらに強力な機能を実現できる可能性を秘めています。