# RocketMQ Console（通用 HTTP MCP）

通过通用 HTTP MCP 调用 RocketMQ Console 查询 API。MCP key 固定为 **`rocketmq-console-mcp`**。

执行本分册后回到 [SKILL.md](SKILL.md) 合并写入。仅支持环境 **`test1` ~ `test5`**（不写 uat/yc）。

**门禁：** 仅当用户在当次对话中**明确确认**要生成 RocketMQ Console MCP 时才执行本分册；未确认禁止写入（见 [SKILL.md](SKILL.md)「MCP 生成范围」）。

## 0. 是否引入 MQ（未引入则跳过）

满足任一即视为引入，否则跳过：

- 配置出现 `*namesrvAddr*` / `rocket.mq` / `rocketmq` / `*.mq.namesrv*`
- 依赖含 `rocketmq` / `rocketmq-spring-boot`

## 1. 定位 namesrv（本地 → Nacos）

顺序同 [database.md](database.md)：本地 yml/properties/常量 → Nacos。收集所有 `namesrvAddr`（及等价）取值。

## 2. 集群判定 → Console path（必遵）

对每条 namesrv 字符串判定（大小写不敏感；IP 用子串匹配）：

| 判定 | 集群 | Console path |
|------|------|----------------|
| 含 `finance-mq` / `finance.mq`；或 key 含 `finance.mq`；或 IP 尾号为 `.222` / `.223`（如 `10.x.x.222`） | 融资 | `/rocketmq-console-finance` |
| 含 `crcl`；或 IP 尾号为 `.186` / `.187`（如 `10.111.x.186`） | 核心 | `/rocketmq-console-crcl` |
| 含 `public-mq`；或 `10.111.140.229` / `10.111.140.230`；或其它未命中融资/核心的公共地址 | 公共 | `/rocketmq-console` |

判定优先级：先匹配融资 → 再匹配核心 → 其余归公共（仅当确有 namesrv 时）。

Base URL：

```text
http://www.{env}.yljr.com{path}
```

`{env}` 为用户指定的 test1~test5。

示例：

- `10.111.140.229:9876;10.111.140.230:9876` → 公共
- `public-mq01.yljr.native:9876;public-mq02.yljr.native:9876` → 公共
- `finance-mq01.yljr.native:9876;finance-mq02.yljr.native:9876` → 融资
- namesrv IP 尾号 `.222` / `.223` → 融资
- namesrv 含 `crcl` 或 IP 尾号 `.186`/`.187` → 核心

多服务、多 namesrv：**按 Console path 去重**；需要几个集群就在 env 里写几个 BASE，只写一条 MCP。

## 3. 写入 mcp.json（通用 HTTP MCP）

使用 `@anushibinj/fetch-mcp`（Node/`npx`，工具名 `http_request`）。key：**`rocketmq-console-mcp`**。

```json
"rocketmq-console-mcp": {
  "command": "npx",
  "args": ["-y", "@anushibinj/fetch-mcp"],
  "env": {
    "ROCKETMQ_ENV": "test2",
    "ROCKETMQ_CONSOLE_PUBLIC": "http://www.test2.yljr.com/rocketmq-console",
    "ROCKETMQ_CONSOLE_CRCL": "http://www.test2.yljr.com/rocketmq-console-crcl",
    "ROCKETMQ_CONSOLE_FINANCE": "http://www.test2.yljr.com/rocketmq-console-finance"
  }
}
```

规则：

- 只写入**本次判定命中**的 BASE env（未用到的集群不要写）
- 始终写 `ROCKETMQ_ENV`
- 全局只保留一条 `rocketmq-console-mcp`（同名覆盖）
- env 中的 BASE 供 Agent 拼 URL；HTTP MCP 本身不解析这些变量

## 4. 查询时如何用该 MCP（Agent 必遵）

查消息时**必须**通过 MCP 工具 `http_request`（method=`GET`），禁止改用 skill 脚本/裸 curl 作为主路径。

时间：`begin` / `end` 为**毫秒时间戳**；用户说「今天/最近 1 小时」时由 Agent 自行换算。

### 4.1 按 topic + 时间查 msgid

```
GET {CONSOLE_BASE}/message/queryMessageByTopic.query?begin={ms}&end={ms}&topic={topic}
```

例：`http://www.test2.yljr.com/rocketmq-console/message/queryMessageByTopic.query?begin=1785649800000&end=1785743400000&topic=zqyl-ls`

响应：`status===0` 时看 `data[]`，取 `msgId`、`topic`、`properties.KEYS` / `TAGS`、`bornTimestamp` 等；`messageBody` 可能为 null。

### 4.2 查单条消息内容

```
GET {CONSOLE_BASE}/message/viewMessage.query?msgId={msgId}&topic={topic}
```

例：`http://www.test2.yljr.com/rocketmq-console/message/viewMessage.query?msgId=7F00000165601AF1347D0CAC323500AD&topic=zqyl-ls`

响应：`data.messageView`（含 `messageBody`）、`data.messageTrackList`（消费轨迹）。

### 4.3 选哪个 CONSOLE_BASE

按当前排查服务在配置里命中的集群，选用对应 env：

- 公共 → `ROCKETMQ_CONSOLE_PUBLIC`
- 核心 → `ROCKETMQ_CONSOLE_CRCL`
- 融资 → `ROCKETMQ_CONSOLE_FINANCE`

不确定时：用生成摘要里记录的映射；仍不清则询问用户，禁止乱试写接口。

## 5. 失败处理

| 情况 | 处理 |
|------|------|
| 未引入 MQ | 跳过 |
| 有 MQ 但 namesrv 无法归类 | 列出原始 namesrv，询问用户选公共/核心/融资 |
| 环境非 test1~test5 | 不写本 MCP，提示仅支持 test1~test5 |
