{"version":3,"file":"index.mjs","sources":["../../../src/services/mcp/index.ts"],"sourcesContent":["import type { Core, Modules } from '@strapi/types';\nimport { createMcpAdminTokenAuthenticator } from './authentication';\nimport { createPostHandler } from './handlers/handlePost';\nimport type { McpHandlerDependencies } from './handlers/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport { McpConfiguration } from './internal/McpConfiguration';\nimport { createMcpServerWithRegistries } from './internal/McpServerFactory';\nimport { createOAuthDiscoveryFallbackMiddleware } from './middleware/oauthDiscoveryFallback';\nimport { createMcpRoutes } from './routes';\nimport { sendDidStartMcpServer } from './metrics/metrics';\nimport { logToolDefinition } from './tools/log';\n\n/**\n * Creates an MCP service instance for Strapi Core\n */\nexport const createMcpService = (strapi: Core.Strapi): Modules.MCP.McpService => {\n  // Initialize configuration\n  const config = new McpConfiguration(strapi);\n\n  const authenticationStrategy = createMcpAdminTokenAuthenticator(strapi);\n\n  // Status tracking\n  let serverStatus: Modules.MCP.McpServiceStatus = 'idle';\n\n  // Definition registries\n  const toolDefinitions = new McpCapabilityDefinitionRegistry<\n    'tool',\n    Modules.MCP.McpToolDefinition\n  >('tool');\n\n  const promptDefinitions = new McpCapabilityDefinitionRegistry<\n    'prompt',\n    Modules.MCP.McpPromptDefinition\n  >('prompt');\n\n  const resourceDefinitions = new McpCapabilityDefinitionRegistry<\n    'resource',\n    Modules.MCP.McpResourceDefinition\n  >('resource');\n\n  // Prepare handler dependencies\n  const handlerDependencies: McpHandlerDependencies = {\n    strapi,\n    authenticationStrategy,\n    config,\n    createServerWithRegistries: createMcpServerWithRegistries,\n    capabilityDefinitions: {\n      tools: toolDefinitions,\n      prompts: promptDefinitions,\n      resources: resourceDefinitions,\n    },\n  };\n\n  // Create HTTP handlers\n  const handlePost = createPostHandler(handlerDependencies);\n\n  const service: Modules.MCP.McpService = {\n    isEnabled() {\n      return config.isEnabled();\n    },\n\n    isRunning() {\n      return serverStatus === 'running';\n    },\n\n    registerTool(tool: Modules.MCP.McpToolDefinition) {\n      if (serverStatus !== 'idle') {\n        throw new Error('[MCP] Cannot register tools after the MCP server has started.');\n      }\n\n      toolDefinitions.define(tool);\n    },\n\n    registerPrompt(prompt) {\n      if (serverStatus !== 'idle') {\n        throw new Error('[MCP] Cannot register prompts after the MCP server has started.');\n      }\n      promptDefinitions.define(prompt);\n    },\n\n    registerResource(resource) {\n      if (serverStatus !== 'idle') {\n        throw new Error('[MCP] Cannot register resources after the MCP server has started.');\n      }\n      resourceDefinitions.define(resource);\n    },\n\n    async start() {\n      if (service.isEnabled() === false) {\n        strapi.log.debug('[MCP] Server is disabled');\n        return;\n      }\n      if (serverStatus === 'error') {\n        throw new Error('[MCP] Cannot start server: previous error state');\n      }\n      if (serverStatus !== 'idle') {\n        throw new Error(`[MCP] Server already started or starting (status: ${serverStatus})`);\n      }\n      serverStatus = 'starting';\n\n      strapi.server.use(createOAuthDiscoveryFallbackMiddleware());\n\n      const routes = createMcpRoutes(config, { handlePost });\n      strapi.server.routes(routes);\n\n      serverStatus = 'running';\n\n      sendDidStartMcpServer(strapi, {\n        path: config.path,\n        numberOfTools: toolDefinitions.size,\n        numberOfPrompts: promptDefinitions.size,\n        numberOfResources: resourceDefinitions.size,\n      });\n\n      const baseUrl = strapi.config.get('server.url', 'http://localhost:1337');\n      strapi.log.info(`[MCP] Server available at ${baseUrl}${config.path}`);\n    },\n\n    async stop() {\n      serverStatus = 'idle';\n      strapi.log.info('[MCP] Service stopped');\n    },\n  };\n\n  service.registerTool(logToolDefinition);\n\n  return service;\n};\n"],"names":["createMcpService","strapi","config","McpConfiguration","authenticationStrategy","createMcpAdminTokenAuthenticator","serverStatus","toolDefinitions","McpCapabilityDefinitionRegistry","promptDefinitions","resourceDefinitions","handlerDependencies","createServerWithRegistries","createMcpServerWithRegistries","capabilityDefinitions","tools","prompts","resources","handlePost","createPostHandler","service","isEnabled","isRunning","registerTool","tool","Error","define","registerPrompt","prompt","registerResource","resource","start","log","debug","server","use","createOAuthDiscoveryFallbackMiddleware","routes","createMcpRoutes","sendDidStartMcpServer","path","numberOfTools","size","numberOfPrompts","numberOfResources","baseUrl","get","info","stop","logToolDefinition"],"mappings":"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"}