RabbitMQのMCPサーバーでClaudeからキューとExchangeを操作する
AWSのamazon-mq組織が公開するmcp-server-rabbitmqを使い、キュー深さの監視やデッドレターキュー調査を自然言語でClaudeに任せる手順とセキュリティ設計を扱います。
RabbitMQ MCPサーバーとは何か
mcp-server-rabbitmqは、RabbitMQブローカーの管理・運用操作をMCP経由でAIエージェントに公開するサーバーです。GitHubのamazon-mqorganization配下でApache-2.0ライセンスで公開されているPython製ツールで、対象はRabbitMQブローカーの管理操作です。READMEの接続例はrabbitmq.example.comのような一般的なホスト名で、Amazon MQに限定した書き方ではありません。
解決する場面は、キューの詰まりやデッドレターキュー(処理に失敗したメッセージの退避先)の調査です。管理画面を何度も行き来して原因を探す作業を、自然言語の依頼に置き換えます。ツールはv4で31個、v3で61個あり、複数ツールを組み合わせた16種類の「スキル」(定型の調査手順)が付いています。
導入前に確認すること
- Python 3.10以上(
uv経由での実行が推奨) - 接続先のRabbitMQブローカー(AMQPエンドポイントとManagement APIの両方への到達性)
- Claude CodeまたはClaude Desktopなど、MCPクライアントとして動く環境
- 書き込み系操作(キュー作成・削除・rebalanceなど)を使う場合は、ブローカー側のRabbitMQユーザーに相応の権限があること
パッケージはamq-mcp-server-rabbitmqという名前でPyPIに公開されており、pip installまたはuvxでそのまま実行できます。
v3とv4、どちらを選ぶか
このサーバーはツールレイアウトが異なる2つのバージョン系列を同じリポジトリから配布しています。
| バージョン | ツール数 | 呼び出し方 | 向いている場面 |
|---|---|---|---|
| v3(3.x系) | ツール数61(操作ごとに1ツール) | 呼び出し方rabbitmq_broker_list_queuesのような専用ツール名 | 向いている場面v2系からの既存プロンプト・連携をそのまま使いたい |
| v4(4.x系) | ツール数31(enumベースのディスパッチャ) | 呼び出し方queues(action="list")のようにactionを渡す | 向いている場面ツール説明文のトークン消費を抑えたい、--tool-groupsで必要な機能だけ絞りたい |
v4ではREADMEによると、ツール名と説明文の合計が約2,300トークンから約900トークンに減ります。
パッケージを最新化しても既定ではv3互換の挙動のままで、--v4を明示しない限り既存の連携は壊れません。移行期は--v1-compatを付けると、v4のツールに加えてv3の旧ツール名もエイリアスとして登録されます。プロンプトの書き換えを急がずに済みます。
Claude Codeに接続する
Claude Codeでは、claude mcp addでstdio型のサーバーとして登録します。claude mcp add --helpには、環境変数を渡す-e, --envと、--の後ろにサーバー起動コマンドを置く形が例として出ています。
Claude Codeへの登録手順
- 1
パッケージを入れておく
pip install amq-mcp-server-rabbitmquvxで毎回実行する構成なら、事前のインストールは不要です。 - 2
接続先を環境変数で渡して登録する
claude mcp add rabbitmq \ -e RABBITMQ_AMQP_ENDPOINT=amqps://admin:pass@broker.example.com:5671 \ -- uvx amq-mcp-server-rabbitmq@latest --v4登録先は
-s, --scopeで選びます。--helpにはlocal・user・projectの3つが並び、既定はlocalです。 - 3
調査用の依頼を投げる
Claude Codeを起動し、「キューの一覧を出して、メッセージが溜まっているものを教えて」のように頼みます。書き込み系のツールはこの時点では読み込まれません。
Claude Desktopの設定ファイルに書く場合は、v4モードで書き込みツールも許可した次の形です。
{
"mcpServers": {
"rabbitmq": {
"command": "uvx",
"args": [
"amq-mcp-server-rabbitmq@latest",
"--v4",
"--allow-mutative-tools"
]
}
}
}接続先の渡し方は2通りある
接続先ブローカーの渡し方
connectツールで都度接続
セッション内でエージェントがconnectツールを呼び、ホストとユーザー名を指定します。READMEの例では「Connect to my RabbitMQ broker at rabbitmq.example.com with user admin」と頼む形です。OAuthトークンで繋ぐ場合は、専用のOAuth接続ツールを使います。
環境変数で起動時に接続
RABBITMQ_AMQP_ENDPOINTを設定すると、サーバーが起動時に接続します。MCPホストがセッションやツール呼び出しのたびにプロセスを作り直す構成(アグリゲータやプロキシ経由)でも、毎回「No active broker」で失敗しません。ただし、この環境変数ではOAuthは使えません。
エンドポイントURIのスキームが、TLSの有無とデフォルトポートを決めます。amqpsはTLSで5671、amqpは平文で5672です。Management APIはhttpsが443、httpが15672で、:portを明示すればそちらが優先されます。
片方の環境変数だけでも足ります。RABBITMQ_AMQP_ENDPOINTだけを渡せば、Management APIの接続先は同じホストと認証情報から導かれます。Management APIが別ホストや別の認証情報なら、RABBITMQ_MANAGEMENT_ENDPOINTも設定します。
認証情報に@や/のような予約文字を含む場合はパーセントエンコードが必要です。たとえばp@ss/wordはp%40ss%2Fwordと書きます。接続に失敗しても(到達できないブローカー、URIの書式ミス)サーバーは落ちず、警告をログに出してconnectツールを使える状態で残ります。
キュー深さの監視とデッドレターキュー調査
読み取り専用のツール群だけでも、日常的な運用監視の大半はカバーできます。queue_metrics_analysisスキルは、get_queue_infoが返すpublish/deliverレートとバックログの推移を読み、「このキューは処理が追いついていない」といった判断材料にします。resource_headroom_checkは、ノードのメモリ・ディスクの余裕率を使ってアラームまでの時間を見積もります。
デッドレターキュー(DLQ)調査には3つのスキルが対応します。
trace_dead_letter_chain:各キューのx-dead-letter-exchange引数を辿り、DLXの接続関係を地図にするinspect_dead_letters:DLQ内のメッセージを覗き、x-deathヘッダーから元のキュー名と失敗理由を取り出すdlq_summary:元のキューと拒否理由ごとに、デッドレターの件数を集計する
dlq_summaryは複数のツールを順に呼ぶ手順で、エージェントの内部では次の順に進みます。
dlq_summaryが内部で踏む順序
- 1
キューを洗い出す
list_queuesで、.dlqで終わるキューやデッドレター関連の引数を持つキューを探します。 - 2
深さを測る
見つけたキューごとに
get_queue_infoを呼び、メッセージ数を取ります。 - 3
中身を覗く
get_messagesでx-deathヘッダーを読み、元のキューと拒否理由を集めます。
結果は、DLQの本数・メッセージ総数・キューごとの内訳といった要約で返ります。docsの例では「orders.dlqが380件(理由はmax-retriesによる拒否)、payments.dlqが30件(期限切れ)」のような形です。管理画面でメッセージを1件ずつ開いて読み解く作業が、依頼1つになります。
- 「注文キューのデッドレターを要約して、どのキューが原因になっているか教えて」
- 「クラスタ全体でディスク使用率が閾値に近いノードはある?」
- 「exchange-ordersからrouting key
order.createdを投げたら、どのキューに届く?」(trace_message_routeスキル)
スキルの正体と、読み取りで済む範囲
スキルはサーバーに組み込まれたコードではなく、手順を文章で記した「レシピ」です。エージェントがget_skillツールでレシピを取得し、stepsに沿って既存のツールを自分で呼びます。docsには、レシピは既存ツールの上に載る案内にすぎず、追加してもサーバーの書き込み権限の範囲は広がらないと書かれています。
読み取りの範囲に収まる動きは、次のとおりです。
get_messagesはキューのメッセージを消費せずに覗くツールで、DLQの中身を見ても取り出し済みにはなりませんtrace_message_routeはExchangeのバインディングから届き先を予測するスキルで、実際にメッセージを送る操作ではありませんfind_orphaned_queuesはバインディングもコンシューマーも持たないキューを探し、find_unbound_exchangesは出口のバインディングがないExchangeを探します
トポロジーを図で見たいときはexport_topology_graphでMermaid形式の図を出せます。broker_recommendationsはブローカーの現状とベストプラクティスの指針を突き合わせ、policy_conflict_detectionは重なり合うポリシーのパターンと優先順位の勝者を報告します。
書き込み操作は既定で無効
キューの作成・削除やvhost管理、接続の強制切断といった変更を伴う操作は、--allow-mutative-toolsを明示的に渡さない限り一切ロードされません。ツールグループ(v4)ごとの扱いは次のとおりです。
| グループ | 主なツール | ロード条件 |
|---|---|---|
| core | 主なツールconnect、get_skill、get_guideline | ロード条件常にロード |
| read | 主なツールqueues、exchanges、connections、cluster、policies | ロード条件常にロード |
| health / observability | 主なツールhealth、find_queues | ロード条件常にロード |
| mutative | 主なツールmanage_queue、manage_exchange、publish、close_connection | ロード条件--allow-mutative-toolsが必要 |
| migration | 主なツールdefinitions_export、definitions_import、federation_setup | ロード条件--allow-mutative-toolsが必要 |
close_connectionとrebalance_queuesは、影響が大きいため単独のツールとしてmutativeグループに置かれています。監視専用のエージェントなら、--tool-groupsで読み込むグループを絞れます。
uvx amq-mcp-server-rabbitmq@latest --v4 --tool-groups read healthREADMEのセキュリティ節には、書き込みの制御以外に次の設計が並んでいます。
- TLSが既定: 接続は
use_tls=True・ポート5671を使い、TLSなしの接続にはレスポンスに警告が付く - SSRF対策: プライベートや予約済みのIP範囲、localhostへの接続はホスト名検証でブロックされる
- 認証情報のマスキング: ブローカー定義のエクスポートでは、パスワードなど機微な項目が取り除かれてからエージェントに返る
- 名前のURLエンコード: キュー・Exchange・vhostの名前は、API呼び出し前にURLエンコードされる
開発節にはdocker-composeでRabbitMQ 4をlocalhost:5672で起動する手順があり、ローカル検証用の既定の資格情報はguest / guestです。一方でセキュリティ節はlocalhostへの接続をブロックすると書いているため、手元のブローカーに繋ぐ際は警告やエラーの文言を見て挙動を確かめます。
本番ブローカーに繋ぐなら、まず--allow-mutative-toolsなしで調査と監視だけを任せ、変更までエージェントに任せたくなった段階でフラグを足す順序が安全です。
複数のブローカーを切り替えて使う
サーバーは複数のブローカーへの接続を同時に持てます。接続ごとに好きな別名(source、target、prod-uw2など)を付け、アクティブなのは常に1つです。切り替えには、v3ならrabbitmq_broker_select、v4ならbrokerツールを使います。切り替えても他の接続は切れません。
環境変数で接続する場合、別名の既定はホスト名で、RABBITMQ_ALIASで変えられます。ブルーグリーン移行(新旧2つのブローカーを並行稼働させて切り替える手法)では、この2接続が前提になります。
migrationグループを有効にすると、移行向けのスキルが使えます。pre_flight_migration_checkは両ブローカーでアラーム状態を確認し、定義を比較して切り替えの可否を判定します。migrate_definitionsは、変換ルールを適用しながらエクスポートとインポートを一度に実行します。
チームで共有するリモートサーバーとして動かす
ここまでのuvx起動は、MCPクライアントが子プロセスとして起動するstdio接続が前提です。チームで1つのサーバーを共有したい場合は、--httpでStreamable HTTPトランスポートに切り替えます。
uvx amq-mcp-server-rabbitmq@latest --v4 --http --server-port 8888 \
--http-auth-jwks-uri https://your-idp.example.com/.well-known/jwks.json \
--http-auth-issuer https://your-idp.example.com/ \
--http-auth-audience rabbitmq-mcp \
--http-auth-required-scopes "rabbitmq.read rabbitmq.write"認証は独立した2層に分かれています。1層目はサーバーからRabbitMQへの認証(ユーザー名とパスワード、またはOAuthトークン)で、2層目はMCPクライアントからこのサーバーへの認証です。stdioで手元から使うなら1層目だけで足り、--httpで公開する場合に2層目が加わります。
2層目では、社内のIdP(IDプロバイダ)が発行するJWTをJWKS経由で検証します。docsによると、検証できるのはRS256署名のJWTです。JWKSは5分キャッシュされ、検証に失敗するとキャッシュを一度捨てて再試行するため、IdP側の鍵のローテーション直後でもトークンが弾かれません。iss・aud・必要なスコープは、フラグで指定したものだけが強制されます。
--http-auth-jwks-uriにHTTPS以外のURIを渡すと拒否されます。トークン検証をバイパスされる経路を塞ぐ設計です。設定中に拒否の理由(発行者の不一致、audienceの不一致、スコープ不足、期限切れ)を見たいときは、FASTMCP_LOG_LEVEL=DEBUGを付けます。
リモートサーバー化した瞬間に、ネットワーク上の誰かがブローカーへ到達できる経路が生まれます。認証フラグを省いた状態での公開は避けてください。
よくあるつまずき
- 「No active broker」と毎回言われる: セッションごとにプロセスが再起動される構成では、
RABBITMQ_AMQP_ENDPOINTによる起動時接続に切り替えます - v3向けに書いたプロンプトがv4で動かない:
--v4を付けた瞬間に、ツール名がrabbitmq_broker_list_queues形式からqueues(action="list")形式に変わります。--v1-compatでv3の旧ツール名を併存させ、書き換えを段階的に進めます - 書き込み系ツールを頼んだのに動かない:
--allow-mutative-toolsがないと、キュー作成やポリシー変更のツールはそもそもロードされません。意図的な安全策なので、必要な場面だけ付けます - 認証情報に含めた記号でエンドポイントURIが壊れる: パスワードに
@や/を含む場合はパーセントエンコードが必須です。し忘れると、ホスト名やポートの解釈がずれて接続に失敗します --management-portを指定したのにTLSで繋がらない: このフラグが上書きするのはManagement APIの既定ポート(TLS時443、非TLS時15672)だけです。TLSの有無はAMQPエンドポイントのスキーム(amqpsかamqp)で決まります
まとめ
読み取り専用の既定のまま監視とDLQ調査を始め、書き込みが必要になった時点で--allow-mutative-toolsを足す順序なら、本番ブローカーでも影響範囲を段階的に広げられます。チームで共有するときは、サーバー側のJWT検証まで含めて2層の認証を組みます。
MCPの基礎から確認したい場合はMCPとは何か、claude mcp addのスコープや認証の詳細はClaude Code MCP設定ガイド、ツールごとの許可・拒否ルールはClaude Code MCP権限ルールにまとめています。セルフホスト環境からMCPサーバーを届ける経路の選び方はClaude Codeセルフホスト環境にMCPサーバーを届ける3つの経路も参考になります。