Skip to main content
Glama

🌐 multiagent-mcp

協調型マルチエージェント順番制御ハブ(Model Context Protocol 対応)
同期型マルチエージェント対話、人間参加型インタラクション(@user)、メンション駆動のターンキュー、およびディスク上へのリアルタイム Markdown トランスクリプト追跡を統合します。

Python Version MCP License: MIT Code Style: Black / Flake8


📖 概要

multiagent-mcp は、マルチエージェント LLM 連携のために設計された専用の Model Context Protocol (MCP) サーバーです。複数の AI エージェント(例:アーキテクト、レビュア、オプティマイザ)と人間ユーザー(@user)が、構造化された非同期対応の順番制御ディスカッションに参加できるようにします。

混沌とした同時生成や複雑な手動ポーリングの代わりに、multiagent-mcp は明示的な @メンション を介してターンを調整し、内部の FIFO ターンキューを維持し、到着同期バリアを処理し、増分未読メッセージスライシングを提供し、リアルタイムでアトミックな Markdown トランスクリプトをディスクに書き込みます。

flowchart TD
    subgraph Clients["Agents & User"]
        A["🤖 Agent @Alice\n(Architect)"]
        B["🤖 Agent @Bob\n(Reviewer)"]
        U["👤 User @user\n(Decider)"]
    end

    subgraph Hub["multiagent-mcp Server (FastMCP)"]
        RM["RoomManager Engine"]
        TQ["FIFO Turn Queue\n(+1 per @mention)"]
        AB["Arrival Barrier &\nWakeup Broadcast"]
        UMS["Incremental Unread Slicing\n(last_read_seq_id)"]
    end

    subgraph Storage["On-Disk Live Transcript"]
        MD["📜 Obsidian / Markdown Note\n(Live File Tracking)"]
    end

    A -->|"1. join_conversation()"| AB
    B -->|"2. join_conversation()"| AB
    AB -->|"3. Global Wakeup & Welcome"| Clients
    A -->|"4. send_message(@Bob, ...)"| RM
    RM -->|"Update Turn Queue"| TQ
    RM -->|"Append Message"| MD
    RM -->|"Wakeup Target"| B
    B -->|"5. wait_for_turn() / send_message(@user)"| RM
    RM -->|"Signal @user Turn"| U
    U -->|"6. send_message(@Alice, ...)"| RM

Related MCP server: agent-room-mcp

✨ コア機能

1. メンションベースのターン取得(@<名前>)と重複排除

  • ターンは、メッセージコンテンツにハンドルをタグ付けすることで、エージェントとユーザー間で自然に受け渡されます(例:"@Bob どう思う?")。

  • 対象メンション:エージェントは、直接宛先または返信が期待される参加者のみをメンションし、すべての参加者を無差別にタグ付けしないようにする必要があります。

  • グローバルブロードキャストタグ(@all):公開メッセージ(is_private=False)内で @all をタグ付けすると、すべてのアクティブな参加者を対象とし、それぞれに +1 ターンスコアをキューに入れます。

  • コードブロック隔離:フェンシングされた(```)またはインライン(`)コードブロック内のメンションは、解析前に自動的に除去され、誤ったターントリガーを防ぎます。

  • 重複排除:同じメッセージ内で @Bob を複数回タグ付けしても、@Bob は 1 回だけ キューに入れられます(1 メッセージあたりの個別参加者あたりの最大スコアは +1)。

  • 検証:メッセージに有効なアクティブ参加者のメンションが含まれていない場合、サーバーは説明的な検証エラーでメッセージを拒否し、利用可能なハンドルまたは @all を指定します。

2. 到着バリアとグローバルウェイクアップブロードキャスト

  • エージェントが join_conversation を介して順次参加する場合、最初の参加者は同期バリアでブロックされます。

  • 参加者が $ ge 2$ 人になった時点で、サーバーは到着通知(@Bob が会話に到着しました)をブロードキャストし、待機中の参加者を自動的にブロック解除して、対話を開始します。

3. 公開メッセージとプライベートメッセージ(is_private=True)

  • 公開メッセージ:トランスクリプトに追加され、すべての参加者に配信され、待機中のリスナーをすべて起こします。

  • プライベートメッセージ(is_private=True):

    • 送信者と明示的にメンションされた受信者 のみ に表示され配信されます。

    • @all 禁止:is_private=True で @all を呼び出すと、明示的な ValueError が発生します。

    • トランスクリプト内で人間ユーザー向けに専用の 🔒 [プライベートメッセージ] ブロックとしてフォーマットされます。

  • 厳格なトランスクリプト禁止:エージェントは、ディスク上の Markdown トランスクリプトファイルを直接読み取ること(view_file やシェルコマンド経由)が厳しく禁止されており、帯域外の情報漏洩をゼロにします。

4. ライブ Markdown トランスクリプト追跡

  • すべてのメッセージ、参加者テーブル、システム通知は、指定された Markdown ファイル(filepath)にアトミックに書き込まれます。

  • Obsidian、Cursor、VS Code などのエディターでのリアルタイム視覚的検査が可能です(セカンダリディスプレイ監視に最適)。

5. 増分未読メッセージスライシング

  • 各参加者は last_read_seq_id を保持します。

  • wait_for_turn またはブロッキング型の send_message の呼び出しは、新しく到着した未読メッセージのみ(seq_id > last_read_seq_id)を返し、LLM コンテキストを節約し、反復処理を防ぎます。


📦 インストールとセットアップ

前提条件

  • Python $ ge 3.10

  • pip または uv パッケージマネージャー

標準インストール

リポジトリをクローンし、編集可能モードでインストールします。

git clone https://github.com/hjamet/multiagent-mcp.git
cd multiagent-mcp
pip install -e .

開発依存関係(pytest でのテスト)をインストールする場合:

pip install -e ".[dev]"

🚀 サーバーの実行

multiagent-mcp は 標準入出力(stdio)(Claude Desktop、Antigravity、Cursor でのローカル CLI 統合用)と サーバー送信イベント(sse)(HTTP/ネットワーク化マイクロサービス用)の両方をサポートしています。

1. Stdio モード(IDE およびデスクトップアプリのデフォルト)

multiagent-mcp stdio

2. SSE サーバーモード(HTTP およびネットワーク化サブエージェント)

# Default binding: 127.0.0.1:8000
multiagent-mcp serve

# Custom host and port
multiagent-mcp serve --host 0.0.0.0 --port 8000

SSE モードで実行する場合、MCP エンドポイントは http://127.0.0.1:8000/sse で利用可能です。


⚙️ MCP クライアント設定

1. Google Antigravity および Cursor 設定

multiagent-mcp を mcp_servers.json(または .cursor/mcp.json / .gemini/antigravity/mcp_servers.json)に追加します。

Stdio 経由:

{
  "mcpServers": {
    "multiagent-mcp": {
      "command": "multiagent-mcp",
      "args": ["stdio"]
    }
  }
}

SSE 経由(リモート / ローカルサーバー):

{
  "mcpServers": {
    "multiagent-mcp": {
      "url": "http://127.0.0.1:8000/sse"
    }
  }
}

2. Claude Desktop 設定

claude_desktop_config.json を編集します(Windows の場合は %APPDATA%\Claude\claude_desktop_config.json、macOS の場合は ~/Library/Application Support/Claude/claude_desktop_config.json)。

{
  "mcpServers": {
    "multiagent-mcp": {
      "command": "multiagent-mcp",
      "args": ["stdio"]
    }
  }
}

🛠️ ツールリファレンス

サーバーは 4 つの FastMCP ツールを公開します。

classDiagram
    class MultiAgentHub {
        +init_conversation(filepath, participants, topic) dict
        +join_conversation(handle, name, timeout_seconds) TurnResult
        +list_participants() dict
        +send_message(sender, content, is_private, timeout_seconds) TurnResult
    }

1. init_conversation

会話ルームを初期化またはリセットし、メモリ構造をクリアし、初期 Markdown トランスクリプトファイルを生成します。

パラメーター:

パラメーター

タイプ

必須

デフォルト

説明

filepath

str

はい

—

Markdown トランスクリプトファイルのターゲットパス。

participants

list[str]

はい

—

予想される参加者ハンドルのリスト(例:["@user", "@Alice", "@Bob"])。

topic

str

いいえ

""

会話のトピックまたはブリーフィングコンテキスト。

戻り値(dict):

{
  "status": "initialized",
  "filepath": "notes/Discussions/Architecture.md",
  "topic": "Multi-Agent Hub Protocol",
  "participants": ["@user", "@Alice", "@Bob"],
  "message": "Room initialized with 3 participants."
}

2. join_conversation

参加者をルームに登録します。到着同期バリアを処理し、到着通知をブロードキャストします。

パラメーター:

パラメーター

タイプ

必須

デフォルト

説明

handle

str

はい

—

参加者ハンドル(例:'@Alice' または 'Alice')。

name

str

いいえ

""

オプションの表示名(デフォルトはクリーン化されたハンドル)。

timeout_seconds

float

いいえ

45.0

ターン待機時のタイムアウト(秒)。

戻り値(TurnResult):

{
  "status": "joined",
  "active_turn": "@Alice",
  "new_messages": [],
  "current_queue": [],
  "active_participants": ["@user", "@Alice", "@Bob"],
  "system_notice": "Joined room. Active participants: 3"
}

3. list_participants

現在のルーム参加者、アクティブなターンスピーカー、ターンキュー、および総メッセージ数を照会します。

パラメーター: なし。

戻り値(dict):

{
  "participants": [
    {
      "handle": "@Alice",
      "name": "Alice Architect",
      "status": "active",
      "joined_at": "2026-08-18T10:20:00+00:00",
      "last_read_seq_id": 4
    }
  ],
  "active_participants": ["@Alice", "@Bob", "@user"],
  "active_turn": "@Bob",
  "turn_queue": ["@user"],
  "message_count": 5,
  "topic": "Architecture Review",
  "filepath": "notes/Discussions/Architecture.md"
}

4. send_message

公開またはプライベートメッセージをルームに投稿します。メンションを検証し、ターンキューを更新し、Markdown ファイルに追加し、送信者を次のターンになるか新しいメッセージが到着するまで待機ループに入れます。ブロック解除時に 新しい未読メッセージのみ を返します。

パラメーター:

パラメーター

タイプ

必須

デフォルト

説明

sender

str

はい

—

送信者ハンドル(例:'@Alice')。

content

str

はい

—

メッセージ内容。少なくとも 1 つの有効な @recipient メンションを含める必要があります。

is_private

bool

いいえ

False

True の場合、メッセージは送信者とタグ付けされた受信者にのみ表示されます。

timeout_seconds

float

いいえ

45.0

ターンステータスを返す前に待機する最大秒数。

戻り値(TurnResult):

{
  "status": "your_turn",
  "active_turn": "@Alice",
  "new_messages": [
    {
      "id": 4,
      "seq_id": 4,
      "sender": "@Bob",
      "recipients": ["@Alice"],
      "content": "I agree with your proposal @Alice.",
      "is_private": false,
      "timestamp": "2026-08-18T10:21:00+00:00"
    }
  ],
  "current_queue": ["@user"],
  "active_participants": ["@Alice", "@Bob", "@user"],
  "system_notice": "Woken up by incoming message/mention for @Alice."
}

💡 実世界統合:multiagent-chat スキル

multiagent-chat スキルは、スーパーバイザーがサブエージェントと @user を Obsidian でどのように調整するかを示しています。

実行シーケンス

sequenceDiagram
    autonumber
    actor Henri as 👤 Henri (@user)
    participant AGY as 👑 Antigravity (Supervisor)
    participant Hub as ⚡ multiagent-mcp
    participant Alice as 🤖 @Alice (Architect)
    participant Bob as 🤖 @Bob (Reviewer)
    participant MD as 📜 Live Transcript Note

    Henri->>AGY: "Launch debate on AIVC memory protocol"
    AGY->>Hub: init_conversation("notes/Debat.md", ["@user", "@Alice", "@Bob"], "AIVC Memory")
    Hub->>MD: Creates header and participant table

    par Spawn Subagents
        AGY->>Alice: invoke_subagent(Role="@Alice", Prompt="...")
        AGY->>Bob: invoke_subagent(Role="@Bob", Prompt="...")
    end

    Alice->>Hub: join_conversation("@Alice")
    Note over Alice,Hub: Alice waits at arrival barrier
    Bob->>Hub: join_conversation("@Bob")
    Hub->>MD: Append "🔔 @Bob est arrivé dans la conversation"
    Hub-->>Alice: Wakeup broadcast

    Alice->>Hub: send_message("@Alice", "We should use SQLite vector cache. What do you think @Bob?", block=True)
    Hub->>MD: Append Alice's message
    Hub-->>Bob: Wakeup & Assign Turn

    Bob->>Hub: send_message("@Bob", "Good idea, but let's check latency. @user do you approve?", block=True)
    Hub->>MD: Append Bob's message
    Hub-->>AGY: @user mentioned -> Signal turn to Supervisor

    AGY-->>Henri: "C'est à vous de parler : Bob demande votre arbitrage sur la latence."
    Henri->>AGY: "Je valide SQLite, la latence est négligeable."
    AGY->>Hub: send_message("@user", "Je valide SQLite, la latence est négligeable @Alice.", block=False)
    Hub->>MD: Append user message
    Hub-->>Alice: Unblock Alice

📜 ライブトランスクリプト形式

以下は、multiagent-mcp によって生成されたライブ Markdown ファイルの例です。

# Multi-Agent Room

- **Fichier :** `notes/Discussions/Architecture_Review.md`
- **Sujet :** Multi-Agent Hub Protocol & AIVC Memory
- **Initialisé le :** 2026-08-18 10:20:00

## Participants
| Handle | Nom | Statut | Rejoint le |
|---|---|---|---|
| @user | Henri Jamet | active | 2026-08-18 10:20:00 |
| @Alice | Alice Architect | active | 2026-08-18 10:20:02 |
| @Bob | Bob Reviewer | active | 2026-08-18 10:20:04 |

---

## Fil de discussion

> 🔔 **Système :** @Bob est arrivé dans la conversation

### @Alice ➔ @Bob (2026-08-18 10:20:10 UTC)

Nous devons privilégier un protocole à mémoire partagée pour réduire la latence inter-processus. Qu'en penses-tu @Bob ?

---

### 🔒 [Message Privé] @Bob ➔ @Alice (2026-08-18 10:20:30 UTC)

Vérifions d'abord la compatibilité Windows avant d'interpeller l'utilisateur.

---

### @Bob ➔ @user (2026-08-18 10:21:00 UTC)

D'accord sur le principe. @user, validez-vous cette approche pour le déploiement local ?

---

### @user ➔ @Alice, @Bob (2026-08-18 10:21:45 UTC)

Approche validée, privilégiez la simplicité d'implémentation @Alice.

---

🧪 テスト

テストスイートは以下をカバーします。

  • 参加者の正規化とハンドルクリーンアップ(@Alice、Alice $\to$ @Alice)。

  • メンション抽出とコードブロック除去(``` / `)。

  • 到着バリア同期とウェイクアップブロードキャスト。

  • プライベートメッセージのアクセス制御。

  • 増分未読メッセージスライシング。

  • FastMCP ツールの登録と CLI コマンド(serve / stdio)。

pytest を使用してテストを実行します。

pytest

📄 ライセンス

このプロジェクトは MIT ライセンス の下でライセンスされています。

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers