import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { Inject, Injectable, Logger, Optional, Scope } from '@nestjs/common'; import { ModuleRef, Reflector } from '@nestjs/core'; import { McpRegistryDiscoveryService } from './mcp-registry-discovery.service'; import { McpToolsHandler } from './handlers/mcp-tools.handler'; import { McpResourcesHandler } from './handlers/mcp-resources.handler'; import { McpPromptsHandler } from './handlers/mcp-prompts.handler'; import { HttpRequest } from '../interfaces/http-adapter.interface'; import { ToolAuthorizationService } from './tool-authorization.service'; import type { McpOptions } from '../interfaces/mcp-options.interface'; import { createMcpLogger } from '../utils/mcp-logger.factory'; /** * Request-scoped service for executing MCP tools */ @Injectable({ scope: Scope.REQUEST }) export class McpExecutorService { private logger: Logger; private toolsHandler: McpToolsHandler; private resourcesHandler: McpResourcesHandler; private promptsHandler: McpPromptsHandler; constructor( moduleRef: ModuleRef, registry: McpRegistryDiscoveryService, @Inject('MCP_MODULE_ID') mcpModuleId: string, @Inject('MCP_OPTIONS') options: McpOptions, authService: ToolAuthorizationService, reflector: Reflector, ) { this.logger = createMcpLogger(McpExecutorService.name, options); this.toolsHandler = new McpToolsHandler( moduleRef, registry, reflector, mcpModuleId, options, authService, ); this.resourcesHandler = new McpResourcesHandler( moduleRef, registry, reflector, mcpModuleId, ); this.promptsHandler = new McpPromptsHandler( moduleRef, registry, reflector, mcpModuleId, ); } /** * Register tool-related request handlers with the MCP server * @param mcpServer - The MCP server instance * @param request - The current HTTP request object */ registerRequestHandlers(mcpServer: McpServer, httpRequest: HttpRequest) { this.toolsHandler.registerHandlers(mcpServer, httpRequest); this.resourcesHandler.registerHandlers(mcpServer, httpRequest); this.promptsHandler.registerHandlers(mcpServer, httpRequest); } }