# MCP over MQTT アーキテクチャ

MCP over MQTT は、標準のMCPアーキテクチャ（Host、Client、Server）のコアコンセプトを継承しつつ、トランスポート層として中央集権型のMQTT ブローカーを導入しています。ブローカーはメッセージのルーティング、サービスの登録と検出、認証および認可を可能にします。

このアーキテクチャは、MCPの元々のコンテキストインタラクションモデルを維持しつつ、MQTTの軽量で広く適用可能な設計を活用し、IoTやエッジコンピューティングのシナリオにおける多対多通信、ロードバランシング、スケーラビリティの基盤を提供します。

## MQTT トランスポートのコアコンポーネント

MCP over MQTT アーキテクチャでは、メッセージルーターとして中央集権型のMQTT ブローカーが導入され、その他のコンポーネント（Host、Client、Server）は標準のMCP設計と同様です。

```mermaid
graph LR
    subgraph "アプリケーション ホストプロセス"
        H[Host]
        C1[Client 1]
        C2[Client 2]
        C3[Client 3]
        H --> C1
        H --> C2
        H --> C3
    end

    subgraph "MQTT ブローカー"
        B[ブローカー]
        C1 --> B
        C2 --> B
        C3 --> B
    end

    subgraph "サーバー"
        S1[Server A<br>外部API]
        R1[("リモート<br>リソース A")]
        B --> S1
        S1 <--> R1
    end

    subgraph "サーバー"
        S2[Server B<br>外部API]
        R2[("リモート<br>リソース B")]
        B --> S2
        S2 <--> R2
    end
```

### Host、Client、および Server

Host、Client、および Server のコンポーネントは変更されていません（詳細は[MCPコアコンセプト](https://modelcontextprotocol.io/docs/learn/architecture#concepts-of-mcp)を参照してください）：

- **Host** はクライアントのコンテナおよびコーディネーターとして機能します。
- 各 **Client** はHostによって作成され、Serverと独立した接続を維持します。
- **Server** は専用のコンテキストと機能を提供します。

主な違いは、ClientとServerが直接通信するのではなく、MQTT ブローカーを介して通信する点です。ブローカーの導入により、ClientとServer間の関係は1対1から多対多へと変わります。

### MQTT ブローカーの役割

MQTT ブローカーは中央集権型のメッセージルーターとして機能します：

- ClientとServer間のメッセージを転送します。
- サービスの登録および検出をサポートします（保持メッセージを介して）。
- ClientおよびServerの認証と認可を処理します。

## サーバースケーリングとロードバランシング

スケーラビリティとロードバランシングを実現するために、MCP Serverは複数のインスタンス（プロセス）を起動できます。各インスタンスは一意の `server-id` をMQTT クライアントIDとしてブローカーに接続し、すべてのインスタンスは同じ `server-name` を共有します。

**Clientのインタラクションフロー：**

1. Clientはサービス検出トピックをサブスクライブし、対象の `server-name` 配下のすべての利用可能な `server-id` を取得します。
2. Clientはカスタムポリシー（例：ランダムまたはラウンドロビン）に基づいてServerインスタンスを選択し、`initialize` リクエストを送信します。
3. 初期化後、Clientは専用のRPCトピックを通じて選択されたServerインスタンスと通信します。

```mermaid
graph LR

    C1["MCP クライアント1"]
    C2["MCP クライアント2"]
    C3["MCP クライアント3"]
    C4["MCP クライアント4"]

    subgraph "MCP サーバーインスタンス (server-name-a)"
        S1[サーバーインスタンス 1]
        S2[サーバーインスタンス 2]
    end

    C1 <-- "クライアント1とサーバーインスタンス1のRPCトピック" --> S1
    C2 <-- "クライアント2とサーバーインスタンス1のRPCトピック" --> S1
    C3 <-- "クライアント3とサーバーインスタンス2のRPCトピック" --> S2
    C4 <-- "クライアント4とサーバーインスタンス2のRPCトピック" --> S2

```

この方式により、MCPサーバーの高可用性とスケーラビリティが可能になります：

- **スケールアップ時**、既存のMCPクライアントは旧サーバーインスタンスに接続したままで、新規クライアントは新たに追加されたインスタンスで初期化できます。
- **スケールダウン時**、MCPクライアントは再初期化して他の利用可能なサーバーインスタンスに接続できます。
