fix: pre-initialize dynamic mcp servers so endpoints are always open even when no tools are synced

This commit is contained in:
jade
2026-07-15 22:50:35 +09:00
parent 2846dacab0
commit c6edd671e2

View File

@@ -45,15 +45,21 @@ public class DynamicMcpServerManager {
public DynamicMcpServerManager(RegistryMcpToolSpecificationFactory specificationFactory) { public DynamicMcpServerManager(RegistryMcpToolSpecificationFactory specificationFactory) {
this.specificationFactory = specificationFactory; this.specificationFactory = specificationFactory;
// Pre-initialize basic categories so their endpoints are always open
// even if there are 0 tools registered in Redis initially.
getOrCreateServer("common");
getOrCreateServer("hr");
getOrCreateServer("payment");
getOrCreateServer("sms");
getOrCreateServer("email");
getOrCreateServer("other");
} }
public void synchronizeCategory(String categoryKey, List<ToolMetadata> tools) { private McpSyncServer getOrCreateServer(String categoryKey) {
if (categoryKey == null || categoryKey.trim().isEmpty()) { String safeCategory = (categoryKey == null || categoryKey.trim().isEmpty()) ? "common" : categoryKey.toLowerCase();
categoryKey = "common";
}
String safeCategory = categoryKey.toLowerCase();
McpSyncServer server = categoryServers.computeIfAbsent(safeCategory, key -> { return categoryServers.computeIfAbsent(safeCategory, key -> {
log.info("Creating dynamic MCP Server for category: {}", key); log.info("Creating dynamic MCP Server for category: {}", key);
String ssePath = "common".equals(key) ? "/mcp/sse" : "/mcp/sse/" + key; String ssePath = "common".equals(key) ? "/mcp/sse" : "/mcp/sse/" + key;
String msgPath = "common".equals(key) ? "/mcp/message" : "/mcp/message/" + key; String msgPath = "common".equals(key) ? "/mcp/message" : "/mcp/message/" + key;
@@ -71,6 +77,11 @@ public class DynamicMcpServerManager {
managedToolNamesPerCategory.put(key, ConcurrentHashMap.newKeySet()); managedToolNamesPerCategory.put(key, ConcurrentHashMap.newKeySet());
return newServer; return newServer;
}); });
}
public void synchronizeCategory(String categoryKey, List<ToolMetadata> tools) {
String safeCategory = (categoryKey == null || categoryKey.trim().isEmpty()) ? "common" : categoryKey.toLowerCase();
McpSyncServer server = getOrCreateServer(safeCategory);
Set<String> managedToolNames = managedToolNamesPerCategory.get(safeCategory); Set<String> managedToolNames = managedToolNamesPerCategory.get(safeCategory);
Set<String> activeNames = tools.stream() Set<String> activeNames = tools.stream()