每轮把内置工具和已连接 MCP 工具组装成一个工具池。
| 13 | * 每轮把内置工具和已连接 MCP 工具组装成一个工具池。 |
| 14 | */ |
| 15 | public class McpToolPool { |
| 16 | |
| 17 | private final List<Tool> builtinTools; |
| 18 | |
| 19 | private final McpManager mcpManager; |
| 20 | |
| 21 | public McpToolPool(List<Tool> builtinTools, McpManager mcpManager) { |
| 22 | this.builtinTools = builtinTools; |
| 23 | this.mcpManager = mcpManager; |
| 24 | } |
| 25 | |
| 26 | public ToolRegistry assemble() { |
| 27 | ToolRegistry registry = new ToolRegistry(); |
| 28 | Set<String> names = new LinkedHashSet<>(); |
| 29 | |
| 30 | for (Tool tool : builtinTools) { |
| 31 | String name = tool.getDefinition().getName(); |
| 32 | if (names.add(name)) { |
| 33 | registry.register(tool); |
| 34 | } |
| 35 | } |
| 36 | |
| 37 | ConnectMcpTool connectMcpTool = new ConnectMcpTool(mcpManager); |
| 38 | String connectName = connectMcpTool.getDefinition().getName(); |
| 39 | if (names.add(connectName)) { |
| 40 | registry.register(connectMcpTool); |
| 41 | } |
| 42 | |
| 43 | for (McpClient client : mcpManager.connectedClients()) { |
| 44 | for (McpToolDefinition definition : client.getTools()) { |
| 45 | String name = McpToolName.prefixed(client.getName(), definition.getName()); |
| 46 | if (names.add(name)) { |
| 47 | registry.register(new McpTool(client, definition)); |
| 48 | } |
| 49 | else { |
| 50 | // 重复工具名跳过,避免后注册工具覆盖已有工具。 |
| 51 | System.out.println("[mcp] skipped duplicate tool: " + name); |
| 52 | } |
| 53 | } |
| 54 | } |
| 55 | return registry; |
| 56 | } |
| 57 | } |
nothing calls this directly
no outgoing calls
no test coverage detected