@1mcp/agent
Version:
One MCP server to aggregate them all - A unified Model Context Protocol server implementation
47 lines (46 loc) • 2.21 kB
JavaScript
import logger from '../logger/logger.js';
import { setupClientToServerNotifications, setupServerToClientNotifications, } from '../handlers/notificationHandlers.js';
import { registerRequestHandlers } from '../handlers/requestHandlers.js';
/**
* Collects capabilities from all clients and registers them with the server
* @param clients Record of client instances
* @param server The MCP server instance
* @param tags Array of tags to filter clients by
* @returns The combined server capabilities
*/
export async function setupCapabilities(clients, serverInfo) {
// Collect capabilities from all clients
const capabilities = collectCapabilities(clients);
// Set up notification handlers
setupClientToServerNotifications(clients, serverInfo);
setupServerToClientNotifications(clients, serverInfo);
// Register request handlers based on capabilities
registerRequestHandlers(clients, serverInfo);
return capabilities;
}
/**
* Collects capabilities from all clients
* @param clients Record of client instances
* @returns The combined server capabilities
*/
function collectCapabilities(clients) {
const capabilities = {};
for (const [name, clientInfo] of Object.entries(clients)) {
try {
const serverCapabilities = clientInfo.client.getServerCapabilities() || {};
logger.debug(`Capabilities from ${name}: ${JSON.stringify(serverCapabilities)}`);
// Store capabilities per client
clientInfo.capabilities = serverCapabilities;
// Aggregate capabilities
capabilities.resources = { ...capabilities.resources, ...serverCapabilities.resources };
capabilities.tools = { ...capabilities.tools, ...serverCapabilities.tools };
capabilities.prompts = { ...capabilities.prompts, ...serverCapabilities.prompts };
capabilities.experimental = { ...capabilities.experimental, ...serverCapabilities.experimental };
capabilities.logging = { ...capabilities.logging, ...serverCapabilities.logging };
}
catch (error) {
logger.error(`Failed to get capabilities from ${name}: ${error}`);
}
}
return capabilities;
}