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 9198fe29..c962e25f 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 @@ -3,6 +3,7 @@ package xiaozhi.modules.agent.service.impl; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import xiaozhi.common.constant.Constant; import xiaozhi.common.utils.AESUtils; @@ -28,35 +29,75 @@ public class AgentMcpAccessPointServiceImpl implements AgentMcpAccessPointServic 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的url前缀 + String agentMcpUrl = getAgentMcpUrl(uri); + // 获取密钥 + String key = getSecretKey(uri); + // 获取加密的token + String encryptToken = encryptToken(id, key); // 返回智能体Mcp路径的格式 - String AgentMcpUrl = "%s:%s/mcp?token=%s"; - return AgentMcpUrl.formatted(wsScheme,path,encryptToken); + String AgentMcpUrl = "%s/mcp?token=%s"; + return AgentMcpUrl.formatted(agentMcpUrl,encryptToken); } catch (URISyntaxException e) { log.error("路径格式不正确路径:{},\n错误信息:{}",url,e.getMessage()); throw new RuntimeException("mcp的地址存在错误,请进入参数管理修改mcp接入点地址"); } } - @Override public List getAgentMcpToolsList(String id) { - return List.of(); + List list = List.of(); + String url = sysParamsService.getValue(Constant.SERVER_MCP_ENDPOINT, true); + if (StringUtils.isBlank(url)) { + return list; + } + + return list; + } + + /** + * 获取密钥 + * @param uri mcp地址 + * @return 密钥 + */ + private static String getSecretKey(URI uri) { + // 获取参数 + String query = uri.getQuery(); + // 获取aes加密密钥 + String str = "key="; + return query.substring(query.indexOf(str) + str.length()); + } + + /** + * 获取智能体mcp接入点url + * @param uri mcp地址 + * @return 智能体mcp接入点url + */ + private String getAgentMcpUrl(URI uri) { + // 获取协议 + String wsScheme = (uri.getScheme().equals("https")) ? "wss" : "ws" ; + // 获取主机,端口,路径 + String path = uri.getSchemeSpecificPart(); + // 获取到最后一个/前的path + path = path.substring(0,path.lastIndexOf("/")); + return wsScheme+":"+path; + } + + + + + /** + * 获取对智能体id加密的token + * @param agentId 智能体id + * @param key 加密密钥 + * @return 加密后token + */ + private static String encryptToken(String agentId, String key) { + // 使用md5对智能体id进行加密 + String md5 = HashEncryptionUtil.Md5hexDigest(agentId); + // aes需要加密文本 + String json = "{\"agentId\": %s}".formatted(md5); + // 加密后成token值 + return AESUtils.encrypt(key, json); } }