in spring-ai-alibaba-mcp/spring-ai-alibaba-mcp-nacos-dynamic-server/src/main/java/com/alibaba/cloud/ai/mcp/dynamic/server/tools/DynamicToolsInitializer.java [108:167]
private List<ToolCallback> parseMcpServerInfo(Map<String, Object> mcpServerInfo) {
Object mcpName = mcpServerInfo.get("name");
try {
if (mcpServerInfo.containsKey("data")) {
Map<String, Object> data = (Map<String, Object>) mcpServerInfo.get("data");
if (data != null && data.containsKey("toolSpec")) {
// 解析工具信息
Object toolSpec = data.get("toolSpec");
Object remoteServerConfig = data.get("remoteServerConfig");
Object localeServerConfig = data.get("localeServerConfig");
String protocol = (String) data.get("protocol");
if (toolSpec != null) {
Map<String, Object> toolSpecMap = JacksonUtils.toObj(JacksonUtils.toJson(toolSpec), Map.class);
List<Map<String, Object>> tools = (List<Map<String, Object>>) toolSpecMap.get("tools");
Map<String, Object> toolsMeta = (Map<String, Object>) toolSpecMap.get("toolsMeta");
List<ToolCallback> toolCallbacks = new ArrayList<>();
for (Map<String, Object> tool : tools) {
String toolName = (String) tool.get("name");
String toolDescription = (String) tool.get("description");
Object inputSchema = tool.get("inputSchema");
Object metaInfo = toolsMeta.getOrDefault(toolName, new Object());
// 判断 metaInfo.enabled 是否为 true
boolean enabled = false;
if (metaInfo instanceof Map) {
Object enabledObj = ((Map<?, ?>) metaInfo).get("enabled");
if (enabledObj instanceof Boolean) {
enabled = (Boolean) enabledObj;
}
else if (enabledObj instanceof String) {
enabled = Boolean.parseBoolean((String) enabledObj);
}
}
if (!enabled) {
logger.info("Tool {} is disabled by metaInfo, skipping.", toolName);
continue;
}
ToolDefinition toolDefinition = DynamicNacosToolDefinitionV3.builder()
.name(toolName)
.description(toolDescription)
.inputSchema(inputSchema)
.protocol(protocol)
.remoteServerConfig(remoteServerConfig)
.localServerConfig(localeServerConfig)
.toolsMeta(metaInfo)
.build();
toolCallbacks.add(new DynamicNacosToolCallbackV3(toolDefinition));
}
return toolCallbacks;
}
}
}
}
catch (Exception e) {
logger.warn("Failed to get or parse nacos mcp server info (mcpName {})", mcpName, e);
}
return null;
}