@strapi/core 5.52.3 → 5.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/container.d.ts +1 -0
  2. package/dist/container.d.ts.map +1 -1
  3. package/dist/container.js +3 -0
  4. package/dist/container.js.map +1 -1
  5. package/dist/container.mjs +3 -0
  6. package/dist/container.mjs.map +1 -1
  7. package/dist/core-api/controller/single-type.d.ts.map +1 -1
  8. package/dist/core-api/controller/single-type.js +7 -4
  9. package/dist/core-api/controller/single-type.js.map +1 -1
  10. package/dist/core-api/controller/single-type.mjs +7 -4
  11. package/dist/core-api/controller/single-type.mjs.map +1 -1
  12. package/dist/package.json.js +19 -15
  13. package/dist/package.json.js.map +1 -1
  14. package/dist/package.json.mjs +19 -15
  15. package/dist/package.json.mjs.map +1 -1
  16. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  17. package/dist/services/document-service/transform/query.js +4 -2
  18. package/dist/services/document-service/transform/query.js.map +1 -1
  19. package/dist/services/document-service/transform/query.mjs +4 -2
  20. package/dist/services/document-service/transform/query.mjs.map +1 -1
  21. package/dist/services/entity-validator/blocks-validator.d.ts.map +1 -1
  22. package/dist/services/entity-validator/blocks-validator.js +9 -3
  23. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  24. package/dist/services/entity-validator/blocks-validator.mjs +9 -3
  25. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  26. package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -1
  27. package/dist/services/mcp/handlers/handlePost.js +2 -3
  28. package/dist/services/mcp/handlers/handlePost.js.map +1 -1
  29. package/dist/services/mcp/handlers/handlePost.mjs +2 -3
  30. package/dist/services/mcp/handlers/handlePost.mjs.map +1 -1
  31. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +1 -1
  32. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -1
  33. package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -1
  34. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -1
  35. package/dist/services/mcp/internal/McpServerFactory.d.ts +1 -1
  36. package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -1
  37. package/dist/services/mcp/internal/McpServerFactory.js +2 -3
  38. package/dist/services/mcp/internal/McpServerFactory.js.map +1 -1
  39. package/dist/services/mcp/internal/McpServerFactory.mjs +1 -2
  40. package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -1
  41. package/dist/services/mcp/prompt-registry.d.ts +1 -1
  42. package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
  43. package/dist/services/mcp/prompt-registry.js +18 -4
  44. package/dist/services/mcp/prompt-registry.js.map +1 -1
  45. package/dist/services/mcp/prompt-registry.mjs +18 -4
  46. package/dist/services/mcp/prompt-registry.mjs.map +1 -1
  47. package/dist/services/mcp/resource-registry.d.ts +1 -1
  48. package/dist/services/mcp/resource-registry.d.ts.map +1 -1
  49. package/dist/services/mcp/resource-registry.js +4 -2
  50. package/dist/services/mcp/resource-registry.js.map +1 -1
  51. package/dist/services/mcp/resource-registry.mjs +4 -2
  52. package/dist/services/mcp/resource-registry.mjs.map +1 -1
  53. package/dist/services/mcp/tool-registry.d.ts +1 -1
  54. package/dist/services/mcp/tool-registry.d.ts.map +1 -1
  55. package/dist/services/mcp/tool-registry.js +18 -11
  56. package/dist/services/mcp/tool-registry.js.map +1 -1
  57. package/dist/services/mcp/tool-registry.mjs +18 -11
  58. package/dist/services/mcp/tool-registry.mjs.map +1 -1
  59. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts +7 -0
  60. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts.map +1 -0
  61. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js +29 -0
  62. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js.map +1 -0
  63. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs +27 -0
  64. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs.map +1 -0
  65. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts +18 -0
  66. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts.map +1 -0
  67. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js +137 -0
  68. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js.map +1 -0
  69. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs +131 -0
  70. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs.map +1 -0
  71. package/dist/services/session-manager.d.ts.map +1 -1
  72. package/dist/services/session-manager.js +5 -0
  73. package/dist/services/session-manager.js.map +1 -1
  74. package/dist/services/session-manager.mjs +5 -0
  75. package/dist/services/session-manager.mjs.map +1 -1
  76. package/package.json +19 -15
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-registry.mjs","sources":["../../../src/services/mcp/prompt-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredPrompt } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\n\n/**\n * Defines a Strapi MCP prompt with full type inference, ready to pass to\n * `strapi.ai.mcp.registerPrompt()`. Exposed publicly as `ai.mcp.definePrompt`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`/`argsSchema` and narrow the access variant (`devModeOnly` vs\n * `auth`) so the result is directly assignable to `registerPrompt`.\n *\n * @param prompt - The prompt definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const context = ai.mcp.definePrompt({\n * name: 'app-context',\n * title: 'App Context',\n * description: 'Provides context about the app',\n * devModeOnly: true,\n * createHandler: (strapi) => async () => ({\n * messages: [{ role: 'user', content: { type: 'text', text: 'You are connected to Strapi.' } }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerPrompt(context);\n * ```\n */\nexport const makeMcpPromptDefinition = ((definition: Modules.MCP.McpPromptDefinition) =>\n definition) as unknown as Modules.MCP.McpPromptBuilder;\n\nexport class McpPromptRegistry\n extends McpCapabilityRegistryBase<'prompt', Modules.MCP.McpPromptDefinition, RegisteredPrompt>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, argsSchema, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Prompt',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" failed to initialize: ${errorMessage}`,\n },\n },\n ],\n });\n },\n createErrorResult(error) {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" execution failed: ${error.message}`,\n },\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'prompt',\n name,\n definition.telemetry,\n safeHandler\n );\n\n return mcpServer.registerPrompt(\n name,\n {\n title,\n description,\n // @ts-expect-error - Internal handler type mismatch due to optional argsSchema\n argsSchema,\n },\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpPromptDefinition","definition","McpPromptRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","argsSchema","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","messages","role","content","type","text","createErrorResult","error","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerPrompt","ctx","definitions"],"mappings":";;;;AAAA;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BC,IACM,MAAMA,uBAAAA,GAA2B,CAACC,aACvCA;AAMA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AAJK,MAAMC,iBAAAA,SACHC,yBAAAA,CAAAA;AAaRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACN,UAAAA,GAAAA;YACd,MAAM,EAAEO,IAAI,EAAEC,KAAK,EAAEC,WAAW,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAGX,UAAAA;AAEhE,YAAA,OAAOY,gCAAAA,CAAiC;AACtCP,gBAAAA,MAAAA;gBACAQ,cAAAA,EAAgB,QAAA;AAChBN,gBAAAA,IAAAA;AACAI,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;AAChC,oBAAA,OAAO,WAAa;4BAClBC,QAAAA,EAAU;AACR,gCAAA;oCACEC,IAAAA,EAAM,MAAA;oCACNC,OAAAA,EAAS;wCACPC,IAAAA,EAAM,MAAA;AACNC,wCAAAA,IAAAA,EAAM,CAAC,QAAQ,EAAEb,IAAAA,CAAK,wBAAwB,EAAEQ,YAAAA,CAAAA;AAClD;AACF;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,iBAAAA,CAAAA,CAAkBC,KAAK,EAAA;oBACrB,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACEC,IAAAA,EAAM,MAAA;gCACNC,OAAAA,EAAS;oCACPC,IAAAA,EAAM,MAAA;oCACNC,IAAAA,EAAM,CAAC,QAAQ,EAAEb,IAAAA,CAAK,oBAAoB,EAAEe,KAAAA,CAAMC,OAAO,CAAA;AAC3D;AACF;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAC,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,aAAaC,+BAAAA,CACjBtB,MAAAA,EACA,UACAE,IAAAA,EACAP,UAAAA,CAAW4B,SAAS,EACpBH,WAAAA,CAAAA;oBAGF,OAAOrB,SAAAA,CAAUyB,cAAc,CAC7BtB,IAAAA,EACA;AACEC,wBAAAA,KAAAA;AACAC,wBAAAA,WAAAA;;AAEAC,wBAAAA;qBACF,EACAgB,UAAAA,CAAAA;AAEJ,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAnEA,IAAA,WAAA,CAAYI,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAIzB,MAAM;AAC3B,IAAA;AA8DF;;;;"}
1
+ {"version":3,"file":"prompt-registry.mjs","sources":["../../../src/services/mcp/prompt-registry.ts"],"sourcesContent":["import type { McpServer, RegisteredPrompt, ServerContext } from '@modelcontextprotocol/server';\nimport type { Core, Modules } from '@strapi/types';\n\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext';\nimport { toSdkPromptResult } from './utils/toSdkMcpCapabilityResult';\n\n/**\n * Defines a Strapi MCP prompt with full type inference, ready to pass to\n * `strapi.ai.mcp.registerPrompt()`. Exposed publicly as `ai.mcp.definePrompt`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`/`argsSchema` and narrow the access variant (`devModeOnly` vs\n * `auth`) so the result is directly assignable to `registerPrompt`.\n *\n * @param prompt - The prompt definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const context = ai.mcp.definePrompt({\n * name: 'app-context',\n * title: 'App Context',\n * description: 'Provides context about the app',\n * devModeOnly: true,\n * createHandler: (strapi) => async () => ({\n * messages: [{ role: 'user', content: { type: 'text', text: 'You are connected to Strapi.' } }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerPrompt(context);\n * ```\n */\nexport const makeMcpPromptDefinition = ((definition: Modules.MCP.McpPromptDefinition) =>\n definition) as unknown as Modules.MCP.McpPromptBuilder;\n\nexport class McpPromptRegistry\n extends McpCapabilityRegistryBase<'prompt', Modules.MCP.McpPromptDefinition, RegisteredPrompt>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'prompt', Modules.MCP.McpPromptDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, argsSchema, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Prompt',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" failed to initialize: ${errorMessage}`,\n },\n },\n ],\n });\n },\n createErrorResult(error) {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Prompt \"${name}\" execution failed: ${error.message}`,\n },\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n if (argsSchema === undefined) {\n const handler = safeHandler as unknown as Modules.MCP.McpPromptCallback<undefined>;\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'prompt',\n name,\n definition.telemetry,\n async (context: Modules.MCP.McpCapabilityHandlerContext) =>\n toSdkPromptResult(await handler(context))\n );\n\n return mcpServer.registerPrompt(\n name,\n { title, description },\n (argsOrContext: unknown, context?: ServerContext) => {\n // The SDK types omit the no-schema callback overload, but the runtime passes only\n // ServerContext when argsSchema is absent.\n const sdkContext = context ?? (argsOrContext as ServerContext);\n return sdkHandler(createMcpCapabilityHandlerContext(sdkContext));\n }\n );\n }\n\n const handler = safeHandler as unknown as Modules.MCP.McpPromptCallback<\n typeof argsSchema\n >;\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'prompt',\n name,\n definition.telemetry,\n async (\n args: Parameters<typeof handler>[0],\n context: Modules.MCP.McpCapabilityHandlerContext\n ) => toSdkPromptResult(await handler(args, context))\n );\n\n return mcpServer.registerPrompt(\n name,\n { title, description, argsSchema },\n (args, context) => sdkHandler(args, createMcpCapabilityHandlerContext(context))\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpPromptDefinition","definition","McpPromptRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","argsSchema","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","messages","role","content","type","text","createErrorResult","error","message","registerWithSdk","safeHandler","undefined","handler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","context","toSdkPromptResult","registerPrompt","argsOrContext","sdkContext","createMcpCapabilityHandlerContext","args","ctx","definitions"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { McpServer, RegisteredResource } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import type { McpServer, RegisteredResource } from '@modelcontextprotocol/server';
2
2
  import type { Core, Modules } from '@strapi/types';
3
3
  import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';
4
4
  import { type McpCapabilityRegistry, McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry';
@@ -1 +1 @@
1
- {"version":3,"file":"resource-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/resource-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,kBAAkB,EAEnB,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,KAAK,qBAAqB,EAC1B,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAI1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,yBAAyB,EACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAE3D,qBAAa,mBACX,SAAQ,yBAAyB,CAC/B,UAAU,EACV,OAAO,CAAC,GAAG,CAAC,qBAAqB,EACjC,kBAAkB,CAEpB,YAAW,qBAAqB;;gBAIpB,GAAG,EAAE;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;KAC7F;IAKD,IAAI,CAAC,SAAS,EAAE,SAAS;CA+C1B"}
1
+ {"version":3,"file":"resource-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/resource-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAiB,MAAM,8BAA8B,CAAC;AACjG,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,KAAK,qBAAqB,EAC1B,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAS1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,yBAAyB,EACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAE3D,qBAAa,mBACX,SAAQ,yBAAyB,CAC/B,UAAU,EACV,OAAO,CAAC,GAAG,CAAC,qBAAqB,EACjC,kBAAkB,CAEpB,YAAW,qBAAqB;;gBAIpB,GAAG,EAAE;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,+BAA+B,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;KAC7F;IAKD,IAAI,CAAC,SAAS,EAAE,SAAS;CAuD1B"}
@@ -3,6 +3,8 @@
3
3
  var McpCapabilityRegistry = require('./internal/McpCapabilityRegistry.js');
4
4
  var createSafeCapabilityRegistration = require('./utils/createSafeCapabilityRegistration.js');
5
5
  var wrapCapabilityHandlerForMetrics = require('./metrics/wrapCapabilityHandlerForMetrics.js');
6
+ var createMcpCapabilityHandlerContext = require('./utils/createMcpCapabilityHandlerContext.js');
7
+ var toSdkMcpCapabilityResult = require('./utils/toSdkMcpCapabilityResult.js');
6
8
 
7
9
  function _class_private_field_loose_base(receiver, privateKey) {
8
10
  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
@@ -78,8 +80,8 @@ class McpResourceRegistry extends McpCapabilityRegistry.McpCapabilityRegistryBas
78
80
  };
79
81
  },
80
82
  registerWithSdk (safeHandler) {
81
- const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'resource', name, definition.telemetry, safeHandler);
82
- return mcpServer.registerResource(name, uri, metadata, sdkHandler);
83
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'resource', name, definition.telemetry, async (uri, context)=>toSdkMcpCapabilityResult.toSdkResourceReadResult(await safeHandler(uri, createMcpCapabilityHandlerContext.createMcpCapabilityHandlerContext(context))));
84
+ return mcpServer.registerResource(name, uri, toSdkMcpCapabilityResult.toSdkResourceListingMetadata(metadata), sdkHandler);
83
85
  }
84
86
  });
85
87
  });
@@ -1 +1 @@
1
- {"version":3,"file":"resource-registry.js","sources":["../../../src/services/mcp/resource-registry.ts"],"sourcesContent":["import type {\n McpServer,\n RegisteredResource,\n // eslint-disable-next-line import/extensions\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\n\n/**\n * Defines a Strapi MCP resource with full type inference, ready to pass to\n * `strapi.ai.mcp.registerResource()`. Exposed publicly as `ai.mcp.defineResource`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name` and narrow the access variant (`devModeOnly` vs `auth`) so the\n * result is directly assignable to `registerResource`.\n *\n * @param resource - The resource definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const appInfo = ai.mcp.defineResource({\n * name: 'app-info',\n * uri: 'strapi://app/info',\n * metadata: { description: 'Metadata about the app', mimeType: 'application/json' },\n * devModeOnly: true,\n * createHandler: (strapi) => async (uri) => ({\n * contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify({ ok: true }) }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerResource(appInfo);\n * ```\n */\nexport const makeMcpResourceDefinition = ((definition: Modules.MCP.McpResourceDefinition) =>\n definition) as unknown as Modules.MCP.McpResourceBuilder;\n\nexport class McpResourceRegistry\n extends McpCapabilityRegistryBase<\n 'resource',\n Modules.MCP.McpResourceDefinition,\n RegisteredResource\n >\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, uri, metadata, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Resource',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async (resourceUri) => ({\n contents: [\n {\n uri: resourceUri.href,\n text: `Resource \"${name}\" failed to initialize: ${errorMessage}`,\n mimeType: 'text/plain',\n },\n ],\n });\n },\n createErrorResult(error, args) {\n return {\n contents: [\n {\n uri: args[0] instanceof URL ? args[0].href : uri,\n text: `Resource \"${name}\" execution failed: ${error.message}`,\n mimeType: 'text/plain',\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'resource',\n name,\n definition.telemetry,\n safeHandler\n );\n\n return mcpServer.registerResource(name, uri, metadata, sdkHandler);\n },\n });\n });\n }\n}\n"],"names":["makeMcpResourceDefinition","definition","McpResourceRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","uri","metadata","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","resourceUri","contents","href","text","mimeType","createErrorResult","error","args","URL","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerResource","ctx","definitions"],"mappings":";;;;;;;;;;;;;;;;AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BC,IACM,MAAMA,yBAAAA,GAA6B,CAACC,aACzCA;AAUA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AARK,MAAMC,mBAAAA,SACHC,+CAAAA,CAAAA;AAiBRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACN,UAAAA,GAAAA;YACd,MAAM,EAAEO,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGV,UAAAA;AAE/C,YAAA,OAAOW,iEAAAA,CAAiC;AACtCN,gBAAAA,MAAAA;gBACAO,cAAAA,EAAgB,UAAA;AAChBL,gBAAAA,IAAAA;AACAG,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;oBAChC,OAAO,OAAOC,eAAiB;4BAC7BC,QAAAA,EAAU;AACR,gCAAA;AACER,oCAAAA,GAAAA,EAAKO,YAAYE,IAAI;AACrBC,oCAAAA,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,wBAAwB,EAAEO,YAAAA,CAAAA,CAAc;oCAChEK,QAAAA,EAAU;AACZ;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;gBACAC,iBAAAA,CAAAA,CAAkBC,KAAK,EAAEC,IAAI,EAAA;oBAC3B,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACER,GAAAA,EAAKc,IAAI,CAAC,CAAA,CAAE,YAAYC,GAAAA,GAAMD,IAAI,CAAC,CAAA,CAAE,CAACL,IAAI,GAAGT,GAAAA;gCAC7CU,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,oBAAoB,EAAEc,KAAAA,CAAMG,OAAO,CAAA,CAAE;gCAC7DL,QAAAA,EAAU;AACZ;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,aAAaC,+DAAAA,CACjBvB,MAAAA,EACA,YACAE,IAAAA,EACAP,UAAAA,CAAW6B,SAAS,EACpBH,WAAAA,CAAAA;AAGF,oBAAA,OAAOtB,SAAAA,CAAU0B,gBAAgB,CAACvB,IAAAA,EAAMC,KAAKC,QAAAA,EAAUkB,UAAAA,CAAAA;AACzD,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAtDA,IAAA,WAAA,CAAYI,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAI1B,MAAM;AAC3B,IAAA;AAiDF;;;;;"}
1
+ {"version":3,"file":"resource-registry.js","sources":["../../../src/services/mcp/resource-registry.ts"],"sourcesContent":["import type { McpServer, RegisteredResource, ServerContext } from '@modelcontextprotocol/server';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext';\nimport {\n toSdkResourceListingMetadata,\n toSdkResourceReadResult,\n} from './utils/toSdkMcpCapabilityResult';\n\n/**\n * Defines a Strapi MCP resource with full type inference, ready to pass to\n * `strapi.ai.mcp.registerResource()`. Exposed publicly as `ai.mcp.defineResource`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name` and narrow the access variant (`devModeOnly` vs `auth`) so the\n * result is directly assignable to `registerResource`.\n *\n * @param resource - The resource definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const appInfo = ai.mcp.defineResource({\n * name: 'app-info',\n * uri: 'strapi://app/info',\n * metadata: { description: 'Metadata about the app', mimeType: 'application/json' },\n * devModeOnly: true,\n * createHandler: (strapi) => async (uri) => ({\n * contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify({ ok: true }) }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerResource(appInfo);\n * ```\n */\nexport const makeMcpResourceDefinition = ((definition: Modules.MCP.McpResourceDefinition) =>\n definition) as unknown as Modules.MCP.McpResourceBuilder;\n\nexport class McpResourceRegistry\n extends McpCapabilityRegistryBase<\n 'resource',\n Modules.MCP.McpResourceDefinition,\n RegisteredResource\n >\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, uri, metadata, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Resource',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async (resourceUri) => ({\n contents: [\n {\n uri: resourceUri.href,\n text: `Resource \"${name}\" failed to initialize: ${errorMessage}`,\n mimeType: 'text/plain',\n },\n ],\n });\n },\n createErrorResult(error, args) {\n return {\n contents: [\n {\n uri: args[0] instanceof URL ? args[0].href : uri,\n text: `Resource \"${name}\" execution failed: ${error.message}`,\n mimeType: 'text/plain',\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'resource',\n name,\n definition.telemetry,\n async (uri: URL, context: ServerContext) =>\n toSdkResourceReadResult(\n await safeHandler(uri, createMcpCapabilityHandlerContext(context))\n )\n );\n\n return mcpServer.registerResource(\n name,\n uri,\n toSdkResourceListingMetadata(metadata),\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpResourceDefinition","definition","McpResourceRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","uri","metadata","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","resourceUri","contents","href","text","mimeType","createErrorResult","error","args","URL","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","context","toSdkResourceReadResult","createMcpCapabilityHandlerContext","registerResource","toSdkResourceListingMetadata","ctx","definitions"],"mappings":";;;;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BC,IACM,MAAMA,yBAAAA,GAA6B,CAACC,aACzCA;AAUA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AARK,MAAMC,mBAAAA,SACHC,+CAAAA,CAAAA;AAiBRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACN,UAAAA,GAAAA;YACd,MAAM,EAAEO,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGV,UAAAA;AAE/C,YAAA,OAAOW,iEAAAA,CAAiC;AACtCN,gBAAAA,MAAAA;gBACAO,cAAAA,EAAgB,UAAA;AAChBL,gBAAAA,IAAAA;AACAG,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;oBAChC,OAAO,OAAOC,eAAiB;4BAC7BC,QAAAA,EAAU;AACR,gCAAA;AACER,oCAAAA,GAAAA,EAAKO,YAAYE,IAAI;AACrBC,oCAAAA,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,wBAAwB,EAAEO,YAAAA,CAAAA,CAAc;oCAChEK,QAAAA,EAAU;AACZ;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;gBACAC,iBAAAA,CAAAA,CAAkBC,KAAK,EAAEC,IAAI,EAAA;oBAC3B,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACER,GAAAA,EAAKc,IAAI,CAAC,CAAA,CAAE,YAAYC,GAAAA,GAAMD,IAAI,CAAC,CAAA,CAAE,CAACL,IAAI,GAAGT,GAAAA;gCAC7CU,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,oBAAoB,EAAEc,KAAAA,CAAMG,OAAO,CAAA,CAAE;gCAC7DL,QAAAA,EAAU;AACZ;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,UAAAA,GAAaC,+DAAAA,CACjBvB,MAAAA,EACA,UAAA,EACAE,MACAP,UAAAA,CAAW6B,SAAS,EACpB,OAAOrB,KAAUsB,OAAAA,GACfC,gDAAAA,CACE,MAAML,WAAAA,CAAYlB,KAAKwB,mEAAAA,CAAkCF,OAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAI/D,oBAAA,OAAO1B,UAAU6B,gBAAgB,CAC/B1B,IAAAA,EACAC,GAAAA,EACA0B,sDAA6BzB,QAAAA,CAAAA,EAC7BkB,UAAAA,CAAAA;AAEJ,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AA9DA,IAAA,WAAA,CAAYQ,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAI9B,MAAM;AAC3B,IAAA;AAyDF;;;;;"}
@@ -1,6 +1,8 @@
1
1
  import { McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry.mjs';
2
2
  import { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration.mjs';
3
3
  import { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics.mjs';
4
+ import { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext.mjs';
5
+ import { toSdkResourceListingMetadata, toSdkResourceReadResult } from './utils/toSdkMcpCapabilityResult.mjs';
4
6
 
5
7
  function _class_private_field_loose_base(receiver, privateKey) {
6
8
  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
@@ -76,8 +78,8 @@ class McpResourceRegistry extends McpCapabilityRegistryBase {
76
78
  };
77
79
  },
78
80
  registerWithSdk (safeHandler) {
79
- const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'resource', name, definition.telemetry, safeHandler);
80
- return mcpServer.registerResource(name, uri, metadata, sdkHandler);
81
+ const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'resource', name, definition.telemetry, async (uri, context)=>toSdkResourceReadResult(await safeHandler(uri, createMcpCapabilityHandlerContext(context))));
82
+ return mcpServer.registerResource(name, uri, toSdkResourceListingMetadata(metadata), sdkHandler);
81
83
  }
82
84
  });
83
85
  });
@@ -1 +1 @@
1
- {"version":3,"file":"resource-registry.mjs","sources":["../../../src/services/mcp/resource-registry.ts"],"sourcesContent":["import type {\n McpServer,\n RegisteredResource,\n // eslint-disable-next-line import/extensions\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\n\n/**\n * Defines a Strapi MCP resource with full type inference, ready to pass to\n * `strapi.ai.mcp.registerResource()`. Exposed publicly as `ai.mcp.defineResource`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name` and narrow the access variant (`devModeOnly` vs `auth`) so the\n * result is directly assignable to `registerResource`.\n *\n * @param resource - The resource definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const appInfo = ai.mcp.defineResource({\n * name: 'app-info',\n * uri: 'strapi://app/info',\n * metadata: { description: 'Metadata about the app', mimeType: 'application/json' },\n * devModeOnly: true,\n * createHandler: (strapi) => async (uri) => ({\n * contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify({ ok: true }) }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerResource(appInfo);\n * ```\n */\nexport const makeMcpResourceDefinition = ((definition: Modules.MCP.McpResourceDefinition) =>\n definition) as unknown as Modules.MCP.McpResourceBuilder;\n\nexport class McpResourceRegistry\n extends McpCapabilityRegistryBase<\n 'resource',\n Modules.MCP.McpResourceDefinition,\n RegisteredResource\n >\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, uri, metadata, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Resource',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async (resourceUri) => ({\n contents: [\n {\n uri: resourceUri.href,\n text: `Resource \"${name}\" failed to initialize: ${errorMessage}`,\n mimeType: 'text/plain',\n },\n ],\n });\n },\n createErrorResult(error, args) {\n return {\n contents: [\n {\n uri: args[0] instanceof URL ? args[0].href : uri,\n text: `Resource \"${name}\" execution failed: ${error.message}`,\n mimeType: 'text/plain',\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'resource',\n name,\n definition.telemetry,\n safeHandler\n );\n\n return mcpServer.registerResource(name, uri, metadata, sdkHandler);\n },\n });\n });\n }\n}\n"],"names":["makeMcpResourceDefinition","definition","McpResourceRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","uri","metadata","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","resourceUri","contents","href","text","mimeType","createErrorResult","error","args","URL","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerResource","ctx","definitions"],"mappings":";;;;;;;;;;;;;;AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BC,IACM,MAAMA,yBAAAA,GAA6B,CAACC,aACzCA;AAUA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AARK,MAAMC,mBAAAA,SACHC,yBAAAA,CAAAA;AAiBRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACN,UAAAA,GAAAA;YACd,MAAM,EAAEO,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGV,UAAAA;AAE/C,YAAA,OAAOW,gCAAAA,CAAiC;AACtCN,gBAAAA,MAAAA;gBACAO,cAAAA,EAAgB,UAAA;AAChBL,gBAAAA,IAAAA;AACAG,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;oBAChC,OAAO,OAAOC,eAAiB;4BAC7BC,QAAAA,EAAU;AACR,gCAAA;AACER,oCAAAA,GAAAA,EAAKO,YAAYE,IAAI;AACrBC,oCAAAA,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,wBAAwB,EAAEO,YAAAA,CAAAA,CAAc;oCAChEK,QAAAA,EAAU;AACZ;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;gBACAC,iBAAAA,CAAAA,CAAkBC,KAAK,EAAEC,IAAI,EAAA;oBAC3B,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACER,GAAAA,EAAKc,IAAI,CAAC,CAAA,CAAE,YAAYC,GAAAA,GAAMD,IAAI,CAAC,CAAA,CAAE,CAACL,IAAI,GAAGT,GAAAA;gCAC7CU,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,oBAAoB,EAAEc,KAAAA,CAAMG,OAAO,CAAA,CAAE;gCAC7DL,QAAAA,EAAU;AACZ;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,aAAaC,+BAAAA,CACjBvB,MAAAA,EACA,YACAE,IAAAA,EACAP,UAAAA,CAAW6B,SAAS,EACpBH,WAAAA,CAAAA;AAGF,oBAAA,OAAOtB,SAAAA,CAAU0B,gBAAgB,CAACvB,IAAAA,EAAMC,KAAKC,QAAAA,EAAUkB,UAAAA,CAAAA;AACzD,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAtDA,IAAA,WAAA,CAAYI,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAI1B,MAAM;AAC3B,IAAA;AAiDF;;;;"}
1
+ {"version":3,"file":"resource-registry.mjs","sources":["../../../src/services/mcp/resource-registry.ts"],"sourcesContent":["import type { McpServer, RegisteredResource, ServerContext } from '@modelcontextprotocol/server';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext';\nimport {\n toSdkResourceListingMetadata,\n toSdkResourceReadResult,\n} from './utils/toSdkMcpCapabilityResult';\n\n/**\n * Defines a Strapi MCP resource with full type inference, ready to pass to\n * `strapi.ai.mcp.registerResource()`. Exposed publicly as `ai.mcp.defineResource`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name` and narrow the access variant (`devModeOnly` vs `auth`) so the\n * result is directly assignable to `registerResource`.\n *\n * @param resource - The resource definition. Provide either `devModeOnly: true`\n * (dev-only, no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n *\n * const appInfo = ai.mcp.defineResource({\n * name: 'app-info',\n * uri: 'strapi://app/info',\n * metadata: { description: 'Metadata about the app', mimeType: 'application/json' },\n * devModeOnly: true,\n * createHandler: (strapi) => async (uri) => ({\n * contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify({ ok: true }) }],\n * }),\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerResource(appInfo);\n * ```\n */\nexport const makeMcpResourceDefinition = ((definition: Modules.MCP.McpResourceDefinition) =>\n definition) as unknown as Modules.MCP.McpResourceBuilder;\n\nexport class McpResourceRegistry\n extends McpCapabilityRegistryBase<\n 'resource',\n Modules.MCP.McpResourceDefinition,\n RegisteredResource\n >\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'resource', Modules.MCP.McpResourceDefinition>;\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, uri, metadata, createHandler } = definition;\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Resource',\n name,\n createHandler,\n createFallbackHandler(errorMessage) {\n return async (resourceUri) => ({\n contents: [\n {\n uri: resourceUri.href,\n text: `Resource \"${name}\" failed to initialize: ${errorMessage}`,\n mimeType: 'text/plain',\n },\n ],\n });\n },\n createErrorResult(error, args) {\n return {\n contents: [\n {\n uri: args[0] instanceof URL ? args[0].href : uri,\n text: `Resource \"${name}\" execution failed: ${error.message}`,\n mimeType: 'text/plain',\n },\n ],\n };\n },\n registerWithSdk(safeHandler) {\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'resource',\n name,\n definition.telemetry,\n async (uri: URL, context: ServerContext) =>\n toSdkResourceReadResult(\n await safeHandler(uri, createMcpCapabilityHandlerContext(context))\n )\n );\n\n return mcpServer.registerResource(\n name,\n uri,\n toSdkResourceListingMetadata(metadata),\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpResourceDefinition","definition","McpResourceRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","uri","metadata","createHandler","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","resourceUri","contents","href","text","mimeType","createErrorResult","error","args","URL","message","registerWithSdk","safeHandler","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","context","toSdkResourceReadResult","createMcpCapabilityHandlerContext","registerResource","toSdkResourceListingMetadata","ctx","definitions"],"mappings":";;;;;;;;;;;;;;;;AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BC,IACM,MAAMA,yBAAAA,GAA6B,CAACC,aACzCA;AAUA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA;AARK,MAAMC,mBAAAA,SACHC,yBAAAA,CAAAA;AAiBRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACN,UAAAA,GAAAA;YACd,MAAM,EAAEO,IAAI,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGV,UAAAA;AAE/C,YAAA,OAAOW,gCAAAA,CAAiC;AACtCN,gBAAAA,MAAAA;gBACAO,cAAAA,EAAgB,UAAA;AAChBL,gBAAAA,IAAAA;AACAG,gBAAAA,aAAAA;AACAG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;oBAChC,OAAO,OAAOC,eAAiB;4BAC7BC,QAAAA,EAAU;AACR,gCAAA;AACER,oCAAAA,GAAAA,EAAKO,YAAYE,IAAI;AACrBC,oCAAAA,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,wBAAwB,EAAEO,YAAAA,CAAAA,CAAc;oCAChEK,QAAAA,EAAU;AACZ;AACD;yBACH,CAAA;AACF,gBAAA,CAAA;gBACAC,iBAAAA,CAAAA,CAAkBC,KAAK,EAAEC,IAAI,EAAA;oBAC3B,OAAO;wBACLN,QAAAA,EAAU;AACR,4BAAA;gCACER,GAAAA,EAAKc,IAAI,CAAC,CAAA,CAAE,YAAYC,GAAAA,GAAMD,IAAI,CAAC,CAAA,CAAE,CAACL,IAAI,GAAGT,GAAAA;gCAC7CU,IAAAA,EAAM,CAAC,UAAU,EAAEX,IAAAA,CAAK,oBAAoB,EAAEc,KAAAA,CAAMG,OAAO,CAAA,CAAE;gCAC7DL,QAAAA,EAAU;AACZ;AACD;AACH,qBAAA;AACF,gBAAA,CAAA;AACAM,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,UAAAA,GAAaC,+BAAAA,CACjBvB,MAAAA,EACA,UAAA,EACAE,MACAP,UAAAA,CAAW6B,SAAS,EACpB,OAAOrB,KAAUsB,OAAAA,GACfC,uBAAAA,CACE,MAAML,WAAAA,CAAYlB,KAAKwB,iCAAAA,CAAkCF,OAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAI/D,oBAAA,OAAO1B,UAAU6B,gBAAgB,CAC/B1B,IAAAA,EACAC,GAAAA,EACA0B,6BAA6BzB,QAAAA,CAAAA,EAC7BkB,UAAAA,CAAAA;AAEJ,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AA9DA,IAAA,WAAA,CAAYQ,GAGX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EANvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;;AAOE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAI9B,MAAM;AAC3B,IAAA;AAyDF;;;;"}
@@ -1,4 +1,4 @@
1
- import type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';
1
+ import type { McpServer, RegisteredTool } from '@modelcontextprotocol/server';
2
2
  import type { Core, Modules } from '@strapi/types';
3
3
  import { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';
4
4
  import { type McpCapabilityRegistry, McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry';
@@ -1 +1 @@
1
- {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/tool-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzF,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,KAAK,qBAAqB,EAC1B,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,qBAAqB,EACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAEvD,qBAAa,eACX,SAAQ,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CACvF,YAAW,qBAAqB;;gBAQpB,GAAG,EAAE;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpF,OAAO,EAAE,oBAAoB,CAAC;QAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;KAC7C;IAOD,IAAI,CAAC,SAAS,EAAE,SAAS;CAwE1B"}
1
+ {"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../../src/services/mcp/tool-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAC7F,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,+BAA+B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EACL,KAAK,qBAAqB,EAC1B,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAK1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,qBAAqB,EACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAEvD,qBAAa,eACX,SAAQ,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,cAAc,CACvF,YAAW,qBAAqB;;gBAQpB,GAAG,EAAE;QACf,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,+BAA+B,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpF,OAAO,EAAE,oBAAoB,CAAC;QAC9B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;KAC7C;IAOD,IAAI,CAAC,SAAS,EAAE,SAAS;CAwF1B"}
@@ -3,8 +3,9 @@
3
3
  var McpCapabilityRegistry = require('./internal/McpCapabilityRegistry.js');
4
4
  var wrapCapabilityHandlerForMetrics = require('./metrics/wrapCapabilityHandlerForMetrics.js');
5
5
  var createSafeCapabilityRegistration = require('./utils/createSafeCapabilityRegistration.js');
6
+ var createMcpCapabilityHandlerContext = require('./utils/createMcpCapabilityHandlerContext.js');
7
+ var toSdkMcpCapabilityResult = require('./utils/toSdkMcpCapabilityResult.js');
6
8
 
7
- // eslint-disable-next-line import/extensions
8
9
  function _class_private_field_loose_base(receiver, privateKey) {
9
10
  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
10
11
  throw new TypeError("attempted to use private field on non-instance");
@@ -93,19 +94,25 @@ class McpToolRegistry extends McpCapabilityRegistry.McpCapabilityRegistryBase {
93
94
  registerWithSdk (safeHandler) {
94
95
  const inputSchema = resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;
95
96
  const outputSchema = resolveOutputSchema(context);
96
- // Adapt from our object-literal handler `({ args, extra })` to
97
- // the MCP SDK's positional form `(args, extra)` / `(extra)`.
98
- const baseHandler = inputSchema !== undefined ? (args, extra)=>safeHandler({
99
- args,
100
- extra
101
- }) : (extra)=>safeHandler({
102
- extra
103
- });
104
- const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, baseHandler);
97
+ if (inputSchema !== undefined) {
98
+ // Adapt from Strapi's object parameter to the SDK's positional callback.
99
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, async (args, context)=>toSdkMcpCapabilityResult.toSdkToolResult(await safeHandler({
100
+ args,
101
+ extra: createMcpCapabilityHandlerContext.createMcpCapabilityHandlerContext(context)
102
+ })));
103
+ return mcpServer.registerTool(name, {
104
+ title,
105
+ description,
106
+ inputSchema,
107
+ outputSchema
108
+ }, sdkHandler);
109
+ }
110
+ const sdkHandler = wrapCapabilityHandlerForMetrics.wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, async (context)=>toSdkMcpCapabilityResult.toSdkToolResult(await safeHandler({
111
+ extra: createMcpCapabilityHandlerContext.createMcpCapabilityHandlerContext(context)
112
+ })));
105
113
  return mcpServer.registerTool(name, {
106
114
  title,
107
115
  description,
108
- inputSchema,
109
116
  outputSchema
110
117
  }, sdkHandler);
111
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-registry.js","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport type { McpAdminTokenAbility } from './authentication';\n\n/**\n * Defines a Strapi MCP tool with full type inference, ready to pass to\n * `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`, input/output schemas and handler types, and to narrow the\n * access variant (`devModeOnly` vs `auth`) so the result is directly assignable\n * to `registerTool`.\n *\n * @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,\n * no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n * import { z } from '@strapi/utils';\n *\n * const greet = ai.mcp.defineTool({\n * name: 'greet',\n * title: 'Greet',\n * description: 'Greets a user by name',\n * devModeOnly: true,\n * resolveInputSchema: () => z.object({ name: z.string() }),\n * resolveOutputSchema: () => z.object({ message: z.string() }),\n * createHandler: (strapi) => async ({ args }) => {\n * const message = `Hello, ${args.name}!`;\n * return { content: [{ type: 'text', text: message }], structuredContent: { message } };\n * },\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerTool(greet);\n * ```\n */\nexport const makeMcpToolDefinition = ((definition: Modules.MCP.McpToolDefinition) =>\n definition) as unknown as Modules.MCP.McpToolBuilder;\n\nexport class McpToolRegistry\n extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n #ability: McpAdminTokenAbility;\n\n #user: Modules.MCP.McpHandlerContext['user'];\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n this.#ability = ctx.ability;\n this.#user = ctx.user;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } =\n definition;\n\n // Bind the session ability and token owner into the handler context so handlers can enforce\n // field-level and entity-level permission checks and set creator fields.\n const context: Modules.MCP.McpHandlerContext = {\n userAbility: this.#ability,\n user: this.#user,\n };\n const createHandlerWithContext = (strapi: Core.Strapi) => createHandler(strapi, context);\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Tool',\n name,\n createHandler: createHandlerWithContext,\n createFallbackHandler(errorMessage) {\n return async () => ({\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" failed to initialize: ${errorMessage}`,\n },\n ],\n isError: true,\n });\n },\n createErrorResult(error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" execution failed: ${error.message}`,\n },\n ],\n isError: true,\n };\n },\n registerWithSdk(safeHandler) {\n const inputSchema =\n resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;\n const outputSchema = resolveOutputSchema(context);\n\n // Adapt from our object-literal handler `({ args, extra })` to\n // the MCP SDK's positional form `(args, extra)` / `(extra)`.\n const baseHandler =\n inputSchema !== undefined\n ? (args: unknown, extra: unknown) =>\n safeHandler({ args, extra } as Parameters<typeof safeHandler>[0])\n : (extra: unknown) => safeHandler({ extra } as Parameters<typeof safeHandler>[0]);\n\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n baseHandler\n );\n\n return mcpServer.registerTool(\n name,\n { title, description, inputSchema, outputSchema },\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpToolDefinition","definition","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","resolveInputSchema","resolveOutputSchema","createHandler","context","userAbility","user","createHandlerWithContext","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","content","type","text","isError","createErrorResult","error","message","registerWithSdk","safeHandler","inputSchema","undefined","outputSchema","baseHandler","args","extra","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerTool","ctx","definitions","ability"],"mappings":"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"}
1
+ {"version":3,"file":"tool-registry.js","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["import type { McpServer, RegisteredTool, ServerContext } from '@modelcontextprotocol/server';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext';\nimport { toSdkToolResult } from './utils/toSdkMcpCapabilityResult';\nimport type { McpAdminTokenAbility } from './authentication';\n\n/**\n * Defines a Strapi MCP tool with full type inference, ready to pass to\n * `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`, input/output schemas and handler types, and to narrow the\n * access variant (`devModeOnly` vs `auth`) so the result is directly assignable\n * to `registerTool`.\n *\n * @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,\n * no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n * import { z } from '@strapi/utils';\n *\n * const greet = ai.mcp.defineTool({\n * name: 'greet',\n * title: 'Greet',\n * description: 'Greets a user by name',\n * devModeOnly: true,\n * resolveInputSchema: () => z.object({ name: z.string() }),\n * resolveOutputSchema: () => z.object({ message: z.string() }),\n * createHandler: (strapi) => async ({ args }) => {\n * const message = `Hello, ${args.name}!`;\n * return { content: [{ type: 'text', text: message }], structuredContent: { message } };\n * },\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerTool(greet);\n * ```\n */\nexport const makeMcpToolDefinition = ((definition: Modules.MCP.McpToolDefinition) =>\n definition) as unknown as Modules.MCP.McpToolBuilder;\n\nexport class McpToolRegistry\n extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n #ability: McpAdminTokenAbility;\n\n #user: Modules.MCP.McpHandlerContext['user'];\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n this.#ability = ctx.ability;\n this.#user = ctx.user;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } =\n definition;\n\n // Bind the session ability and token owner into the handler context so handlers can enforce\n // field-level and entity-level permission checks and set creator fields.\n const context: Modules.MCP.McpHandlerContext = {\n userAbility: this.#ability,\n user: this.#user,\n };\n const createHandlerWithContext = (strapi: Core.Strapi) => createHandler(strapi, context);\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Tool',\n name,\n createHandler: createHandlerWithContext,\n createFallbackHandler(errorMessage) {\n return async () => ({\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" failed to initialize: ${errorMessage}`,\n },\n ],\n isError: true,\n });\n },\n createErrorResult(error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" execution failed: ${error.message}`,\n },\n ],\n isError: true,\n };\n },\n registerWithSdk(safeHandler) {\n const inputSchema =\n resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;\n const outputSchema = resolveOutputSchema(context);\n\n if (inputSchema !== undefined) {\n // Adapt from Strapi's object parameter to the SDK's positional callback.\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n async (args: unknown, context: ServerContext) =>\n toSdkToolResult(\n await safeHandler({\n args,\n extra: createMcpCapabilityHandlerContext(context),\n } as Parameters<typeof safeHandler>[0])\n )\n );\n\n return mcpServer.registerTool(\n name,\n { title, description, inputSchema, outputSchema },\n sdkHandler\n );\n }\n\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n async (context: ServerContext) =>\n toSdkToolResult(\n await safeHandler({\n extra: createMcpCapabilityHandlerContext(context),\n } as Parameters<typeof safeHandler>[0])\n )\n );\n\n return mcpServer.registerTool(name, { title, description, outputSchema }, sdkHandler);\n },\n });\n });\n }\n}\n"],"names":["makeMcpToolDefinition","definition","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","resolveInputSchema","resolveOutputSchema","createHandler","context","userAbility","user","createHandlerWithContext","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","content","type","text","isError","createErrorResult","error","message","registerWithSdk","safeHandler","inputSchema","undefined","outputSchema","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","args","toSdkToolResult","extra","createMcpCapabilityHandlerContext","registerTool","ctx","definitions","ability"],"mappings":";;;;;;;;;;;;;;;;;;AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCC,IACM,MAAMA,qBAAAA,GAAyB,CAACC,aACrCA;AAMA,IAAA,OAAA,iBAAA,8BAAA,CAAA,SAAA,CAAA,EAEA,QAAA,iBAAA,8BAAA,CAAA,UAAA,CAAA,EAEA,KAAA,iBAAA,8BAAA,CAAA,OAAA,CAAA;AARK,MAAMC,eAAAA,SACHC,+CAAAA,CAAAA;AAqBRC,IAAAA,IAAAA,CAAKC,SAAoB,EAAE;AACzB,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA;QAEpB,KAAK,CAACC,SAAS,CAACN,UAAAA,GAAAA;AACd,YAAA,MAAM,EAAEO,IAAI,EAAEC,KAAK,EAAEC,WAAW,EAAEC,kBAAkB,EAAEC,mBAAmB,EAAEC,aAAa,EAAE,GACxFZ,UAAAA;;;AAIF,YAAA,MAAMa,OAAAA,GAAyC;AAC7CC,gBAAAA,WAAW,EAAE,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA;AAClBC,gBAAAA,IAAI,EAAE,+BAAA,CAAA,IAAI,EAAC,KAAA,CAAA,CAAA,KAAA;AACb,aAAA;AACA,YAAA,MAAMC,wBAAAA,GAA2B,CAACX,MAAAA,GAAwBO,aAAAA,CAAcP,MAAAA,EAAQQ,OAAAA,CAAAA;AAEhF,YAAA,OAAOI,iEAAAA,CAAiC;AACtCZ,gBAAAA,MAAAA;gBACAa,cAAAA,EAAgB,MAAA;AAChBX,gBAAAA,IAAAA;gBACAK,aAAAA,EAAeI,wBAAAA;AACfG,gBAAAA,qBAAAA,CAAAA,CAAsBC,YAAY,EAAA;AAChC,oBAAA,OAAO,WAAa;4BAClBC,OAAAA,EAAS;AACP,gCAAA;oCACEC,IAAAA,EAAM,MAAA;AACNC,oCAAAA,IAAAA,EAAM,CAAC,MAAM,EAAEhB,IAAAA,CAAK,wBAAwB,EAAEa,YAAAA,CAAAA;AAChD;AACD,6BAAA;4BACDI,OAAAA,EAAS;yBACX,CAAA;AACF,gBAAA,CAAA;AACAC,gBAAAA,iBAAAA,CAAAA,CAAkBC,KAAK,EAAA;oBACrB,OAAO;wBACLL,OAAAA,EAAS;AACP,4BAAA;gCACEC,IAAAA,EAAM,MAAA;gCACNC,IAAAA,EAAM,CAAC,MAAM,EAAEhB,IAAAA,CAAK,oBAAoB,EAAEmB,KAAAA,CAAMC,OAAO,CAAA;AACzD;AACD,yBAAA;wBACDH,OAAAA,EAAS;AACX,qBAAA;AACF,gBAAA,CAAA;AACAI,gBAAAA,eAAAA,CAAAA,CAAgBC,WAAW,EAAA;AACzB,oBAAA,MAAMC,WAAAA,GACJpB,kBAAAA,KAAuBqB,SAAAA,GAAYrB,kBAAAA,CAAmBG,OAAAA,CAAAA,GAAWkB,SAAAA;AACnE,oBAAA,MAAMC,eAAerB,mBAAAA,CAAoBE,OAAAA,CAAAA;AAEzC,oBAAA,IAAIiB,gBAAgBC,SAAAA,EAAW;;AAE7B,wBAAA,MAAME,UAAAA,GAAaC,+DAAAA,CACjB7B,MAAAA,EACA,MAAA,EACAE,IAAAA,EACAP,UAAAA,CAAWmC,SAAS,EACpB,OAAOC,IAAAA,EAAevB,OAAAA,GACpBwB,wCAAAA,CACE,MAAMR,WAAAA,CAAY;AAChBO,gCAAAA,IAAAA;AACAE,gCAAAA,KAAAA,EAAOC,mEAAAA,CAAkC1B,OAAAA;AAC3C,6BAAA,CAAA,CAAA,CAAA;wBAIN,OAAOT,SAAAA,CAAUoC,YAAY,CAC3BjC,IAAAA,EACA;AAAEC,4BAAAA,KAAAA;AAAOC,4BAAAA,WAAAA;AAAaqB,4BAAAA,WAAAA;AAAaE,4BAAAA;yBAAa,EAChDC,UAAAA,CAAAA;AAEJ,oBAAA;AAEA,oBAAA,MAAMA,UAAAA,GAAaC,+DAAAA,CACjB7B,MAAAA,EACA,MAAA,EACAE,IAAAA,EACAP,UAAAA,CAAWmC,SAAS,EACpB,OAAOtB,OAAAA,GACLwB,wCAAAA,CACE,MAAMR,WAAAA,CAAY;AAChBS,4BAAAA,KAAAA,EAAOC,mEAAAA,CAAkC1B,OAAAA;AAC3C,yBAAA,CAAA,CAAA,CAAA;oBAIN,OAAOT,SAAAA,CAAUoC,YAAY,CAACjC,IAAAA,EAAM;AAAEC,wBAAAA,KAAAA;AAAOC,wBAAAA,WAAAA;AAAauB,wBAAAA;qBAAa,EAAGC,UAAAA,CAAAA;AAC5E,gBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA;AAnGA,IAAA,WAAA,CAAYQ,GAKX,CAAE;AACD,QAAA,KAAK,CAACA,GAAAA,CAAIC,WAAW,CAAA,EAZvB,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,OAAA,EAAA;;mBAAA;YAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,QAAA,EAAA;;mBAAA;YAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,KAAA,EAAA;;mBAAA;;AASE,QAAA,+BAAA,CAAA,IAAI,EAAC,OAAA,CAAA,CAAA,OAAA,CAAA,GAAUD,IAAIpC,MAAM;AACzB,QAAA,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,GAAWoC,IAAIE,OAAO;AAC3B,QAAA,+BAAA,CAAA,IAAI,EAAC,KAAA,CAAA,CAAA,KAAA,CAAA,GAAQF,IAAI1B,IAAI;AACvB,IAAA;AA0FF;;;;;"}
@@ -1,8 +1,9 @@
1
1
  import { McpCapabilityRegistryBase } from './internal/McpCapabilityRegistry.mjs';
2
2
  import { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics.mjs';
3
3
  import { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration.mjs';
4
+ import { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext.mjs';
5
+ import { toSdkToolResult } from './utils/toSdkMcpCapabilityResult.mjs';
4
6
 
5
- // eslint-disable-next-line import/extensions
6
7
  function _class_private_field_loose_base(receiver, privateKey) {
7
8
  if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
8
9
  throw new TypeError("attempted to use private field on non-instance");
@@ -91,19 +92,25 @@ class McpToolRegistry extends McpCapabilityRegistryBase {
91
92
  registerWithSdk (safeHandler) {
92
93
  const inputSchema = resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;
93
94
  const outputSchema = resolveOutputSchema(context);
94
- // Adapt from our object-literal handler `({ args, extra })` to
95
- // the MCP SDK's positional form `(args, extra)` / `(extra)`.
96
- const baseHandler = inputSchema !== undefined ? (args, extra)=>safeHandler({
97
- args,
98
- extra
99
- }) : (extra)=>safeHandler({
100
- extra
101
- });
102
- const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, baseHandler);
95
+ if (inputSchema !== undefined) {
96
+ // Adapt from Strapi's object parameter to the SDK's positional callback.
97
+ const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, async (args, context)=>toSdkToolResult(await safeHandler({
98
+ args,
99
+ extra: createMcpCapabilityHandlerContext(context)
100
+ })));
101
+ return mcpServer.registerTool(name, {
102
+ title,
103
+ description,
104
+ inputSchema,
105
+ outputSchema
106
+ }, sdkHandler);
107
+ }
108
+ const sdkHandler = wrapCapabilityHandlerForMetrics(strapi, 'tool', name, definition.telemetry, async (context)=>toSdkToolResult(await safeHandler({
109
+ extra: createMcpCapabilityHandlerContext(context)
110
+ })));
103
111
  return mcpServer.registerTool(name, {
104
112
  title,
105
113
  description,
106
- inputSchema,
107
114
  outputSchema
108
115
  }, sdkHandler);
109
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-registry.mjs","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["// eslint-disable-next-line import/extensions\nimport type { McpServer, RegisteredTool } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport type { McpAdminTokenAbility } from './authentication';\n\n/**\n * Defines a Strapi MCP tool with full type inference, ready to pass to\n * `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`, input/output schemas and handler types, and to narrow the\n * access variant (`devModeOnly` vs `auth`) so the result is directly assignable\n * to `registerTool`.\n *\n * @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,\n * no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n * import { z } from '@strapi/utils';\n *\n * const greet = ai.mcp.defineTool({\n * name: 'greet',\n * title: 'Greet',\n * description: 'Greets a user by name',\n * devModeOnly: true,\n * resolveInputSchema: () => z.object({ name: z.string() }),\n * resolveOutputSchema: () => z.object({ message: z.string() }),\n * createHandler: (strapi) => async ({ args }) => {\n * const message = `Hello, ${args.name}!`;\n * return { content: [{ type: 'text', text: message }], structuredContent: { message } };\n * },\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerTool(greet);\n * ```\n */\nexport const makeMcpToolDefinition = ((definition: Modules.MCP.McpToolDefinition) =>\n definition) as unknown as Modules.MCP.McpToolBuilder;\n\nexport class McpToolRegistry\n extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n #ability: McpAdminTokenAbility;\n\n #user: Modules.MCP.McpHandlerContext['user'];\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n this.#ability = ctx.ability;\n this.#user = ctx.user;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } =\n definition;\n\n // Bind the session ability and token owner into the handler context so handlers can enforce\n // field-level and entity-level permission checks and set creator fields.\n const context: Modules.MCP.McpHandlerContext = {\n userAbility: this.#ability,\n user: this.#user,\n };\n const createHandlerWithContext = (strapi: Core.Strapi) => createHandler(strapi, context);\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Tool',\n name,\n createHandler: createHandlerWithContext,\n createFallbackHandler(errorMessage) {\n return async () => ({\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" failed to initialize: ${errorMessage}`,\n },\n ],\n isError: true,\n });\n },\n createErrorResult(error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" execution failed: ${error.message}`,\n },\n ],\n isError: true,\n };\n },\n registerWithSdk(safeHandler) {\n const inputSchema =\n resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;\n const outputSchema = resolveOutputSchema(context);\n\n // Adapt from our object-literal handler `({ args, extra })` to\n // the MCP SDK's positional form `(args, extra)` / `(extra)`.\n const baseHandler =\n inputSchema !== undefined\n ? (args: unknown, extra: unknown) =>\n safeHandler({ args, extra } as Parameters<typeof safeHandler>[0])\n : (extra: unknown) => safeHandler({ extra } as Parameters<typeof safeHandler>[0]);\n\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n baseHandler\n );\n\n return mcpServer.registerTool(\n name,\n { title, description, inputSchema, outputSchema },\n sdkHandler\n );\n },\n });\n });\n }\n}\n"],"names":["makeMcpToolDefinition","definition","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","resolveInputSchema","resolveOutputSchema","createHandler","context","userAbility","user","createHandlerWithContext","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","content","type","text","isError","createErrorResult","error","message","registerWithSdk","safeHandler","inputSchema","undefined","outputSchema","baseHandler","args","extra","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","registerTool","ctx","definitions","ability"],"mappings":"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"}
1
+ {"version":3,"file":"tool-registry.mjs","sources":["../../../src/services/mcp/tool-registry.ts"],"sourcesContent":["import type { McpServer, RegisteredTool, ServerContext } from '@modelcontextprotocol/server';\nimport type { Core, Modules } from '@strapi/types';\nimport { McpCapabilityDefinitionRegistry } from './internal/McpCapabilityDefinitionRegistry';\nimport {\n type McpCapabilityRegistry,\n McpCapabilityRegistryBase,\n} from './internal/McpCapabilityRegistry';\nimport { wrapCapabilityHandlerForMetrics } from './metrics/wrapCapabilityHandlerForMetrics';\nimport { createSafeCapabilityRegistration } from './utils/createSafeCapabilityRegistration';\nimport { createMcpCapabilityHandlerContext } from './utils/createMcpCapabilityHandlerContext';\nimport { toSdkToolResult } from './utils/toSdkMcpCapabilityResult';\nimport type { McpAdminTokenAbility } from './authentication';\n\n/**\n * Defines a Strapi MCP tool with full type inference, ready to pass to\n * `strapi.ai.mcp.registerTool()`. Exposed publicly as `ai.mcp.defineTool`.\n *\n * The returned value is the definition unchanged — this builder only exists to\n * infer the `name`, input/output schemas and handler types, and to narrow the\n * access variant (`devModeOnly` vs `auth`) so the result is directly assignable\n * to `registerTool`.\n *\n * @param tool - The tool definition. Provide either `devModeOnly: true` (dev-only,\n * no auth) or an `auth` policy set — never both.\n * @returns The same definition, with its access variant narrowed.\n *\n * @example\n * ```ts\n * import { ai } from '@strapi/strapi';\n * import { z } from '@strapi/utils';\n *\n * const greet = ai.mcp.defineTool({\n * name: 'greet',\n * title: 'Greet',\n * description: 'Greets a user by name',\n * devModeOnly: true,\n * resolveInputSchema: () => z.object({ name: z.string() }),\n * resolveOutputSchema: () => z.object({ message: z.string() }),\n * createHandler: (strapi) => async ({ args }) => {\n * const message = `Hello, ${args.name}!`;\n * return { content: [{ type: 'text', text: message }], structuredContent: { message } };\n * },\n * });\n *\n * // later, in register() or bootstrap():\n * strapi.ai.mcp.registerTool(greet);\n * ```\n */\nexport const makeMcpToolDefinition = ((definition: Modules.MCP.McpToolDefinition) =>\n definition) as unknown as Modules.MCP.McpToolBuilder;\n\nexport class McpToolRegistry\n extends McpCapabilityRegistryBase<'tool', Modules.MCP.McpToolDefinition, RegisteredTool>\n implements McpCapabilityRegistry\n{\n #strapi: Core.Strapi;\n\n #ability: McpAdminTokenAbility;\n\n #user: Modules.MCP.McpHandlerContext['user'];\n\n constructor(ctx: {\n strapi: Core.Strapi;\n definitions: McpCapabilityDefinitionRegistry<'tool', Modules.MCP.McpToolDefinition>;\n ability: McpAdminTokenAbility;\n user: Modules.MCP.McpHandlerContext['user'];\n }) {\n super(ctx.definitions);\n this.#strapi = ctx.strapi;\n this.#ability = ctx.ability;\n this.#user = ctx.user;\n }\n\n bind(mcpServer: McpServer) {\n const strapi = this.#strapi;\n\n super.register((definition) => {\n const { name, title, description, resolveInputSchema, resolveOutputSchema, createHandler } =\n definition;\n\n // Bind the session ability and token owner into the handler context so handlers can enforce\n // field-level and entity-level permission checks and set creator fields.\n const context: Modules.MCP.McpHandlerContext = {\n userAbility: this.#ability,\n user: this.#user,\n };\n const createHandlerWithContext = (strapi: Core.Strapi) => createHandler(strapi, context);\n\n return createSafeCapabilityRegistration({\n strapi,\n capabilityType: 'Tool',\n name,\n createHandler: createHandlerWithContext,\n createFallbackHandler(errorMessage) {\n return async () => ({\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" failed to initialize: ${errorMessage}`,\n },\n ],\n isError: true,\n });\n },\n createErrorResult(error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Tool \"${name}\" execution failed: ${error.message}`,\n },\n ],\n isError: true,\n };\n },\n registerWithSdk(safeHandler) {\n const inputSchema =\n resolveInputSchema !== undefined ? resolveInputSchema(context) : undefined;\n const outputSchema = resolveOutputSchema(context);\n\n if (inputSchema !== undefined) {\n // Adapt from Strapi's object parameter to the SDK's positional callback.\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n async (args: unknown, context: ServerContext) =>\n toSdkToolResult(\n await safeHandler({\n args,\n extra: createMcpCapabilityHandlerContext(context),\n } as Parameters<typeof safeHandler>[0])\n )\n );\n\n return mcpServer.registerTool(\n name,\n { title, description, inputSchema, outputSchema },\n sdkHandler\n );\n }\n\n const sdkHandler = wrapCapabilityHandlerForMetrics(\n strapi,\n 'tool',\n name,\n definition.telemetry,\n async (context: ServerContext) =>\n toSdkToolResult(\n await safeHandler({\n extra: createMcpCapabilityHandlerContext(context),\n } as Parameters<typeof safeHandler>[0])\n )\n );\n\n return mcpServer.registerTool(name, { title, description, outputSchema }, sdkHandler);\n },\n });\n });\n }\n}\n"],"names":["makeMcpToolDefinition","definition","McpToolRegistry","McpCapabilityRegistryBase","bind","mcpServer","strapi","register","name","title","description","resolveInputSchema","resolveOutputSchema","createHandler","context","userAbility","user","createHandlerWithContext","createSafeCapabilityRegistration","capabilityType","createFallbackHandler","errorMessage","content","type","text","isError","createErrorResult","error","message","registerWithSdk","safeHandler","inputSchema","undefined","outputSchema","sdkHandler","wrapCapabilityHandlerForMetrics","telemetry","args","toSdkToolResult","extra","createMcpCapabilityHandlerContext","registerTool","ctx","definitions","ability"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ServerContext } from '@modelcontextprotocol/server';
2
+ import type { Modules } from '@strapi/types';
3
+ /**
4
+ * Translates the MCP SDK's request context into Strapi's public handler context.
5
+ */
6
+ export declare const createMcpCapabilityHandlerContext: (context: ServerContext) => Modules.MCP.McpCapabilityHandlerContext;
7
+ //# sourceMappingURL=createMcpCapabilityHandlerContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMcpCapabilityHandlerContext.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/createMcpCapabilityHandlerContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,iCAAiC,GAC5C,SAAS,aAAa,KACrB,OAAO,CAAC,GAAG,CAAC,2BA6Bd,CAAC"}
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Translates the MCP SDK's request context into Strapi's public handler context.
5
+ */ const createMcpCapabilityHandlerContext = (context)=>{
6
+ const { _meta, envelope } = context.mcpReq;
7
+ const request = context.http?.req;
8
+ const headers = {};
9
+ request?.headers.forEach((value, key)=>{
10
+ headers[key] = value;
11
+ });
12
+ return {
13
+ signal: context.mcpReq.signal,
14
+ requestId: context.mcpReq.id,
15
+ sessionId: context.sessionId,
16
+ authInfo: context.http?.authInfo,
17
+ _meta: _meta === undefined && envelope === undefined ? undefined : {
18
+ ..._meta,
19
+ ...envelope
20
+ },
21
+ requestInfo: request === undefined ? undefined : {
22
+ headers,
23
+ url: new URL(request.url)
24
+ }
25
+ };
26
+ };
27
+
28
+ exports.createMcpCapabilityHandlerContext = createMcpCapabilityHandlerContext;
29
+ //# sourceMappingURL=createMcpCapabilityHandlerContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMcpCapabilityHandlerContext.js","sources":["../../../../src/services/mcp/utils/createMcpCapabilityHandlerContext.ts"],"sourcesContent":["import type { ServerContext } from '@modelcontextprotocol/server';\nimport type { Modules } from '@strapi/types';\n\n/**\n * Translates the MCP SDK's request context into Strapi's public handler context.\n */\nexport const createMcpCapabilityHandlerContext = (\n context: ServerContext\n): Modules.MCP.McpCapabilityHandlerContext => {\n const { _meta, envelope } = context.mcpReq;\n const request = context.http?.req;\n const headers: Record<string, string | string[] | undefined> = {};\n\n request?.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n signal: context.mcpReq.signal,\n requestId: context.mcpReq.id,\n sessionId: context.sessionId,\n authInfo: context.http?.authInfo,\n _meta:\n _meta === undefined && envelope === undefined\n ? undefined\n : {\n ..._meta,\n ...envelope,\n },\n requestInfo:\n request === undefined\n ? undefined\n : {\n headers,\n url: new URL(request.url),\n },\n };\n};\n"],"names":["createMcpCapabilityHandlerContext","context","_meta","envelope","mcpReq","request","http","req","headers","forEach","value","key","signal","requestId","id","sessionId","authInfo","undefined","requestInfo","url","URL"],"mappings":";;AAGA;;IAGO,MAAMA,iCAAAA,GAAoC,CAC/CC,OAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGF,QAAQG,MAAM;IAC1C,MAAMC,OAAAA,GAAUJ,OAAAA,CAAQK,IAAI,EAAEC,GAAAA;AAC9B,IAAA,MAAMC,UAAyD,EAAC;IAEhEH,OAAAA,EAASG,OAAAA,CAAQC,OAAAA,CAAQ,CAACC,KAAAA,EAAOC,GAAAA,GAAAA;QAC/BH,OAAO,CAACG,IAAI,GAAGD,KAAAA;AACjB,IAAA,CAAA,CAAA;IAEA,OAAO;QACLE,MAAAA,EAAQX,OAAAA,CAAQG,MAAM,CAACQ,MAAM;QAC7BC,SAAAA,EAAWZ,OAAAA,CAAQG,MAAM,CAACU,EAAE;AAC5BC,QAAAA,SAAAA,EAAWd,QAAQc,SAAS;QAC5BC,QAAAA,EAAUf,OAAAA,CAAQK,IAAI,EAAEU,QAAAA;AACxBd,QAAAA,KAAAA,EACEA,KAAAA,KAAUe,SAAAA,IAAad,QAAAA,KAAac,SAAAA,GAChCA,SAAAA,GACA;AACE,YAAA,GAAGf,KAAK;AACR,YAAA,GAAGC;AACL,SAAA;QACNe,WAAAA,EACEb,OAAAA,KAAYY,YACRA,SAAAA,GACA;AACET,YAAAA,OAAAA;YACAW,GAAAA,EAAK,IAAIC,GAAAA,CAAIf,OAAAA,CAAQc,GAAG;AAC1B;AACR,KAAA;AACF;;;;"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Translates the MCP SDK's request context into Strapi's public handler context.
3
+ */ const createMcpCapabilityHandlerContext = (context)=>{
4
+ const { _meta, envelope } = context.mcpReq;
5
+ const request = context.http?.req;
6
+ const headers = {};
7
+ request?.headers.forEach((value, key)=>{
8
+ headers[key] = value;
9
+ });
10
+ return {
11
+ signal: context.mcpReq.signal,
12
+ requestId: context.mcpReq.id,
13
+ sessionId: context.sessionId,
14
+ authInfo: context.http?.authInfo,
15
+ _meta: _meta === undefined && envelope === undefined ? undefined : {
16
+ ..._meta,
17
+ ...envelope
18
+ },
19
+ requestInfo: request === undefined ? undefined : {
20
+ headers,
21
+ url: new URL(request.url)
22
+ }
23
+ };
24
+ };
25
+
26
+ export { createMcpCapabilityHandlerContext };
27
+ //# sourceMappingURL=createMcpCapabilityHandlerContext.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createMcpCapabilityHandlerContext.mjs","sources":["../../../../src/services/mcp/utils/createMcpCapabilityHandlerContext.ts"],"sourcesContent":["import type { ServerContext } from '@modelcontextprotocol/server';\nimport type { Modules } from '@strapi/types';\n\n/**\n * Translates the MCP SDK's request context into Strapi's public handler context.\n */\nexport const createMcpCapabilityHandlerContext = (\n context: ServerContext\n): Modules.MCP.McpCapabilityHandlerContext => {\n const { _meta, envelope } = context.mcpReq;\n const request = context.http?.req;\n const headers: Record<string, string | string[] | undefined> = {};\n\n request?.headers.forEach((value, key) => {\n headers[key] = value;\n });\n\n return {\n signal: context.mcpReq.signal,\n requestId: context.mcpReq.id,\n sessionId: context.sessionId,\n authInfo: context.http?.authInfo,\n _meta:\n _meta === undefined && envelope === undefined\n ? undefined\n : {\n ..._meta,\n ...envelope,\n },\n requestInfo:\n request === undefined\n ? undefined\n : {\n headers,\n url: new URL(request.url),\n },\n };\n};\n"],"names":["createMcpCapabilityHandlerContext","context","_meta","envelope","mcpReq","request","http","req","headers","forEach","value","key","signal","requestId","id","sessionId","authInfo","undefined","requestInfo","url","URL"],"mappings":"AAGA;;IAGO,MAAMA,iCAAAA,GAAoC,CAC/CC,OAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGF,QAAQG,MAAM;IAC1C,MAAMC,OAAAA,GAAUJ,OAAAA,CAAQK,IAAI,EAAEC,GAAAA;AAC9B,IAAA,MAAMC,UAAyD,EAAC;IAEhEH,OAAAA,EAASG,OAAAA,CAAQC,OAAAA,CAAQ,CAACC,KAAAA,EAAOC,GAAAA,GAAAA;QAC/BH,OAAO,CAACG,IAAI,GAAGD,KAAAA;AACjB,IAAA,CAAA,CAAA;IAEA,OAAO;QACLE,MAAAA,EAAQX,OAAAA,CAAQG,MAAM,CAACQ,MAAM;QAC7BC,SAAAA,EAAWZ,OAAAA,CAAQG,MAAM,CAACU,EAAE;AAC5BC,QAAAA,SAAAA,EAAWd,QAAQc,SAAS;QAC5BC,QAAAA,EAAUf,OAAAA,CAAQK,IAAI,EAAEU,QAAAA;AACxBd,QAAAA,KAAAA,EACEA,KAAAA,KAAUe,SAAAA,IAAad,QAAAA,KAAac,SAAAA,GAChCA,SAAAA,GACA;AACE,YAAA,GAAGf,KAAK;AACR,YAAA,GAAGC;AACL,SAAA;QACNe,WAAAA,EACEb,OAAAA,KAAYY,YACRA,SAAAA,GACA;AACET,YAAAA,OAAAA;YACAW,GAAAA,EAAK,IAAIC,GAAAA,CAAIf,OAAAA,CAAQc,GAAG;AAC1B;AACR,KAAA;AACF;;;;"}
@@ -0,0 +1,18 @@
1
+ import type { CallToolResult, ContentBlock, GetPromptResult, ReadResourceResult, ResourceMetadata } from '@modelcontextprotocol/server';
2
+ import type { Modules } from '@strapi/types';
3
+ /**
4
+ * Maps one Strapi-owned content block onto the protocol shape the SDK transports.
5
+ *
6
+ * Every variant Strapi accepts is translated explicitly, so removing or renaming a
7
+ * variant upstream fails this boundary at compile time instead of reaching authors.
8
+ */
9
+ export declare const toSdkContentBlock: (content: Modules.MCP.McpContentBlock) => ContentBlock;
10
+ /** Maps a Strapi-owned tool result onto the protocol shape the SDK transports. */
11
+ export declare const toSdkToolResult: (result: Modules.MCP.McpToolResult) => CallToolResult;
12
+ /** Maps a Strapi-owned prompt result onto the protocol shape the SDK transports. */
13
+ export declare const toSdkPromptResult: (result: Modules.MCP.McpPromptResult) => GetPromptResult;
14
+ /** Maps a Strapi-owned resource read result onto the protocol shape the SDK transports. */
15
+ export declare const toSdkResourceReadResult: (result: Modules.MCP.McpResourceReadResult) => ReadResourceResult;
16
+ /** Maps Strapi-owned resource listing metadata onto the shape the SDK advertises. */
17
+ export declare const toSdkResourceListingMetadata: (metadata: Modules.MCP.McpResourceListingMetadata) => ResourceMetadata;
18
+ //# sourceMappingURL=toSdkMcpCapabilityResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toSdkMcpCapabilityResult.d.ts","sourceRoot":"","sources":["../../../../src/services/mcp/utils/toSdkMcpCapabilityResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAwB7C;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,OAAO,CAAC,GAAG,CAAC,eAAe,KAAG,YA4BxE,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,eAAe,GAAI,QAAQ,OAAO,CAAC,GAAG,CAAC,aAAa,KAAG,cAIlE,CAAC;AAEH,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,KAAG,eAYvE,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,uBAAuB,GAClC,QAAQ,OAAO,CAAC,GAAG,CAAC,qBAAqB,KACxC,kBAQF,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,4BAA4B,GACvC,UAAU,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAC/C,gBAIF,CAAC"}