Kiro 中配置 RabbitMQ MCP Server 指南

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_USERNAMERABBITMQ_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 可以实现完整的消息驱动功能验证闭环:

  1. MySQL MCP → 查询/准备测试数据
  2. RabbitMQ MCP → 查看队列状态、发送/读取消息
  3. MySQL MCP → 验证消费后的数据库状态变化
相关推荐
国科安芯1 小时前
AS32S601型抗辐射MCU在分布式太空算力架构中的技术演进与应用前景
人工智能·分布式·单片机·嵌入式硬件·架构·边缘计算
不会C语言的菜鸟2 小时前
分布式数据一致性:从工程实践到理论基石
分布式
quweiie13 小时前
tp8使用rabbitMQ消息队列的示例
消息队列·rabbitmq·thinkphp消息队列
Leo.yuan15 小时前
数据仓库建设怎么做?从源数据到分析报表全流程讲清
大数据·分布式·spark
六点_dn16 小时前
RabbitMQ学习笔记-定义与作用
笔记·学习·rabbitmq
明豆21 小时前
Redis 分布式缓存生产实战
redis·分布式·缓存
阿标在干嘛1 天前
从单机到分布式:政策快报爬虫系统的三次重构
分布式·爬虫·重构
笨鸟先飞的橘猫1 天前
游戏后端分布式学习——开篇
分布式·学习·游戏
六bring个六1 天前
分布式软总线认证模块架构与实现分析
分布式·架构·open harmony