in spring-ai-alibaba-mcp/spring-ai-alibaba-mcp-nacos-dynamic-server/src/main/java/com/alibaba/cloud/ai/mcp/dynamic/server/callback/DynamicNacosToolCallbackV3.java [78:133]
private Mono<String> processToolRequest(String configJson, Map<String, Object> args, String baseUrl) {
try {
JsonNode toolConfig = objectMapper.readTree(configJson);
logger.info("[executeToolRequest] toolConfig: {}", toolConfig);
logger.info("[processToolRequest] toolConfig: {} args: {} baseUrl: {}", toolConfig, args, baseUrl);
JsonNode argsNode = toolConfig.path("args");
Map<String, Object> processedArgs;
if (!argsNode.isMissingNode() && argsNode.isArray() && argsNode.size() > 0) {
processedArgs = processArguments(argsNode, args);
logger.info("[processToolRequest] processedArgs from args: {}", processedArgs);
}
else if (!toolConfig.path("inputSchema").isMissingNode() && toolConfig.path("inputSchema").isObject()) {
// 从 inputSchema.properties 解析参数
JsonNode properties = toolConfig.path("inputSchema").path("properties");
if (properties.isObject()) {
processedArgs = new HashMap<>();
properties.fieldNames().forEachRemaining(field -> {
if (args.containsKey(field)) {
processedArgs.put(field, args.get(field));
}
});
logger.info("[processToolRequest] processedArgs from inputSchema: {}", processedArgs);
}
else {
processedArgs = args;
logger.info("[processToolRequest] inputSchema.properties missing, use original args: {}",
processedArgs);
}
}
else {
processedArgs = args;
logger.info("[processToolRequest] no args or inputSchema, use original args: {}", processedArgs);
}
JsonNode requestTemplate = toolConfig.path("requestTemplate");
String url = requestTemplate.path("url").asText();
String method = requestTemplate.path("method").asText();
logger.info("[processToolRequest] requestTemplate: {} url: {} method: {}", requestTemplate, url, method);
// 检查URL和方法
if (url.isEmpty() || method.isEmpty()) {
return Mono.error(new IllegalArgumentException("URL and method are required"));
}
// 创建WebClient
baseUrl = baseUrl != null ? baseUrl : "http://localhost";
WebClient client = webClientBuilder.baseUrl(baseUrl).build();
// 构建并执行请求
return buildAndExecuteRequest(client, requestTemplate, toolConfig.path("responseTemplate"), processedArgs,
baseUrl);
}
catch (Exception e) {
logger.error("Failed to process tool request", e);
return Mono.error(e);
}
}