From 06bd7aed365f42899e29dd171bf27a7724f972ba Mon Sep 17 00:00:00 2001 From: JianYu Zheng <2375294554@qq.com> Date: Wed, 23 Jul 2025 11:56:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=8E=B7=E5=8F=96=E8=AF=B7?= =?UTF-8?q?=E6=B1=82mcp=E5=B7=A5=E5=85=B7=E6=96=B9=E6=B3=95=20--JsonRpcTwo?= =?UTF-8?q?.java=20=E6=B7=BB=E5=8A=A0JSON-RPC2.0=20=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=AF=B9=E8=B1=A1=20--XiaoZhiMcpJsonRpcJson.?= =?UTF-8?q?java=20=E6=B7=BB=E5=8A=A0=E5=B0=8F=E6=99=BAmcp=20JSON-RPC=202.0?= =?UTF-8?q?=20=E8=AF=B7=E6=B1=82=E5=86=85=E5=AE=B9json=20=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=20--McpJsonRpcRequest.java=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E4=B9=8B=E5=89=8D=E7=9A=84mcp=20JSON-RPC2.0=20=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=AF=B9=E8=B1=A1=20--AgentMcpAccessPointServiceImpl.?= =?UTF-8?q?java=20=E4=BC=98=E5=8C=96=E6=80=9D=E8=B7=AF=EF=BC=8C=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E5=8F=91=E9=80=81=E8=AF=B7=E6=B1=82=E9=83=BD=E8=A6=81?= =?UTF-8?q?=E6=9E=84=E9=80=A02=E6=AC=A1=E5=AF=B9=E8=B1=A1=E5=92=8C?= =?UTF-8?q?=E8=BD=AC=E6=8D=A22=E6=AC=A1json=E8=AF=B7=E6=B1=82=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=8C=E4=B8=94=E6=AF=8F=E6=AC=A1=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E9=83=BD=E4=B8=80=E6=A0=B7=EF=BC=8C=E7=8E=B0=E5=9C=A8=E6=8A=8A?= =?UTF-8?q?=E6=9C=80=E7=BB=88=E8=BD=AC=E6=88=90=E7=9A=84json=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=86=85=E5=AE=B9=E5=AD=98=E5=82=A8=E4=B8=BA=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=EF=BC=8C=E6=89=80=E6=9C=89=E8=AF=B7=E6=B1=82=E5=85=B1?= =?UTF-8?q?=E7=94=A8=E8=BF=99=E4=BA=9B=E5=B8=B8=E9=87=8F=EF=BC=8C=E5=87=8F?= =?UTF-8?q?=E5=B0=91=E6=AF=8F=E6=AC=A1=E8=AF=B7=E6=B1=82=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=92=8C=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/xiaozhi/common/utils/JsonRpcTwo.java | 21 +++++++++ .../agent/Enums/XiaoZhiMcpJsonRpcJson.java | 44 +++++++++++++++++++ .../modules/agent/dto/McpJsonRpcRequest.java | 32 -------------- .../impl/AgentMcpAccessPointServiceImpl.java | 21 ++------- 4 files changed, 69 insertions(+), 49 deletions(-) create mode 100644 main/manager-api/src/main/java/xiaozhi/common/utils/JsonRpcTwo.java create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/agent/Enums/XiaoZhiMcpJsonRpcJson.java delete mode 100644 main/manager-api/src/main/java/xiaozhi/modules/agent/dto/McpJsonRpcRequest.java diff --git a/main/manager-api/src/main/java/xiaozhi/common/utils/JsonRpcTwo.java b/main/manager-api/src/main/java/xiaozhi/common/utils/JsonRpcTwo.java new file mode 100644 index 00000000..c522a61d --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/common/utils/JsonRpcTwo.java @@ -0,0 +1,21 @@ +package xiaozhi.common.utils; + +import lombok.Data; +/** + * JSON-RPC2.0 格式规范对象 + */ +@Data +public class JsonRpcTwo { + private String jsonrpc = "2.0"; + private String method; + private Object params; + private Integer id; + + public JsonRpcTwo(String method, Object params, Integer id) { + this.method = method; + this.params = params; + this.id = id; + } + + +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/Enums/XiaoZhiMcpJsonRpcJson.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/Enums/XiaoZhiMcpJsonRpcJson.java new file mode 100644 index 00000000..114b1ab9 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/Enums/XiaoZhiMcpJsonRpcJson.java @@ -0,0 +1,44 @@ +package xiaozhi.modules.agent.Enums; + +import xiaozhi.common.utils.JsonUtils; +import xiaozhi.common.utils.JsonRpcTwo; + +import java.util.Map; + + +/** + * 小智MCP JSON-RPC 请求json + */ +public class XiaoZhiMcpJsonRpcJson { + //小智初始化mcp请求json + private static final String INITIALIZE_JSON; + //小智mcp初始化成功,返回通知请求json + private static final String NOTIFICATIONS_INITIALIZED_JSON; + //小智mcp获取mcp工具集合请求json + private static final String TOOLS_LIST_REQUEST; + // 延迟加载 + static { + INITIALIZE_JSON = JsonUtils.toJsonString(new JsonRpcTwo("initialize", + Map.of( + "protocolVersion", "2024-11-05", + "capabilities", Map.of( + "roots", Map.of("listChanged", false), + "sampling", Map.of()), + "clientInfo", Map.of( + "name", "xz-mcp-broker", + "version", "0.0.1")), + 1)); + NOTIFICATIONS_INITIALIZED_JSON = "{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\"}"; + TOOLS_LIST_REQUEST = JsonUtils.toJsonString(new JsonRpcTwo("tools/list", null, 2)); + } + public static String getInitializeJson(){ + return INITIALIZE_JSON; + } + public static String getNotificationsInitializedJson(){ + return NOTIFICATIONS_INITIALIZED_JSON; + } + public static String getToolsListJson(){ + return TOOLS_LIST_REQUEST; + } + +} diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/McpJsonRpcRequest.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/McpJsonRpcRequest.java deleted file mode 100644 index e4fac002..00000000 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/dto/McpJsonRpcRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package xiaozhi.modules.agent.dto; - -import lombok.Data; - -/** - * MCP JSON-RPC 请求 DTO - */ -@Data -public class McpJsonRpcRequest { - private String jsonrpc = "2.0"; - private String method; - private Object params; - private Integer id; - - public McpJsonRpcRequest() { - } - - public McpJsonRpcRequest(String method) { - this.method = method; - } - - public McpJsonRpcRequest(String method, Object params, Integer id) { - this.method = method; - this.params = params; - this.id = id; - } - - public McpJsonRpcRequest(String method, Object params) { - this.method = method; - this.params = params; - } -} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java index d1fe5810..7d96f748 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java @@ -18,7 +18,7 @@ import xiaozhi.common.constant.Constant; import xiaozhi.common.utils.AESUtils; import xiaozhi.common.utils.HashEncryptionUtil; import xiaozhi.common.utils.JsonUtils; -import xiaozhi.modules.agent.dto.McpJsonRpcRequest; +import xiaozhi.modules.agent.Enums.XiaoZhiMcpJsonRpcJson; import xiaozhi.modules.agent.service.AgentMcpAccessPointService; import xiaozhi.modules.sys.service.SysParamsService; import xiaozhi.modules.sys.utils.WebSocketClientManager; @@ -71,17 +71,7 @@ public class AgentMcpAccessPointServiceImpl implements AgentMcpAccessPointServic // 步骤1: 发送初始化消息并等待响应 log.info("发送MCP初始化消息,智能体ID: {}", id); - McpJsonRpcRequest initializeRequest = new McpJsonRpcRequest("initialize", - Map.of( - "protocolVersion", "2024-11-05", - "capabilities", Map.of( - "roots", Map.of("listChanged", false), - "sampling", Map.of()), - "clientInfo", Map.of( - "name", "xz-mcp-broker", - "version", "0.0.1")), - 1); - client.sendJson(initializeRequest); + client.sendText(XiaoZhiMcpJsonRpcJson.getInitializeJson()); // 等待初始化响应 (id=1) - 移除固定延迟,改为响应驱动 List initResponses = client.listenerWithoutClose(response -> { @@ -125,13 +115,10 @@ public class AgentMcpAccessPointServiceImpl implements AgentMcpAccessPointServic // 步骤2: 发送初始化完成通知 - 只有在收到initialize响应后才发送 log.info("发送MCP初始化完成通知,智能体ID: {}", id); - String notificationJson = "{\"jsonrpc\":\"2.0\",\"method\":\"notifications/initialized\"}"; - client.sendText(notificationJson); - + client.sendText(XiaoZhiMcpJsonRpcJson.getNotificationsInitializedJson()); // 步骤3: 发送工具列表请求 - 立即发送,无需额外延迟 log.info("发送MCP工具列表请求,智能体ID: {}", id); - McpJsonRpcRequest toolsRequest = new McpJsonRpcRequest("tools/list", null, 2); - client.sendJson(toolsRequest); + client.sendText(XiaoZhiMcpJsonRpcJson.getToolsListJson()); // 等待工具列表响应 (id=2) List toolsResponses = client.listener(response -> {