Kiro 中配置 RabbitMQ MCP Server 指南
一、背景介绍
通过配置 RabbitMQ MCP Server,可以让 Kiro 具备直接与 RabbitMQ 消息队列交互的能力,包括发送消息、查看队列状态、消费消息等,方便在开发过程中进行消息驱动的功能测试验证。
二、方案选型
| 方案 | 优缺点 |
|---|---|
| 开源 PyPI 包(uvx 运行) | 安装简单,但依赖兼容性差,版本更新可能破坏功能 |
| 自建本地 Python MCP Server | 稳定可控,仅依赖 pika + mcp 两个库,无第三方包兼容问题 |
推荐方案:自建本地 Python MCP Server
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
三、环境准备
1. 确认 Python 环境
bash
python --version # 需要 Python 3.10+
2. 安装依赖
bash
pip install pika mcp
pika:Python 的 RabbitMQ/AMQP 客户端库mcp:Model Context Protocol SDK,用于构建 MCP Server
四、创建 MCP Server 脚本
在项目的 .kiro/tools/ 目录下创建 rabbitmq_mcp_server.py:
python
"""
RabbitMQ MCP Server - 本地版.
支持标准 RabbitMQ 及阿里云 ApsaraMQ for RabbitMQ。
"""
import json
import os
import pika
from mcp.server.fastmcp import FastMCP
# 从环境变量获取连接配置
RABBITMQ_HOST = os.environ.get("RABBITMQ_HOST", "localhost")
RABBITMQ_PORT = int(os.environ.get("RABBITMQ_PORT", "5672"))
RABBITMQ_USERNAME = os.environ.get("RABBITMQ_USERNAME", "guest")
RABBITMQ_PASSWORD = os.environ.get("RABBITMQ_PASSWORD", "guest")
RABBITMQ_VHOST = os.environ.get("RABBITMQ_VHOST", "/")
mcp = FastMCP("rabbitmq-server")
def get_connection():
"""创建RabbitMQ连接."""
credentials = pika.PlainCredentials(RABBITMQ_USERNAME, RABBITMQ_PASSWORD)
parameters = pika.ConnectionParameters(
host=RABBITMQ_HOST,
port=RABBITMQ_PORT,
virtual_host=RABBITMQ_VHOST,
credentials=credentials,
connection_attempts=3,
retry_delay=5,
socket_timeout=30,
heartbeat=0,
)
return pika.BlockingConnection(parameters)
@mcp.tool()
def publish_message(exchange: str, routing_key: str, message: str,
content_type: str = "application/json") -> str:
"""发送消息到指定的exchange和routing_key."""
try:
connection = get_connection()
channel = connection.channel()
properties = pika.BasicProperties(
content_type=content_type,
delivery_mode=2,
)
channel.basic_publish(
exchange=exchange,
routing_key=routing_key,
body=message.encode("utf-8"),
properties=properties,
)
connection.close()
return f"消息发送成功。exchange={exchange}, routing_key={routing_key}"
except Exception as e:
return f"消息发送失败: {str(e)}"
@mcp.tool()
def check_queue(queue_name: str) -> str:
"""检查指定队列的状态."""
try:
connection = get_connection()
channel = connection.channel()
result = channel.queue_declare(queue=queue_name, passive=True)
info = {
"queue": result.method.queue,
"message_count": result.method.message_count,
"consumer_count": result.method.consumer_count,
}
connection.close()
return json.dumps(info, ensure_ascii=False)
except Exception as e:
return f"队列检查失败: {str(e)}"
@mcp.tool()
def get_message(queue_name: str, auto_ack: bool = False) -> str:
"""从指定队列中获取一条消息."""
try:
connection = get_connection()
channel = connection.channel()
method, properties, body = channel.basic_get(
queue=queue_name, auto_ack=auto_ack
)
if method is None:
connection.close()
return "队列中没有消息"
msg_info = {
"delivery_tag": method.delivery_tag,
"exchange": method.exchange,
"routing_key": method.routing_key,
"content_type": properties.content_type,
"body": body.decode("utf-8") if body else "",
}
if not auto_ack:
channel.basic_nack(delivery_tag=method.delivery_tag, requeue=True)
connection.close()
return json.dumps(msg_info, ensure_ascii=False, indent=2)
except Exception as e:
return f"获取消息失败: {str(e)}"
@mcp.tool()
def test_connection() -> str:
"""测试RabbitMQ连接是否正常."""
try:
connection = get_connection()
connection.channel()
connection.close()
return f"连接成功!host={RABBITMQ_HOST}, port={RABBITMQ_PORT}, vhost={RABBITMQ_VHOST}"
except Exception as e:
return f"连接失败: {str(e)}"
if __name__ == "__main__":
mcp.run(transport="stdio")
五、配置 MCP Server
在 .kiro/settings/mcp.json 中添加配置:
json
{
"mcpServers": {
"rabbitmq": {
"command": "python",
"args": ["<脚本的绝对路径>/rabbitmq_mcp_server.py"],
"env": {
"RABBITMQ_HOST": "your-rabbitmq-host.com",
"RABBITMQ_PORT": "5672",
"RABBITMQ_USERNAME": "your-username",
"RABBITMQ_PASSWORD": "your-password",
"RABBITMQ_VHOST": "/"
},
"disabled": false,
"autoApprove": []
}
}
}
注意事项:
args中的脚本路径必须使用绝对路径,因为 Kiro 的工作目录不是项目目录- Windows 路径示例:
"D:\\Project\\my-app\\.kiro\\tools\\rabbitmq_mcp_server.py"
六、阿里云 ApsaraMQ 适配说明
如果使用阿里云 ApsaraMQ for RabbitMQ,认证方式有所不同:
- 阿里云不支持直接使用 AccessKey 作为用户名密码
- 需要先在阿里云控制台通过 AK/SK 生成静态用户名和密码
- 生成后的静态凭据可以直接配置在
RABBITMQ_USERNAME和RABBITMQ_PASSWORD中 - 协议层面完全兼容,无需额外适配
七、问题排查
问题1:脚本路径找不到
python: can't open file '.kiro/tools/rabbitmq_mcp_server.py': No such file or directory
原因: 使用了相对路径,Kiro 的工作目录不在项目根目录下
解决: 改为绝对路径
问题2:PyPI 包依赖冲突
ImportError: cannot import name 'BearerAuthProvider' from 'fastmcp.server.auth'
原因: 开源 PyPI 包与 fastmcp 版本不兼容
解决: 放弃第三方包,使用自建本地脚本方案
问题3:国内网络无法访问 PyPI
Failed to fetch: https://pypi.org/simple/xxx - operation timed out
解决: 使用国内镜像或直接采用本地脚本方案(无需网络下载)
问题4:消费者反序列化失败
Failed to invoke target method with argument type = [class [B]
原因: Java Spring 项目使用 SimpleMessageConverter(Java 序列化),Python 发送的 JSON 无法被正确反序列化
解决: 对于 Java 序列化的消息,通过 Java 单元测试发送消息,Python MCP 仅用于查看队列状态和消费已有消息
八、使用示例
测试连接
> 测试下 RabbitMQ 连接
→ 调用 test_connection()
← 连接成功!host=your-host.com, port=5672, vhost=/
查看队列状态
> 查看 my-queue 队列的消息数
→ 调用 check_queue("my-queue")
← {"queue": "my-queue", "message_count": 3, "consumer_count": 1}
发送消息
> 发送一条测试消息到 my-exchange
→ 调用 publish_message("my-exchange", "my-routing-key", '{"key": "value"}')
← 消息发送成功。exchange=my-exchange, routing_key=my-routing-key
读取消息(不删除)
> 查看队列中的第一条消息
→ 调用 get_message("my-queue", auto_ack=False)
← {"delivery_tag": 1, "exchange": "my-exchange", "routing_key": "...", "body": "..."}

九、适用场景与局限
适用场景:
- 查看队列状态(消息堆积数、消费者数)
- 发送简单的 JSON 文本消息
- 读取/窥视队列中的消息内容
- 验证消息路由是否正确
局限:
- 无法发送 Java 序列化格式的消息(需要通过 Java 单测配合)
- 不支持管理操作(创建/删除 exchange、queue 等,需 Management API)
- 不支持 TLS/SSL 连接(如需要,可在脚本中添加 SSL 配置)
十、总结
本地自建 Python MCP Server 是最稳定可靠的方案,配合 MySQL MCP 可以实现完整的消息驱动功能验证闭环:
- MySQL MCP → 查询/准备测试数据
- RabbitMQ MCP → 查看队列状态、发送/读取消息
- MySQL MCP → 验证消费后的数据库状态变化