| | |
| | | private final ObjectMapper objectMapper; |
| | | private final BuiltinMcpToolRegistry builtinMcpToolRegistry; |
| | | |
| | | /** |
| | | * 把一组 MCP 挂载记录解析成一次对话可直接使用的运行时对象。 |
| | | * 该方法统一处理内置 MCP、远程 SSE MCP 和本地 STDIO MCP, |
| | | * 同时收集挂载成功项、失败项以及最终暴露给模型的工具回调列表。 |
| | | */ |
| | | @Override |
| | | public McpMountRuntime create(List<AiMcpMount> mounts, Long userId) { |
| | | List<McpSyncClient> clients = new ArrayList<>(); |
| | |
| | | } |
| | | |
| | | private List<ToolCallback> wrapMountedCallbacks(List<ToolCallback> source, String mountName) { |
| | | /** 为每个工具回调补上挂载来源,便于后续审计、观测和前端工具轨迹展示。 */ |
| | | List<ToolCallback> mountedCallbacks = new ArrayList<>(); |
| | | for (ToolCallback callback : source) { |
| | | if (callback == null) { |
| | |
| | | } |
| | | |
| | | private void ensureUniqueToolNames(List<ToolCallback> callbacks) { |
| | | /** 确保多挂载聚合后不会出现同名工具,否则模型侧无法正确分辨工具定义。 */ |
| | | LinkedHashSet<String> duplicateNames = new LinkedHashSet<>(); |
| | | LinkedHashSet<String> seenNames = new LinkedHashSet<>(); |
| | | for (ToolCallback callback : callbacks) { |
| | |
| | | } |
| | | |
| | | private McpSyncClient createClient(AiMcpMount mount) { |
| | | /** |
| | | * 按挂载配置动态创建 MCP Client。 |
| | | * 该方法只负责 transport 层初始化,不负责工具去重和错误聚合。 |
| | | */ |
| | | Duration timeout = Duration.ofMillis(mount.getRequestTimeoutMs() == null |
| | | ? AiDefaults.DEFAULT_TIMEOUT_MS |
| | | : mount.getRequestTimeoutMs()); |
| | |
| | | } |
| | | |
| | | private List<String> readStringList(String json) { |
| | | /** 解析挂载表里的 JSON 数组配置,例如 STDIO args。 */ |
| | | if (!StringUtils.hasText(json)) { |
| | | return Collections.emptyList(); |
| | | } |
| | |
| | | } |
| | | |
| | | private Map<String, String> readStringMap(String json) { |
| | | /** 解析挂载表里的 JSON Map 配置,例如 headers 或环境变量。 */ |
| | | if (!StringUtils.hasText(json)) { |
| | | return Collections.emptyMap(); |
| | | } |
| | |
| | | private final List<String> mountedNames; |
| | | private final List<String> errors; |
| | | |
| | | /** 运行时对象本身只做数据封装和资源释放,不引入额外业务逻辑。 */ |
| | | private DefaultMcpMountRuntime(List<McpSyncClient> clients, ToolCallback[] callbacks, List<String> mountedNames, List<String> errors) { |
| | | this.clients = clients; |
| | | this.callbacks = callbacks; |
| | |
| | | |
| | | @Override |
| | | public void close() { |
| | | /** 统一关闭本次运行时里创建的外部 MCP Client,避免连接泄漏。 */ |
| | | for (McpSyncClient client : clients) { |
| | | try { |
| | | client.close(); |
| | |
| | | private final ToolCallback delegate; |
| | | private final String mountName; |
| | | |
| | | /** 装饰器仅补充挂载来源,不改变底层工具定义和调用行为。 */ |
| | | private MountedToolCallbackImpl(ToolCallback delegate, String mountName) { |
| | | this.delegate = delegate; |
| | | this.mountName = mountName; |