fix: pre-initialize dynamic mcp servers so endpoints are always open even when no tools are synced
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user