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 [282:350]
public String call(@NonNull final String input, final ToolContext toolContext) {
try {
logger.info("[call] input: {} toolContext: {}", input, JacksonUtils.toJson(toolContext));
// input解析
logger.info("[call] input string: {}", input);
Map<String, Object> args = new HashMap<>();
if (!input.isEmpty()) {
try {
args = objectMapper.readValue(input, Map.class);
logger.info("[call] parsed args: {}", args);
}
catch (Exception e) {
logger.error("[call] Failed to parse input to args", e);
}
}
DynamicNacosToolDefinitionV3 nacosToolDefinition = (DynamicNacosToolDefinitionV3) this.toolDefinition;
logger.info("Tool callback toolDefinition: {}", JacksonUtils.toJson(nacosToolDefinition));
Object remoteServerConfig = nacosToolDefinition.getRemoteServerConfig();
String protocol = nacosToolDefinition.getProtocol();
if ("http".equalsIgnoreCase(protocol) || "https".equalsIgnoreCase(protocol)) {
Map<String, Object> configMap = (Map<String, Object>) remoteServerConfig;
Object serviceRef = configMap.get("serviceRef");
if (serviceRef != null) {
Map<String, Object> refMap = (Map<String, Object>) serviceRef;
String serviceName = (String) refMap.get("serviceName");
String groupName = (String) refMap.get("groupName");
Instance instance = namingService.selectOneHealthyInstance(serviceName, groupName);
logger.info("Tool callback instance: {}", JacksonUtils.toJson(instance));
Map<String, Object> toolsMeta = (Map<String, Object>) nacosToolDefinition.getToolsMeta();
String baseUrl = "http://" + instance.getIp() + ":" + instance.getPort();
if (toolsMeta != null && toolsMeta.containsKey("templates")) {
Map<String, Object> templates = (Map<String, Object>) toolsMeta.get("templates");
if (templates != null && templates.containsKey("json-go-template")) {
Object jsonGoTemplate = templates.get("json-go-template");
try {
logger.info("[call] json-go-template: {}",
objectMapper.writeValueAsString(jsonGoTemplate));
}
catch (JsonProcessingException e) {
logger.error("[call] Failed to serialize json-go-template", e);
}
try {
// 调用executeToolRequest
String configJson = objectMapper.writeValueAsString(jsonGoTemplate);
logger.info("[executeToolRequest] configJson: {} args: {} baseUrl: {}", configJson,
args, baseUrl);
return processToolRequest(configJson, args, baseUrl).block();
}
catch (Exception e) {
logger.error("Failed to execute tool request", e);
return "";
}
}
}
else {
logger.warn("[call] templates not found in toolsMeta");
}
}
}
return "";
}
catch (NacosException e) {
throw new RuntimeException(e);
}
}