From 0631fe37ead25c97f40b0bf46b86e7e47faa6bea Mon Sep 17 00:00:00 2001 From: JianYu Zheng <2375294554@qq.com> Date: Wed, 25 Jun 2025 16:37:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=9A=E8=8E=B7=E5=8F=96=E6=99=BA=E8=83=BD=E4=BD=93=E7=9A=84?= =?UTF-8?q?Mcp=E6=8E=A5=E5=85=A5=E7=82=B9=E5=9C=B0=E5=9D=80=EF=BC=88/agent?= =?UTF-8?q?/mcp/address/{audioId}=EF=BC=89=20--AgentMcpAccessPointServiceI?= =?UTF-8?q?mpl.java=20=E5=AE=9E=E7=8E=B0=E8=8E=B7=E5=8F=96=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E4=BD=93=E7=9A=84mcp=E6=8E=A5=E5=85=A5=E7=82=B9?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=AE=9A=E4=B9=89=20--AgentMcpAccessPointCon?= =?UTF-8?q?troller.java=20=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96=E6=99=BA?= =?UTF-8?q?=E8=83=BD=E4=BD=93=E7=9A=84Mcp=E6=8E=A5=E5=85=A5=E7=82=B9?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AgentMcpAccessPointController.java | 31 ++++++++++ .../impl/AgentMcpAccessPointServiceImpl.java | 62 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java create mode 100644 main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java new file mode 100644 index 00000000..9792fd0f --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java @@ -0,0 +1,31 @@ +package xiaozhi.modules.agent.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import xiaozhi.common.utils.Result; +import xiaozhi.modules.agent.service.AgentMcpAccessPointService; + +@Tag(name = "智能体Mcp接入点管理") +@RequiredArgsConstructor +@RestController +@RequestMapping("/agent/mcp") +public class AgentMcpAccessPointController { + private final AgentMcpAccessPointService agentMcpAccessPointService; + + /** + * 获取智能体的Mcp接入点地址 + * @param audioId 智能体id + * @return 返回错误提醒或者Mcp接入点地址 + */ + @Operation(summary = "获取智能体的Mcp接入点地址") + @GetMapping("/address/{audioId}") + public Result getAgentMcpAccessAddress(@PathVariable("audioId") String audioId) { + String agentMcpAccessAddress = agentMcpAccessPointService.getAgentMcpAccessAddress(audioId); + if (agentMcpAccessAddress == null) { + return new Result().error("请进入参数管理配置mcp接入点地址"); + } + return new Result().ok(agentMcpAccessAddress); + } +} 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 new file mode 100644 index 00000000..9198fe29 --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentMcpAccessPointServiceImpl.java @@ -0,0 +1,62 @@ +package xiaozhi.modules.agent.service.impl; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import xiaozhi.common.constant.Constant; +import xiaozhi.common.utils.AESUtils; +import xiaozhi.common.utils.HashEncryptionUtil; +import xiaozhi.modules.agent.service.AgentMcpAccessPointService; +import xiaozhi.modules.sys.service.SysParamsService; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.List; + +@AllArgsConstructor +@Service +@Slf4j +public class AgentMcpAccessPointServiceImpl implements AgentMcpAccessPointService { + private SysParamsService sysParamsService; + + @Override + public String getAgentMcpAccessAddress(String id) { + // 获取到mcp的地址 + String url = sysParamsService.getValue(Constant.SERVER_MCP_ENDPOINT, true); + if (StringUtils.isBlank(url)) { + return null; + } + try { + // 使用md5对智能体id进行加密 + String md5 = HashEncryptionUtil.Md5hexDigest(id); + // aes需要加密文本 + String json = "{\"agentId\": %s}".formatted(md5); + URI uri = new URI(url); + String query = uri.getQuery(); + // 获取aes加密密钥 + String str = "key="; + String key = query.substring(query.indexOf(str) + str.length()); + // 加密后成token值 + String encryptToken = AESUtils.encrypt(key, json); + // 获取路径组成部分 + // 获取协议 + String wsScheme = (uri.getScheme().equals("https")) ? "wss" : "ws" ; + // 获取主机,端口,路径 + String path = uri.getSchemeSpecificPart(); + // 获取参数 + path = path.substring(0,path.lastIndexOf("/")); + // 返回智能体Mcp路径的格式 + String AgentMcpUrl = "%s:%s/mcp?token=%s"; + return AgentMcpUrl.formatted(wsScheme,path,encryptToken); + } catch (URISyntaxException e) { + log.error("路径格式不正确路径:{},\n错误信息:{}",url,e.getMessage()); + throw new RuntimeException("mcp的地址存在错误,请进入参数管理修改mcp接入点地址"); + } + } + + @Override + public List getAgentMcpToolsList(String id) { + return List.of(); + } +}