UNPKG

@xiaohui-wang/mcpadvisor

Version:

MCP Advisor & Installation - Find the right MCP server for your needs

90 lines (89 loc) 3.69 kB
import logger from '../../../../utils/logger.js'; export class RequestHandlerFactory { static createListToolsHandler(toolHandlers) { return async () => { logger.debug('Handling ListTools request'); return { tools: toolHandlers.map(handler => handler.getToolDefinition()), }; }; } static createCallToolHandler(toolHandlers) { return async (request) => { const { name } = request.params; logger.info(`Handling tool call: ${name}`); try { const handler = toolHandlers.find(h => h.canHandle(name)); if (!handler) { return RequestHandlerFactory.createErrorResponse(`Unknown tool: ${name}`); } return await handler.handleRequest(request); } catch (error) { const message = error instanceof Error ? error.message : String(error); logger.error(`Error handling request: ${message}`); return RequestHandlerFactory.createErrorResponse(message); } }; } static createListResourcesHandler(resourceHandlers) { return async () => { logger.debug('Handling ListResources request'); try { const allResources = []; for (const handler of resourceHandlers) { const resources = await handler.listResources(); allResources.push(...resources); } logger.info(`Listed ${allResources.length} resources`); return { resources: allResources }; } catch (error) { const message = error instanceof Error ? error.message : String(error); logger.error(`Error listing resources: ${message}`); return { resources: [] }; } }; } static createReadResourceHandler(resourceHandlers) { return async (request) => { const { uri } = request.params; logger.info(`Handling resource read: ${uri}`); try { // Find a handler that supports this URI let supportingHandler = null; for (const handler of resourceHandlers) { const supports = typeof handler.supportsUri === 'function' ? await handler.supportsUri(uri) : handler.supportsUri(uri); if (supports) { supportingHandler = handler; break; } } if (!supportingHandler) { const errorMessage = `No handler found for URI: ${uri}`; logger.error(errorMessage); return RequestHandlerFactory.createErrorResponse(errorMessage); } const content = await supportingHandler.readResource(uri); logger.info(`Successfully read resource: ${uri}`); return content; } catch (error) { const message = error instanceof Error ? error.message : String(error); logger.error(`Error reading resource: ${message}`, 'RequestHandlerFactory', { error, uri }); return RequestHandlerFactory.createErrorResponse(message); } }; } static createErrorResponse(message) { return { content: [{ type: 'text', text: `Error: ${message}`, }], isError: true, }; } }